C#的NPOI操作Eexcel模板信息(填入数据及插入图片)

该文章介绍了如何使用NPOI库读取Excel模板并填充静态及动态数据,包括设置单元格格式、合并单元格以及导入基于base64的图片至Excel。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@[TOC]NPOI操作已经有了参考

指路参考博客
参考博客

流程梳理

首先是对于自己模板excel的导入,因为有整体格式要求较高的excel,所以先制成模板,再向里面填充数据。

 IWorkbook hssfworkbookDown = null;
 //读取导入模板
 var templatePath = FileVariable.SystemFilePath + "xxxx.xlsx";
 using(FileStream file = new FileStream(templatePath, FileMode.Open, FileAccess.Read))
 {
     //将文件流中模板加载到工作簿对象中
     hssfworkbookDown = new XSSFWorkbook(file);
     file.Close();
 }
//因为我模板就放在第一个sheet里所以就用第一张够了 
XSSFSheet sheet1 = (XSSFSheet)hssfworkbookDown.GetSheetAt(0);

静态数据填入

	sheet1.GetRow(1).GetCell(1).SetCellValue(info.accept.CreateDate.ToString());
	sheet1.GetRow(1).GetCell(8).SetCellValue(“可以是模型内容”);

动态列表录入

 //初始报修项目索引行
                int Index = 5;
                var sort = 1;

                #region 添加维修项目列表
                var itemList = info.itemList;

                foreach(var item in itemList)
                {
                    //往下添加一行
                    sheet1.ShiftRows(Index, sheet1.LastRowNum, 1, true, false);

                    //创建行
                    var rowInsert = sheet1.CreateRow(Index);
                    rowInsert.Height = 15 * 20;//设置行高度

                    for(int col = 0;col < 10; col++)
                    {
                        var cellInsert = rowInsert.CreateCell(col);
                        ICellStyle style = hssfworkbookDown.CreateCellStyle();//设置单元格格式
                        style.Alignment = HorizontalAlignment.Left;//【Center】靠左 
                        if(col == 0)
                        {
                            style.Alignment = HorizontalAlignment.Right;//编号靠左 
                        }
                        style.VerticalAlignment = VerticalAlignment.Center;//【Center】居中 
                        style.BorderTop = BorderStyle.Thin;//上
                        style.BorderRight = BorderStyle.Thin;//右
                        if (col == 9)
                        {
                            style.BorderRight = BorderStyle.Medium;//尾巴上的为厚的
                        }
                        style.BorderBottom = BorderStyle.Thin;//设置单元格低边框为细线
                        style.BorderLeft = BorderStyle.Thin;//左
                        cellInsert.CellStyle = style;



                        //设置字体样式
                        IFont font = hssfworkbookDown.CreateFont();
                        font.FontHeight = 200;//设置字体高度
                        font.FontName = "宋体";//设置字体
                        font.IsBold = true;//是否加粗
                        style.SetFont(font);
                    }

                    //合并单元格。依据模板的样式要求合并单元格,填入数据(这一步依据自己的实际情况需要来修改)
                    sheet1.AddMergedRegion(new CellRangeAddress(Index, Index, 1, 3));
                    sheet1.AddMergedRegion(new CellRangeAddress(Index, Index, 6, 7));
                    sheet1.AddMergedRegion(new CellRangeAddress(Index, Index, 8, 9));

                    sheet1.GetRow(Index).GetCell(0).SetCellValue(sort.ToString()+".");
                    sheet1.GetRow(Index).GetCell(1).SetCellValue(item.ItemName);

                    Index++;
                    sort++;
                }

                #endregion

图片导入(base64 保存的图片为例要是用图片地址的则以上面参考链接为例子)

