由于系统需要在网页上导 出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有一个宽度自适应属性,可惜只对英文和数字有效,对汉字无效。后来在一个台湾博客上发现了一段解决代码,我稍加改造后如下:

  1. <span style="font-family:Microsoft YaHei;font-size:14px;">    for (int columnNum = 0; columnNum <= 26; columnNum++)
  2. {
  3. int columnWidth = ffSheet.GetColumnWidth(columnNum) / 256;//获取当前列宽度
  4. for (int rowNum = 1; rowNum <= ffSheet.LastRowNum; rowNum++)//在这一列上循环行
  5. {
  6. IRow currentRow = ffSheet.GetRow(rowNum);
  7. ICell currentCell = currentRow.GetCell(columnNum);
  8. int length = Encoding.UTF8.GetBytes(currentCell.ToString()).Length;//获取当前单元格的内容宽度
  9. if (columnWidth < length + 1)
  10. {
  11. columnWidth = length + 1;
  12. }//若当前单元格内容宽度大于列宽,则调整列宽为当前单元格宽度,后面的+1是我人为的将宽度增加一个字符
  13. }
  14. ffSheet.SetColumnWidth(columnNum, columnWidth * 256);
  15. }</span>

columnNum是列号,从0开始循环到表格最后一列,循环的范围可以自己指定,原理很简单,就是在先循环列,在列上循环行,比对行内容宽度与列宽度,若行内容宽度大于列宽则增大列宽,循环以后,每列宽度等于该列中最宽的那一行的宽度。

值得注意的是使用UTF8编码来计算的,在UTF8编码中数字和英文字母宽度为2,汉字宽度为3。而且字号越小,其效果就越好。在实际使用中内容为10磅的时候,其效果就相当不错。

仅仅有宽度自适应是不够的,宽度自适应只是针对较短的内容而言的,如果单元格内容很长采用这个方法会将表格拉的非常宽。下面来谈一谈高度自适应解决方法, 高度自适应是指内容换行后行高能够自动增加以完整的显示内容,高度自适应是我自己想出来的,和宽度自适应很类似:

  1. <span style="font-family:Microsoft YaHei;font-size:14px;">    for (int rowNum = 2; rowNum <= ffSheet.LastRowNum; rowNum++)
  2. {
  3. IRow currentRow = ffSheet.GetRow(rowNum);
  4. ICell currentCell = currentRow.GetCell(27);
  5. int length = Encoding.UTF8.GetBytes(currentCell.ToString()).Length;
  6. currentRow.HeightInPoints = 20 * (length / 60 + 1);
  7. }</span>

首先要设置该列能够自动换行,然后将行高设置为20,获得列内容宽度后整除一个列宽常数,将其倍数乘以行高,从而增加行高。值得注意的是这个常数需要自己 测试,因为实际内容都是英文、数字和汉字混杂的,很难判断一行能容纳多少个字符,只能取一个中间值,如果取的太大可能会造成行高小于内容,取的过小会造成 行高过大而内容较少。而且在字磅数较小时精度较好。

