使用NPOI向Excel单元格中插入图片

使用NPOI向Excel单元格中插入图片

目标

需要向Excel中的某一列插入图片,每行的图片大小一致。
此方法仅适用于使用NPOIxlsx文件中的指定单元格插入图片。

代码

以下示例将向Excel的第二行第一列写入文本信息,第二行第二列插入一张图片,并调整图片所在单元格大小与图片匹配。

using System;
using System.IO;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;

namespace ExcelImg
{
    class Program
    {
        static void Main(string[] args)
        {
            // Excel和图片放在程序根目录
            string exlPath = "TestExcel.xlsx";
            string newPath = "NewExcel.xlsx";
            string imgPath = "TestImg.jpg";
            // 图片宽高
            int imgWid = 477;
            int imgHgt = 266;

            // 打开Excel
            IWorkbook excel = default;
            ISheet sheet = default;
            using (FileStream fs = new FileStream(exlPath, FileMode.Open, FileAccess.Read))
            {
                excel = WorkbookFactory.Create(fs);
                // 获取第一个表格
                sheet = excel.GetSheetAt(0);
                // 获取第二行,第一行是标题
                IRow row = sheet.CreateRow(1);
                // 为第一列设置文本
                row.CreateCell(0).SetCellValue("测试标题");
                // 设置行高和列宽
                sheet.SetColumnWidth(1, imgWid * 32);   // Excel的宽将1个像素分为32份
                row.Height = (short)(imgHgt * 16);      // Excel的高将1个像素分为16份

                // 添加图片
                // 1.以字节数组的形式读取图片
                byte[] buffer = GetImageBuffer(imgPath);
                // 2.向Excel添加图片,获取到图片索引
                int picIdx = excel.AddPicture(buffer, PictureType.JPEG);
                // 3.构建Excel图像
                var drawing = sheet.CreateDrawingPatriarch();
                // 4.确定图像的位置
                // new XSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, int col1, int row1, int col2, int row2)
                // 前四个参数是单元格内的偏移量,这里需要填满整个单元格所以不设置。
                // col1,row1表示图片的左上角在哪个单元格的左上角;col2,row2表示图片的右下角在哪个单元格的左上角
                XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, 1, 1, 2, 2);
                // 5.将图片设置到上面的位置中
                drawing.CreatePicture(anchor, picIdx);
            }
            using (FileStream newFile = new FileStream(newPath, FileMode.Create, FileAccess.Write))
            {
                excel.Write(newFile);
            }
            excel?.Close();
        }

        private static byte[] GetImageBuffer(string path)
        {
            return File.ReadAllBytes(path);
        }
    }
}

运行效果如下图所示
在这里插入图片描述
在此记录注意点

  1. NPOI的行高将1个像素分为16份,即设置值应该等于图片像素高*16
  2. NPOI的列宽将1个像素分为32分,即设置值应该等于图片像素宽*32
  3. 确定图像位置时

XSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, int col1, int row1, int col2, int row2)

前四个参数是单元格内的偏移量:
dx1、dy1是图片的左上角在起始单元格中的偏移。dx2、dy2是图片的右下角在结束单元格中的偏移。详情可参考以下文章
HSSFClientAnchor 参数说明
后四个参数是设置图片的起始单元格和结束单元格:
因为我需要在一个单元格中显示图片,所以图片的起始单元格和结束单元格这里只跨越了一个单元格。
在这里插入图片描述

  1. 若需要写入大量图片时可以采用分批次写入,例如每次写入50张图片保存后重新打开继续写入,以保证中途关闭时仍能保留部分数据。

参考文章

HSSFClientAnchor 参数说明
XSSFClientAnchor Dx,Dy参数无效
XSSFClientAnchor文档

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 C# 使用 NPOI 插入图片Excel 单元格,你可以按照以下步骤操作: 1. 加载 Excel 文件并创建工作簿和工作表对象: ```csharp FileStream fs = new FileStream("test.xlsx", FileMode.Open, FileAccess.ReadWrite); IWorkbook workbook = new XSSFWorkbook(fs); //或者 new HSSFWorkbook(fs) ISheet sheet = workbook.GetSheetAt(0); ``` 2. 创建图片对象并设置其属性: ```csharp byte[] imgBytes = File.ReadAllBytes("image.png"); int pictureIdx = workbook.AddPicture(imgBytes, PictureType.PNG); XSSFDrawing drawing = (XSSFDrawing)sheet.CreateDrawingPatriarch(); XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, 1, 1, 2, 3); XSSFPicture picture = (XSSFPicture)drawing.CreatePicture(anchor, pictureIdx); ``` 其,`XSSFDrawing` 和 `XSSFClientAnchor` 是 NPOI 的类,用于设置图片在 Excel 的位置和大小。`anchor` 的参数依次为:起始列号、起始行号、结束列号、结束行号、起始列偏移量、起始行偏移量、结束列偏移量、结束行偏移量。 3. 将图片插入到单元格: ```csharp IRow row = sheet.GetRow(0); ICell cell = row.CreateCell(0); cell.SetCellValue("图片插入Excel"); anchor.SetAnchorType(2); picture.Anchor = anchor; ``` 需要注意的是,插入图片单元格必须为空。如果单元格不为空,可以先将单元格的值清空,再插入图片。 4. 保存 Excel 文件: ```csharp fs.Close(); FileStream outFs = new FileStream("test.xlsx", FileMode.Create); workbook.Write(outFs); outFs.Close(); ``` 这样就可以在 Excel 单元格插入图片了。需要注意的是,NPOI 只支持插入 PNG 和 JPEG 格式的图片。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值