使用NPOI将图片插入Excel文件

4
我正在使用C#编写Visual Studio 2010程序,并使用NPOI库。我试图向Excel文件中插入图片。我尝试了两种不同的方法,但都没有成功。
//Method 1

HSSFPatriarch patriarch = newSheet.CreateDrawingPatriarch() as HSSFPatriarch;
HSSFClientAnchor anchor;
var memoryStream = new MemoryStream();
System.Drawing.Image image = System.Drawing.Image.FromFile("image.jpeg");
image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Gif);
anchor = new HSSFClientAnchor(0, 0, 255, 255, 0, 0, 0, 0);
anchor.AnchorType = 2; //types are 0, 2, and 3. 0 resizes within the cell, 2 doesn't
int index = newWorkbook.AddPicture(memoryStream.ToArray(), PictureType.JPEG);
HSSFPicture signaturePicture = patriarch.CreatePicture(anchor, index) as HSSFPicture; //ERROR

使用方法1编译时,捕获了一个异常。错误信息是对象引用未设置为对象的实例,并且该错误发生在代码的最后一行。

//Method 2

byte[] data = File.ReadAllBytes("image.jpeg");
int picInd = newWorkbook.AddPicture(data, XSSFWorkbook.PICTURE_TYPE_JPEG);
XSSFCreationHelper helper = newWorkbook.GetCreationHelper() as XSSFCreationHelper;
XSSFDrawing drawing = newSheet.CreateDrawingPatriarch() as XSSFDrawing;
XSSFClientAnchor anchor = helper.CreateClientAnchor() as XSSFClientAnchor;
anchor.Col1 = 0;
anchor.Row1 = 0;
XSSFPicture pict = drawing.CreatePicture(anchor, picInd) as XSSFPicture;

方法2编译和运行没有问题。但是当我尝试打开创建的Excel文件时,收到一条消息:“Excel在'output.xlsx'中发现无法读取的内容。您要恢复此工作簿的内容吗?”我恢复了工作簿,但仍然没有显示任何图像。
插入图像后的下一步是在同一工作簿中克隆表格。使用方法2,克隆表格根本没有被创建,我不确定这是否会在修复图像问题后得到解决。
请问有人可以帮我解决这个问题吗?我想知道如何使其中任何一种方法正常工作,或者是否有其他方法可以将图像插入Excel文件中。
另外,请注意,我正在使用XSSFWorkbookXSSFSheet等(而不是HSSF),我的输出文件是.xlsx
感谢任何帮助/建议!

你第一个方法的错误意味着 patriarchanchorindex 是空的。 - Liam McInroy
@OutlawLemur,我添加了一些测试打印并发现祖先为空。我在第一行创建了祖先,如何修复它为空? - sora0419
你需要强制转换为 as HSSFPatriach 吗?该方法已经返回了该类型。 - Liam McInroy
1个回答

2
您的 Method-2 是正确的。但是您需要在最后一行添加 pict.Resize();
byte[] data = File.ReadAllBytes("image.jpeg");
int picInd = newWorkbook.AddPicture(data, XSSFWorkbook.PICTURE_TYPE_JPEG);
XSSFCreationHelper helper = newWorkbook.GetCreationHelper() as XSSFCreationHelper;
XSSFDrawing drawing = newSheet.CreateDrawingPatriarch() as XSSFDrawing;
XSSFClientAnchor anchor = helper.CreateClientAnchor() as XSSFClientAnchor;
anchor.Col1 = 0;
anchor.Row1 = 0;
XSSFPicture pict = drawing.CreatePicture(anchor, picInd) as XSSFPicture;
pict.Resize();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接