单元格中的 Excel 图像

Posted

技术标签:

【中文标题】单元格中的 Excel 图像【英文标题】:Excel image in a cell 【发布时间】:2011-11-16 19:20:54 【问题描述】:

如何将图像(图像类型)插入 Excel 工作表中的特定单元格

taperSheet = (Microsoft.Office.Interop.Excel.Worksheet)excelSheets.get_Item("Taper");

Microsoft.Office.Interop.Excel.Range cell = GetMyPictureCELL(taperSheet);

Image myImage = new Image();
RenderTargetBitmap bmp;

bmp = new RenderTargetBitmap((int)this.Width, (int)this.Height, 96, 96, PixelFormats.Pbgra32);
bmp.Render(myViewPort);

myImage.Source = bmp;
myImage.Stretch = Stretch.Uniform;

现在呢? 我希望

cell.Add(myImage)

但我认为这并不容易。

/斯蒂芬

感谢您的意见,doitgood

以下代码对我有用

在我的情况下,我的图像源是一个视口 (myViewPort) 图片的位置由cell决定

try

    Image myImage = new Image();
    RenderTargetBitmap bmp;
    PngBitmapEncoder encoder;
    string fileName;
    System.IO.Stream stream;
    object missing = System.Reflection.Missing.Value; 
    Microsoft.Office.Interop.Excel.Picture pic = null;
    Microsoft.Office.Interop.Excel.Pictures p = null;

    bmp = new RenderTargetBitmap((int)this.Width, (int)this.Height, 96, 96, PixelFormats.Pbgra32);
    bmp.Render(myViewPort);

    myImage.Source = bmp;
    myImage.Stretch = Stretch.Uniform;

    fileName = System.IO.Path.GetTempFileName();
    stream = System.IO.File.OpenWrite(fileName);

    encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(bmp));
    encoder.Save(stream);
    stream.Close();

    p = taperSheet.Pictures(missing) as Microsoft.Office.Interop.Excel.Pictures; 
    pic = p.Insert(fileName, missing); 
    pic.Left = cell.Left;
    pic.Top = cell.Top;


catch  

【问题讨论】:

【参考方案1】:

试试这个:

object missing = System.Reflection.Missing.Value;
Excel.Range picPosition = GetPicturePosition(); // retrieve the range for picture insert
Excel.Pictures p = yourWorksheet.Pictures(missing) as Excel.Pictures;
Excel.Picture pic = null;
pic = p.Insert(yourImageFilePath, missing);
pic.Left = Convert.ToDouble(picPosition .Left);
pic.Top = Convert.ToDouble(picPosition .Top);
pic.Placement = // Can be any of Excel.XlPlacement.XYZ value

别忘了释放所有这些东西!

【讨论】:

不能直接将图片“发送”到 Excel,是否必须“越过”文件系统? 我更新了我的答案以允许将图像放置在 Excel.Range 中。对于插入不是来自文件系统的图片,我将进行一些测试并在相关时提供结果。注意:该代码尚未在每种情况下都经过测试...您还可以查看这篇建议使用 Worksheet.Shapes.AddPicture 而不是 WorkSheet.Pictures ***.com/questions/521979/… 的帖子 据我所知,除了文件系统之外,无法插入图片,但是如果您想购买第三方组件,Aspose 和 Synfusion 都在做您需要的事情,而无需正在安装 Excel。 如果我能回答这个问题,我会给你 100 分。它使我解决了使用 .COM 版本使用 Interop 将图像放入 Excel 的一个多月老问题。它在开发方面工作得很好,但由于服务器没有安装 Office,所以会在现场发生爆炸。通过这项工作,一切正常!【参考方案2】:

或者试试这个:

private void PlacePicture(Image picture, Range destination)

    Worksheet ws = destination.Worksheet;
    Clipboard.SetImage(picture);
    ws.Paste(destination, false);
    Pictures p = ws.Pictures(System.Reflection.Missing.Value) as Pictures;
    Picture pic = p.Item(p.Count) as Picture;
    ScalePicture(pic, (double)destination.Width, (double)destination.Height);


private void ScalePicture(Picture pic, double width, double height)

    double fX = width / pic.Width;
    double fY = height / pic.Height;
    double oldH = pic.Height;
    if (fX < fY)
    
        pic.Width *= fX;
        if (pic.Height == oldH) // no change if aspect ratio is locked
            pic.Height *= fX;
        pic.Top += (height - pic.Height) / 2;
    
    else
    
        pic.Width *= fY;
        if (pic.Height == oldH) // no change if aspect ratio is locked
            pic.Height *= fY;
        pic.Left += (width - pic.Width) / 2;
    

【讨论】:

谢谢,Jürgen,这对我有用,如此处所述:***.com/questions/35899391/…

以上是关于单元格中的 Excel 图像的主要内容,如果未能解决你的问题,请参考以下文章

Excel 图像参考

怎样提取excel单元格中的部分数字

excel 如何引用非空单元格中的数据到指定单元格中

excel表格怎么提取单元格中的部分内容

如何让excel单元格中的内容全部显示出来

EXCEL中,如何引用一个单元格中的数据,作为另一个单元格内容中的一部分?