npoi自适应行高和列宽相关推荐

  1. java excel行高_Java 设置Excel自适应行高、列宽

    在excel中,可通过设置自适应行高或列宽自动排版,是一种比较常用的快速调整表格整体布局的方法.设置自适应时,可考虑2种情况: 1.固定数据,设置行高.列宽自适应数据(常见的设置自适应方法) 2.固定 ...

  2. C# 设置Excel数据自适应行高、列宽的2种情况

    Excel表格中,由于各种数据的复杂性,可能存在单元格中的数据字号大小.数据内容长度不一而出现,列宽过宽.过窄或者行高过大.过小的问题.常见的解决方法是调整行高.列宽.在Microsoft Excel ...

  3. BODY background=自适应大小_C# 设置Excel数据自适应行高、列宽的2种情况

    Excel表格中,由于各种数据的复杂性,可能存在单元格中的数据字号大小.数据内容长度不一而出现列宽过宽.过窄或者行高过大.过小的问题.常见的解决方法是调整行高.列宽.在Microsoft Excel中 ...

  4. Java 设置Excel自适应行高、列宽

    在excel中,可通过设置自适应行高或列宽自动排版,是一种比较常用的快速调整表格整体布局的方法.设置自适应时,可考虑2种情况: 1.固定数据,设置行高.列宽自适应数据(常见的设置自适应方法) 2.固定 ...

  5. bootstraptable列宽自适应内容_多列列表框行高和列宽的自适应调整

    LabVIEW:2015 在使用多列列表框(Multicolumn Listbox)时,有时不同列显示的内容长度不一致,为了显示更加美观,并节省界面显示空间,需要实现多列列表框的行高和列宽的自适应调整 ...

  6. excel2010设置列宽为像素_职场新手都能学会的Excel技巧:快速调整行高、列宽

    我们录入完表格的内容后,有的内容不能完整显示出来,这时候我们需要调整行高和列宽,把超出单元格宽.高的内容正确显示出来,今天[Excel与财务]给大家分享几个快速调整行高.列宽的技巧,不仅提高表格的美观 ...

  7. 【LaTeX】表格调整行高、列宽、合并显示等操作

    常规表格: 如上图所示,表格内容都太贴了,看着难受! 1. 样式一: 这样就舒服多了!!! 上述表格的操作: (1)调整行高: \usepackage{array} % 需要该宏包 \renewcom ...

  8. 计算机excel中行高在哪里,电脑Excel表格怎么对行高和列宽进行调整

    电脑Excel表格怎么对行高和列宽进行调整 腾讯视频/爱奇艺/优酷/外卖 充值4折起 在我们使用Excel表格处理数据的时候,我们经常需要调整行高和列宽,今天小编就告诉大家电脑Excel表格怎么对行高 ...

  9. excel表格怎么调整行高和列宽_wps表格课程08|调整行高列宽

    本课程由菜鸟在线教育独家出品,未经授权严禁用于商业用途,侵权必究 客服微信:13264012523 调整行高列宽是表格内容布局的必备技能. 方法/步骤 ■ 调整行高/列宽的最基础办法是:将鼠标定位到行 ...

最新文章

  1. 不可不知的STL sort函数实现原理
  2. 【转】使用Apache CXF开发WebServices服务端
  3. 《图像处理实例》之 曲线之间距离求解
  4. Java和WebSocket开发网页聊天室
  5. wine运行exe程序只出现了一个黑色长方形
  6. 如何把ajax改成同步请求,如何将Ajax请求从异步改为同步
  7. mysql主键long_MySQL主键设计
  8. matplotlib 散点图_matplotlib画图 绘制散点图案例
  9. 互联网原理和html基础,计算机网络基础知识习题及答案(八)
  10. 合理使用EntityFramework数据验证的异常错误提示信息
  11. OpenShift Security (9) - 用 RHACS 扫描 Log4j 安全漏洞,屏蔽不安全镜像部署
  12. 各层电子数排布规则_核外电子的排布规律
  13. 解决ssh或ftp下root用户认证失败问题
  14. div+css命名大全
  15. 看数据手册上的注意事项
  16. python语音地图定位_python 利用高德地图定位小区名字
  17. linux远程连接交换机,总结:交换机远程登陆的两种方式,Telnet与SSH那种好?
  18. xcode证书签名快速完美解决
  19. Android 入门教程:安装 Android Studio
  20. Git 常用命令大全-转载

热门文章

  1. 程序猿电子书推荐和下载
  2. 用户态和核心态的区别
  3. Bootstrap之Less
  4. C++23种设计模式(四)--Decorate(装饰模式)
  5. SqlServer修改表设计提示The object ‘DF__CompanyTr__Creat__0CDAE408’ is dependent on column ‘Created’
  6. 交代码后各种稀奇古怪的字母
  7. AcWing 1101. 献给阿尔吉侬的花束
  8. 前端基本功(三):javascript中让人脑壳疼的this关键字
  9. 使用 usbmon 抓取 usb 总线上的数据
  10. 2021-03-02