首页 > 其他分享 >NPOI导出Excel自适应行高

NPOI导出Excel自适应行高

时间:2023-06-07 10:23:30浏览次数:61  
标签:10 int 单元格 Excel NPOI ICurRow 行高

开发环境:.Net Core 3.1,NPOI 2.6.0

功能需求:导出的Excel的内容要自适应行高。

先看模板,这是一张质量检测报告单,打码部分属于其他敏感数据。

最终效果

 

需求分析:一顿网上查找“NPOI导出Excel自适应行高”,都是片段代码,很多参数不明,但是也提供了不错的思路,这里博主整理一下。

之前博主是在给行数据绑定值的时候,算字符串的长度,来决定行高,但是字符串中的汉字、字母和数字,以及符号、合并单元格列宽等因素,行高计算的实在不准。

重新整理思路,决定等Excel绑定值后,最后统一处理Excel内容。

解决方案:1.修正模板  2.自适应行高

首先,当前单元格或者整行,要设置成自动换行,如 wps下图

然后,待Excel绑定值后,开始处理自适应行高,代码内有的方法是来自Excel帮助类,参考 2.构建Excel帮助类 - 0Behavior - 博客园 (cnblogs.com)

 1             //自适应高度,9代表从第10行开始,表头部分不会多行;endRow是结束的行,也就是有数据内容的行数,毕竟没内容的单元格,也没必要自适应行高
 2                     for (int i = 9; i < endRow; i++)
 3                     {
 4                         if (ws.GetRow(i) == null)
 5                         {
 6                             continue;
 7                         }
 8                         IRow ICurRow = ws.GetRow(i);
 9                         int OldHg = ICurRow.Height;//当前行高
10                         int newHg = ICurRow.Height;//新行高,默认与当前行高一致
11                         int j = 0;//第一列
12                         while (j < excelNum2Digit("X"))//excelNum2Digit是获取下标的帮助方法,这里是到X列就终止了
13                         {
14                             if (ICurRow.GetCell(j) == null)
15                             {
16                                 continue;
17                             }
18                             ICell CurCell = ICurRow.GetCell(j);
19                             int lastCol = GetLastCol(ws, i, j);//获取合并行最后列的下标
20                             if (CurCell.CellType == CellType.String && !string.IsNullOrEmpty(CurCell.StringCellValue))
21                             {
22                                 int cellWidth = 0;//当前单元格或者合并单元格的总宽度,此属性可以帮助计算不同字体大小的汉字或字母的宽度
23                                 if (CurCell.IsMergedCell)//计算出合并单元格的实际宽度
24                                 {
25                                     for (int f1 = 0; f1 <= lastCol - j; f1++)
26                                     {
27                                         cellWidth += ICurRow.Sheet.GetColumnWidth(j + f1);
28                                     }
29                                 }
30                                 else
31                                 {
32                                     cellWidth = ICurRow.Sheet.GetColumnWidth(j);
33                                 }
34                                 int cellStringLength = GetCellStringLength(CurCell.StringCellValue);//计算出字符串内容实际宽度
35                                 if (cellStringLength > cellWidth)
36                                 {
37                                     short newHg1 = (short)(OldHg *
38                                         (cellStringLength / cellWidth + 1));
39                                     if (newHg1 > newHg)
40                                     {
41                                         newHg = newHg1;
42                                     }
43                                 }
44                             }
45                             if (CurCell.IsMergedCell)
46                             {
47                                 j = lastCol + 1;
48                             }
49                             else
50                             {
51                                 j++;
52                             }
53                         }
54                         if (OldHg < newHg)
55                         {
56                             ICurRow.Height = Convert.ToInt16(newHg);
57                         }
58                     }

 

 

 1         /// <summary>
 2         /// 计算单元格内容长度
 3         /// 用 ASCII 码范围判断字符是不是汉字
 4         /// </summary>
 5         /// <param name="text">待判断字符或字符串</param>
 6         /// <returns>宽度</returns>
 7         public int GetCellStringLength(string text)
 8         {
 9             //汉字 453、数字和字母 239
10             //这里的汉字与字母的宽度值,要根据Excel的字体大小计算
11             //例如你单元格宽度1000,能放10个汉字,那汉字宽度就是1000/10=100
12             //同理计算字母宽度
13             int result = 0;
14             foreach (char t in text)
15             {
16                 if(t==10)
17                 {
18                     //忽略字符串中的换行符\n
19                     continue;
20                 }
21                 else if (t > 127)
22                 {
23                     result += 453;
24                 }
25                 else
26                 {
27                     result += 239;
28                 }
29             }
30             return result;
31         }

