c# NPOI 如何在指定单元格导入导出图片

1. 导入图片到指定单元格

1.1 准备工作

在开始之前,我们需要先安装C# NPOI库。可以通过NuGet包管理器或者在Visual Studio中直接搜索NPOI进行安装。

接下来,我们需要导入以下命名空间:

using NPOI.SS.UserModel;

using NPOI.XSSF.UserModel;

using NPOI.Util;

using System.IO;

using System.Drawing;

1.2 创建工作簿和工作表

首先,我们需要创建一个工作簿和一个工作表:

IWorkbook workbook = new XSSFWorkbook();

ISheet sheet = workbook.CreateSheet("Sheet1");

1.3 导入图片到指定单元格

接下来的步骤是将图片导入到指定的单元格中。首先,我们需要将图片文件加载到一个Image对象中:

string imagePath = "path/to/image.jpg";

Image image = Image.FromFile(imagePath);

然后,我们需要将Image对象转换为字节数组,以便将其插入到单元格中:

byte[] imageBytes;

using (MemoryStream ms = new MemoryStream())

{

image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

imageBytes = ms.ToArray();

}

接下来,我们可以创建一个HSSFClientAnchor对象,指定图片的位置与大小。对于XSSFWorkbook,我们使用XSSFClientAnchor对象:

XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, columnIndex, rowIndex, columnIndex + 1, rowIndex + 1);

然后,我们可以创建一个HSSFPicture对象,并在指定的单元格中插入图片:

IDrawing patriarch = sheet.CreateDrawingPatriarch();

var pictureIndex = workbook.AddPicture(imageBytes, PictureType.JPEG);

var picture = patriarch.CreatePicture(anchor, pictureIndex);

最后,我们可以设置图片的缩放比例:

picture.Resize();

注意:在Excel中,单元格的大小是固定的,并且不能自动调整以适应插入的图片。因此,请确保单元格足够大以容纳整个图片。

2. 从指定单元格导出图片

2.1 获取图片并保存到文件

要从一个指定的单元格导出图片,我们首先需要找到该单元格中插入的图片,并将其保存到文件中。

IDrawing patriarch = sheet.DrawingPatriarch;

var pictures = (patriarch as XSSFDrawing)?.GetCTDrawing().pic;

if (pictures != null)

{

foreach (var picture in pictures)

{

XSSFClientAnchor anchor = (picture as NPOI.OpenXmlFormats.Dml.Spreadsheet.CT_TwoCellAnchor)?.from as XSSFClientAnchor;

if (anchor != null && anchor.Col1 == columnIndex && anchor.Row1 == rowIndex)

{

XSSFPictureData pictureData = workbook.GetAllPictures()[(int)picture.blipFill.blip.embed.Value];

string outputPath = "path/to/output/image.jpg";

using (FileStream output = new FileStream(outputPath, FileMode.Create))

{

output.Write(pictureData.Data, 0, pictureData.Data.Length);

}

}

}

}

在上面的代码中,我们首先获取绘图对象和所有的图片。然后,我们遍历每个图片,找到与指定单元格匹配的图片,并获取其数据。最后,我们将数据写入输出文件中。

2.2 将图片导出为Image对象

如果我们希望将图片导出为一个Image对象,可以使用以下代码:

using (MemoryStream stream = new MemoryStream(pictureData.Data))

{

Image image = Image.FromStream(stream);

}

在上面的代码中,我们将图片数据包装到一个MemoryStream中,并使用Image.FromStream方法创建一个Image对象。

现在,我们已经学会了如何在C# NPOI中导入和导出图片到指定的单元格。希望这篇文章能对你有所帮助!

后端开发标签