npoi自适应行高和列宽
由于系统需要在网页上导 出Excel文件,最近花了一段时间去学习NPOI插件。通过NPOI插件在服务端来生成Excel文件流并下载到本地。NPOI实际上和Excel一毛 钱关系都没有,它只是完全破译了Excel文件的存储格式,并用C#来生成同样的格式从而被识别为Excel文件。
NPOI和Excel VBA相比优点很多,首先是Excel VBA中的对象太多,而且是基于Visual Basic语言来书写,而且是在Excel中进行编程开发,IDE十分原始,没有任何的智能感知和代码着色功能。(最近可以在VS进行VBA开发了) 抛开这些不说,微软官方是不建议在服务器端来操作Excel的。原话好像是不建议用asp,asp.net等无人的方式来使用Excel。而且最要命的是 VBA方式来操作Excel后,其进程很难释放干净。在桌面端生成一两个文件倒无所谓,后台多跑两个Excel也不是啥大事。但在服务器端多用户操作,很 有可能会出现死锁等问题。
NPOI是从JAVA的POI移植而来,使用方式非常自然。
但是我发现在NPOI中实现宽度和高度自适应很难,宽度和高度自适应,说简单点就是如何让宽度和高度刚刚好。不让内容被遮挡,使用者在下载表格后不需要手工调整。
NPOI有一个宽度自适应属性,可惜只对英文和数字有效,对汉字无效。后来在一个台湾博客上发现了一段解决代码,我稍加改造后如下:
- <span style="font-family:Microsoft YaHei;font-size:14px;"> for (int columnNum = 0; columnNum <= 26; columnNum++)
- {
- int columnWidth = ffSheet.GetColumnWidth(columnNum) / 256;//获取当前列宽度
- for (int rowNum = 1; rowNum <= ffSheet.LastRowNum; rowNum++)//在这一列上循环行
- {
- IRow currentRow = ffSheet.GetRow(rowNum);
- ICell currentCell = currentRow.GetCell(columnNum);
- int length = Encoding.UTF8.GetBytes(currentCell.ToString()).Length;//获取当前单元格的内容宽度
- if (columnWidth < length + 1)
- {
- columnWidth = length + 1;
- }//若当前单元格内容宽度大于列宽,则调整列宽为当前单元格宽度,后面的+1是我人为的将宽度增加一个字符
- }
- ffSheet.SetColumnWidth(columnNum, columnWidth * 256);
- }</span>
columnNum是列号,从0开始循环到表格最后一列,循环的范围可以自己指定,原理很简单,就是在先循环列,在列上循环行,比对行内容宽度与列宽度,若行内容宽度大于列宽则增大列宽,循环以后,每列宽度等于该列中最宽的那一行的宽度。
值得注意的是使用UTF8编码来计算的,在UTF8编码中数字和英文字母宽度为2,汉字宽度为3。而且字号越小,其效果就越好。在实际使用中内容为10磅的时候,其效果就相当不错。
仅仅有宽度自适应是不够的,宽度自适应只是针对较短的内容而言的,如果单元格内容很长采用这个方法会将表格拉的非常宽。下面来谈一谈高度自适应解决方法, 高度自适应是指内容换行后行高能够自动增加以完整的显示内容,高度自适应是我自己想出来的,和宽度自适应很类似:
- <span style="font-family:Microsoft YaHei;font-size:14px;"> for (int rowNum = 2; rowNum <= ffSheet.LastRowNum; rowNum++)
- {
- IRow currentRow = ffSheet.GetRow(rowNum);
- ICell currentCell = currentRow.GetCell(27);
- int length = Encoding.UTF8.GetBytes(currentCell.ToString()).Length;
- currentRow.HeightInPoints = 20 * (length / 60 + 1);
- }</span>
首先要设置该列能够自动换行,然后将行高设置为20,获得列内容宽度后整除一个列宽常数,将其倍数乘以行高,从而增加行高。值得注意的是这个常数需要自己 测试,因为实际内容都是英文、数字和汉字混杂的,很难判断一行能容纳多少个字符,只能取一个中间值,如果取的太大可能会造成行高小于内容,取的过小会造成 行高过大而内容较少。而且在字磅数较小时精度较好。
npoi自适应行高和列宽相关推荐
- java excel行高_Java 设置Excel自适应行高、列宽
在excel中,可通过设置自适应行高或列宽自动排版,是一种比较常用的快速调整表格整体布局的方法.设置自适应时,可考虑2种情况: 1.固定数据,设置行高.列宽自适应数据(常见的设置自适应方法) 2.固定 ...
- C# 设置Excel数据自适应行高、列宽的2种情况
Excel表格中,由于各种数据的复杂性,可能存在单元格中的数据字号大小.数据内容长度不一而出现,列宽过宽.过窄或者行高过大.过小的问题.常见的解决方法是调整行高.列宽.在Microsoft Excel ...
- BODY background=自适应大小_C# 设置Excel数据自适应行高、列宽的2种情况
Excel表格中,由于各种数据的复杂性,可能存在单元格中的数据字号大小.数据内容长度不一而出现列宽过宽.过窄或者行高过大.过小的问题.常见的解决方法是调整行高.列宽.在Microsoft Excel中 ...
- Java 设置Excel自适应行高、列宽
在excel中,可通过设置自适应行高或列宽自动排版,是一种比较常用的快速调整表格整体布局的方法.设置自适应时,可考虑2种情况: 1.固定数据,设置行高.列宽自适应数据(常见的设置自适应方法) 2.固定 ...
- bootstraptable列宽自适应内容_多列列表框行高和列宽的自适应调整
LabVIEW:2015 在使用多列列表框(Multicolumn Listbox)时,有时不同列显示的内容长度不一致,为了显示更加美观,并节省界面显示空间,需要实现多列列表框的行高和列宽的自适应调整 ...
- excel2010设置列宽为像素_职场新手都能学会的Excel技巧:快速调整行高、列宽
我们录入完表格的内容后,有的内容不能完整显示出来,这时候我们需要调整行高和列宽,把超出单元格宽.高的内容正确显示出来,今天[Excel与财务]给大家分享几个快速调整行高.列宽的技巧,不仅提高表格的美观 ...
- 【LaTeX】表格调整行高、列宽、合并显示等操作
常规表格: 如上图所示,表格内容都太贴了,看着难受! 1. 样式一: 这样就舒服多了!!! 上述表格的操作: (1)调整行高: \usepackage{array} % 需要该宏包 \renewcom ...
- 计算机excel中行高在哪里,电脑Excel表格怎么对行高和列宽进行调整
电脑Excel表格怎么对行高和列宽进行调整 腾讯视频/爱奇艺/优酷/外卖 充值4折起 在我们使用Excel表格处理数据的时候,我们经常需要调整行高和列宽,今天小编就告诉大家电脑Excel表格怎么对行高 ...
- excel表格怎么调整行高和列宽_wps表格课程08|调整行高列宽
本课程由菜鸟在线教育独家出品,未经授权严禁用于商业用途,侵权必究 客服微信:13264012523 调整行高列宽是表格内容布局的必备技能. 方法/步骤 ■ 调整行高/列宽的最基础办法是:将鼠标定位到行 ...
最新文章
- 不可不知的STL sort函数实现原理
- 【转】使用Apache CXF开发WebServices服务端
- 《图像处理实例》之 曲线之间距离求解
- Java和WebSocket开发网页聊天室
- wine运行exe程序只出现了一个黑色长方形
- 如何把ajax改成同步请求,如何将Ajax请求从异步改为同步
- mysql主键long_MySQL主键设计
- matplotlib 散点图_matplotlib画图 绘制散点图案例
- 互联网原理和html基础,计算机网络基础知识习题及答案(八)
- 合理使用EntityFramework数据验证的异常错误提示信息
- OpenShift Security (9) - 用 RHACS 扫描 Log4j 安全漏洞,屏蔽不安全镜像部署
- 各层电子数排布规则_核外电子的排布规律
- 解决ssh或ftp下root用户认证失败问题
- div+css命名大全
- 看数据手册上的注意事项
- python语音地图定位_python 利用高德地图定位小区名字
- linux远程连接交换机,总结:交换机远程登陆的两种方式,Telnet与SSH那种好?
- xcode证书签名快速完美解决
- Android 入门教程:安装 Android Studio
- Git 常用命令大全-转载
热门文章
- 程序猿电子书推荐和下载
- 用户态和核心态的区别
- Bootstrap之Less
- C++23种设计模式(四)--Decorate(装饰模式)
- SqlServer修改表设计提示The object ‘DF__CompanyTr__Creat__0CDAE408’ is dependent on column ‘Created’
- 交代码后各种稀奇古怪的字母
- AcWing 1101. 献给阿尔吉侬的花束
- 前端基本功(三):javascript中让人脑壳疼的this关键字
- 使用 usbmon 抓取 usb 总线上的数据
- 2021-03-02