标签:10,int,单元格,Excel,NPOI,ICurRow,行高
From: https://www.cnblogs.com/oBehavior/p/17462467.html

相关文章

  • Java中使用POI读取大的Excel文件或者输入流时发生out of memory异常参考解决方案
     使用ExcelStreamingReader,这个第三方工具会把一部分的行(可以设置)缓存到内存中,在迭代时不断加载行到内存中,而不是一次性的加载所有记录到内存,这样就可以不断的读取excel内容并且不影响内存的使用。  但是这个工具也有一定的限制:只能用于读取excel的内容,写入操作不可用;可以使......
  • EasyExcel实战 自定义动态化导出excel
    1.Java操作excel表格,除了运用POI技术,阿里开发一个工具简易操作EasyExcel,接下来我们来实战操作下自定义动态化导出excel,自定义动态化为自定义标题,合并单元格引入pom<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId>......
  • ChatGPT玩法(二):AI玩转Excel表格处理
    前言在线免费体验ChatGpt:https://www.topgpt.one你是否还在为记不住Excel的繁琐函数和公式而苦恼?如果是这样,那么不妨试试ChatExcel。即使你对函数一窍不通,也能轻松处理表格。只要你能清楚地描述你的需求,它就可以帮你搞定。此外,ChatExcel的作者还制作了一张工作流程对比图,一眼就......
  • BootStrap_实现导入Excel(BootStrap-InputFile)【实例】
    BootStrap_实现导入Excel(BootStrap-InputFile)【实例】weixin_40877388于2020-03-3114:52:47发布分类专栏:BootStrap版权订阅专栏一、前言在批量加入学生信息的时候,我们通常采用Excel导入的方式,方便,快捷。本篇使用SpringBoot+BootStrap-InputFile+poi的结合方式,写......
  • 1千多鸟类百科图谱大全ACCESS\EXCEL数据库
    我很喜欢这种图谱、名册、字典类的数据库,像这种数据库还有《史前古生物资料图谱ACCESS数据库》、《中国鱼类资料图谱大全ACCESS数据库》、《植物结构部件资料图谱ACCESS数据库》、《全球家畜资料图谱大全ACCESS数据库》等。几乎每一个鸟类都会对应一张图,只有28条记录图片丢失;包......
  • 848中国鱼类资料图谱大全ACCESS\EXCEL数据库
    这两年钓鱼的视频很火,天元邓刚“醉翁之意不在酒”专钓人家的鸡鸭羊也是看得过瘾,盘老板、被老板盘也一度成为热词,相信钓鱼的人或者想钓鱼的人有很多很多,但入门不就要识得一些鱼吗!今天这个中国鱼类图谱ACCESS资料数据库,不但包含了:分类、名称、英文名、俗名、产地及产期、详细介绍,而......
  • 多个excel合并成一个excel
    '功能:把多个excel工作簿的第一个sheet工作表合并到一个excel工作簿的多个sheet工作表,新工作表的名称等于原工作簿的名称SubBooks2Sheets()'定义对话框变量DimfdAsFileDialogSetfd=Application.FileDialog(msoFileDialogFilePicker)'新建一个工......
  • 1 公式初探 Excel真正的力量
    用Excel来做记录是非常棒的使用公式来处理你的数据=数据1+数据2+...加减乘除均可即使你的数据有所变化,“引用”也可以使你的公式正常工作一定要为你的公式创建对应的立文本标签,这样日后当你查公式时,可以知道这些公式所表示的含义!可以对引用进行加减乘除使用单元格区......
  • 近万条儿童科普知识大全ACCESS\EXCEL数据库
    仍然从昨天采集的儿童教育网站中采集了上万条的儿童科普知识,因为其分类和内容都比较符合儿童(很多大人也都不知道哦),对儿童的教育、对儿童的知识面会起到很好的作用,用处也广只要是儿童教育方面的都可以使用。分类情况统计:暴风雪里的夏天(25)、地球家园(211)、动物(314)、海洋技术(41)、健......
  • python操作Excel,读取表格内容,并根据需求将内容填充到表格指定位置
    在日常工作中经常会遇到需要将“表一,部门信息表”内容逐行填充到“表二,个人基本信息表”的情况。表一:表二:  实现方式如下:#!usr/bin/python#-*-coding:utf-8-*-importpandasaspdimportopenpyxlasopfromopenpyxlimportWorkbookfromopenpyxlimportl......