#region  签名部分数据填入
                sheet1.GetRow(Index).GetCell(1).SetCellValue(info.accept.OutsourceUserName);
                var outUser =  _userService.GetInfoByUserId(info.accept.OutsourceUserId);
                sheet1.GetRow(Index + 3).GetCell(1).SetCellValue(outUser.MobilePhone);

                //流程信息获取
                var flowInfo = await _flowTaskService.GetFlowBeforeInfo(id,null);
                var nodeRecordList = flowInfo.flowTaskOperatorRecordList;
                #region 承修方签名
                var outsourceSign = nodeRecordList.Find(x => x.nodeCode == "gggl3K1" && x.handleStatus == 1).signImg;
                outsourceSign = outsourceSign.Replace("data:image/png;base64,", "");
                var outdealsign = Convert.FromBase64String(outsourceSign);

                //添加图片到对象中,指定图片格式
                int pictureIdx = hssfworkbookDown.AddPicture(outdealsign, PictureType.JPEG);

                //在sheet中创建画部
                IDrawing patriarch = sheet1.CreateDrawingPatriarch();

                //设置锚点 在起始单元格的X坐标0-1023,Y的坐标0-255,在终止单元格的X坐标0-1023,Y的坐标0-255,起始单元格行数,列数,终止单元格行数,列数
                IClientAnchor anchor = patriarch.CreateAnchor(0, 0, 0, 0, 1, Index + 1, 3, Index + 2);
                //创建图片
                IPicture pict = patriarch.CreatePicture(anchor, pictureIdx);
                #endregion
### C# 使用 NPOI 操作 Excel 模板文件 当使用 C#NPOI 库来操作 Excel 模板文件时,主要步骤涉及加载现有的模板文件、修改其中的内容并保存更改后的文档。下面是一个详细的示例说明如何实现这一过程。 #### 加载现有模板文件 为了读取已有的 `.xlsx` 或者 `.xls` 文件作为模板,可以通过 `FileStream` 打开该文件,并创建相应的 Workbook 对象: ```csharp using (var fs = new FileStream(templatePath, FileMode.Open, FileAccess.Read)) { IWorkbook templateWorkbook; if (templatePath.EndsWith(".xlsx")) templateWorkbook = new XSSFWorkbook(fs); else templateWorkbook = new HSSFWorkbook(fs); // 继续后续的操作... } ``` 此处判断了文件扩展名以决定实例化哪种类型的 WorkBook 类型对象[^1]。 #### 修改模板中的数据 一旦获得了工作簿对象之后就可以访问其内部的工作表以及单元格来进行编辑。假设要向第一个 sheet 的 A1 单元格写入新值,则可按如下方式执行: ```csharp ISheet sheet = templateWorkbook.GetSheetAt(0); // 获取第一页 IRow row = sheet.GetRow(0) ?? sheet.CreateRow(0); // 如果不存在则新建一行 ICell cell = row.GetCell(0) ?? row.CreateCell(0); // 同样地获取或创建指定位置的cell cell.SetCellValue("新的内容"); // 设置新的字符串值给这个cell ``` 这段代码展示了怎样定位到特定的位置并对之赋值[^2]。 #### 将更新后的内容写出至响应流或其他存储介质 完成所有的变更以后,需要把最终的结果输出成一个新的 Excel 文件或者直接返回给客户端浏览器下载。这里展示了一个简单的例子用于通过 ASP.NET Core 控制器方法发送文件给用户端: ```csharp public IActionResult ExportFromTemplate() { string templateFilePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "templates", "example_template.xlsx"); using var stream = System.IO.File.OpenRead(templateFilePath); using var workbookStream = new MemoryStream(); { IWorkbook wb; try { wb = new XSSFWorkbook(stream); ISheet sheet = wb.GetSheetAt(0); IRow row = sheet.GetRow(0) ?? sheet.CreateRow(0); ICell cell = row.GetCell(0) ?? row.CreateRow(0).CreateCell(0); cell.SetCellValue(DateTime.Now.ToString()); wb.Write(workbookStream); } finally { stream.Close(); } byte[] byteArray = workbookStream.ToArray(); return File(byteArray, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"exported_{DateTime.Now:yyyyMMddHHmmss}.xlsx"); } } ``` 此段代码实现了从服务器上的某个路径加载模板文件,在内存中对其进行必要的调整后再将其转换为字节数组形式供 HTTP 响应体传输[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值