635 字
3 分钟
记录一次NPOI库导出Excel遇到的小问题解决方案

前言#

在工作中经常会去导入或者导出Excel,那么我在工作中用的是NPOI库,很方便。不过在用的时候难免会出现问题,在这里记录一下这次需求遇到的问题。

不过目前用的NPOI库的版本很老,不知道最新版本是否有其他实现方式,注意甄别。

问题一,自动换行#

如图所示:

Snipaste_2024-11-23_14-42-39

需要设置WrapText = true才能让单元格中的内容自动换行

IFont fontfp = wb.CreateFont();
ICellStyle FontStyle = wb.CreateCellStyle();
FontStyle.WrapText = true; // 设置自动换行

问题二,函数问题#

如图所示:

Snipaste_2024-11-23_14-55-21

如果导出Excel是根据模版导出,模版中的函数可能会因为各种原因变成上图的样子,那么为了避免这种情况这里使用SetCellFormula为单元格设置函数,这里以SUM函数为例

IWorkbook workbook = new XSSFWorkbook();
ISheet sheet = workbook.CreateSheet("Sheet1");
sheet.GetRow(1).CreateCell(1).SetCellFormula("SUM(A1:A2)")

问题三,插入行但图片位置不跟随#

如图所示:

Snipaste_2024-11-23_14-56-55

如果使用Office操作Excel插入行图片是会移动的,我插入一行,图片就会往下移动一行。但是如果使用代码操作,即使你插入行使用了ShiftRows移动行,但是图片就是不动。

那么,我的解决方案是图片不放到模版中,而是在进行模版导出的时候进行插入操作,当Excel数据插入后,再对图片进行插入,这样图片就可以在想要的位置中显示。

这里用GPT写了个函数,可以参考一下。当完成插入行的操作后再调用这个函数就行了。

/// <summary>
/// 将图片插入到Excel的指定sheet中
/// </summary>
/// <param name="workbook">Excel工作簿</param>
/// <param name="sheet">目标sheet</param>
/// <param name="imagePath">图片路径</param>
/// <param name="rowStart">起始行索引</param>
/// <param name="rowEnd">结束行索引</param>
/// <param name="colStart">起始列索引</param>
/// <param name="colEnd">结束列索引</param>
public void InsertImage(IWorkbook workbook, ISheet sheet, string imagePath, int rowStart, int rowEnd, int colStart, int colEnd, double scaleSize)
{
// 读取图片文件
byte[] imageBytes = System.IO.File.ReadAllBytes(Server.MapPath(imagePath));
// 添加图片到工作簿
int pictureIndex = workbook.AddPicture(imageBytes, PictureType.PNG);
// 创建图形和锚定
IDrawing drawing = sheet.CreateDrawingPatriarch();
IClientAnchor anchor = new XSSFClientAnchor (0, 0, 0, 0, co lStart, rowStart, colEnd, rowEnd);
// 创建并调整图片
IPicture picture = drawing.CreatePicture(anchor, pictureIndex);
// 设置图片的新尺寸
picture.Resize(scaleSize);
}

总结#

记录了

  • 换行处理
  • 函数处理
  • 图片位置处理

3个问题,虽然都不是很难的问题,但是这里还是分享一下~,如果有问题欢迎指出。

记录一次NPOI库导出Excel遇到的小问题解决方案
https://blog.pljzy.top/posts/npoiexcel/记录一次npoi库导出excel遇到的小问题解决方案/
作者
ZyPlj
发布于
2024-11-23
许可协议
CC BY-NC-SA 4.0
相关文章 智能推荐
1
面试题-01
杂七杂八 .NET 常问面试题
2
C#中进行单元测试
.NET 技术合集 单元测试前言时隔多个月,终于抽空学习了点新知识,那么这次来记录一下C#怎么进行单元测试,单元测试是做什么的。我相信大部分刚毕业的都很疑惑单元测试是干什么的?在小厂实习了6个月后,我发现每天除了写CRUD就是写CRUD,几乎用不到单元测试。写完一个功能直接上手去测,当然这只是我个人感受,仅供参考。然后当我还在抱怨测试好烦的时候,大佬跟我说为什么不用单元测试和集成测试,我这也是有苦说不出。
3
C# LINQ基础差集计算
.NET 技术合集 C# LINQ基础差集计算前言最近开发的时候遇到个需求,接口参数为表的主键集合,用接口传递过来的参数去数据库查询数据,然后返回数据库不存在的数据。举个例子集合 1,2,3,4,5数据库 1,2,3通过查询语句查询,能从数据库查询出1,2,3来,然后与参数对比发现4,5是不存在与数据库的,那么要返回出来。
4
SharpIcoWeb开发记录篇
.NET 技术合集 SharpIcoWeb开发记录篇.
5
弹幕树洞项目功能新增篇
杂七杂八 项目地址项目后端地址:https://github.com/ZyPLJ/ZYTteeHole项目前端页面地址:ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue目前项目测试访问地址:http://tree.pljzy.top/ 注意是http,输成https就访问到博客里面去了。
随机文章 随机推荐
1
前言
2
问题一,自动换行
3
问题二,函数问题
4
问题三,插入行但图片位置不跟随
5
总结