apache/poi是apache旗下用于读写Microsoft Office 二进制文件和OOXML 格式文件的开源库。用它来进行excel文件的导出是很趁手的。
一般来说可以直接使用 Sheet.autoSizeColumn方法自动调整每列的宽度。但是遇到包含中文的列,autoSizeColumn方法计算的列宽是不正确的,算出的宽度不能完整显示中文内容。最近项目中就遇到了这个问题,于是参考网上的各类文章,自己实现了自动适应中文字符宽度的方法

代码如下:

 /*** 自动调整列表宽度适应中文字符串* @param sheet* @param startColumnNum 要调整的起始列表号* @param size  要调整的列表数量*/public static void autoColumnWidthForChineseChar(Sheet sheet, int startColumnNum, int size) {    for (int columnNum = 0; columnNum < size; columnNum++) {/** 调整每一列宽度 */ sheet.autoSizeColumn(columnNum);/** 获取列宽 */final int columnWidth = sheet.getColumnWidth(columnNum);if(columnNum >= 256*256 ){/** 列宽已经超过最大列宽则放弃当前列遍历 */continue;}/** 新的列宽 */int newWidth = columnWidth;/** 遍历所有的行,查找有汉字的列计算新的最大列宽 */for (int rowNum = 0; rowNum <= sheet.getLastRowNum(); rowNum++) {Row currentRow;if (sheet.getRow(rowNum) == null) {continue;} else {currentRow = sheet.getRow(rowNum);}if (currentRow.getCell(columnNum) != null) {Cell currentCell = currentRow.getCell(columnNum);if (currentCell.getCellType() == CellType.STRING) {String value = currentCell.getStringCellValue();/** 计算字符串中中文字符的数量 */int count = chineseCharCountOf(value);/**在该列字符长度的基础上加上汉字个数计算列宽 */int length = value.length()*256+count*256*2;/** 使用字符串的字节长度计算列宽 */
//                      int length = value.getBytes().length*256;if (newWidth < length && length < 256*256) {newWidth = length;}}}}if(newWidth != columnWidth){//设置列宽sheet.setColumnWidth(columnNum, newWidth);}}}/*** 计算字符串中中文字符的数量* 参见 <a hrft="https://www.cnblogs.com/straybirds/p/6392306.html">《汉字unicode编码范围》</a>* @param input* @return*/private static int chineseCharCountOf(String input){int count = 0;//汉字数量if(null != input){String regEx = "[\\u4e00-\\u9fa5]";Pattern p = Pattern.compile(regEx);Matcher m = p.matcher(input);int len = m.groupCount();//获取汉字个数while (m.find()) {for (int i = 0; i <= len; i++) {count = count + 1;}}}return count;}

说明

  • 上面的代码中计算汉字数量的方法chineseCharCountOf,为简化实现只统计编译范围在4e00-u9fa5的2万多汉字,这也是主要使用的汉字,实际汉字unicode编译的范围并不止这一个,参见 《汉字unicode编码范围》,如果更严谨的话,可以把这个方法再完善,将所有的编译范围都包括进去。

  • 在网还找到另一个实现就是直接用使用字符串的字节长度计算列宽,不需要统计汉字个数,实际测试效果也是一样的。

     /** 使用字符串的字节长度计算列宽 */int length = value.getBytes().length*256;

参考资料
《POI Excel 中文自适用宽度》

java/poi 调整Excel 列宽支持自适应中文字符宽度相关推荐

  1. 解决poi设置excel列宽精度丢失问题

    如果只设置列宽n*256,则导出xls的列宽为(n-1)+0.29 即第i列 列宽为10: sheet.setColumnWidth( i, 10 * 256); == 精度丢失,最后只有9.29 = ...

  2. excel2010设置列宽为像素_使用像素单位设置 EXCEL 列宽或行高

    在导出 Excel 的时候, 经常要需要给列设置宽度或给行设置高度, 在使用 NPOI 或 EppPlus 等组件进行操作的时候, 列宽和行高的单位都不是像素, 好像是英寸,具体是啥也说不清. 平常在 ...

  3. java导出excel设置行高列宽_使用POI生成Excel文件,可以自动调整excel列宽

    //autoSizeColumn()方法自动调整excel列宽 importjava.io.FileOutputStream; importorg.apache.poi.hssf.usermodel. ...

  4. 使用POI生成Excel文件,可以自动调整excel列宽

    //autoSizeColumn()方法自动调整excel列宽 importjava.io.FileOutputStream;importorg.apache.poi.hssf.usermodel.H ...

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

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

  6. Excel列宽像素值计算方法详解

    字数不多,全是干货: 心血凝结,全网唯一: 如有帮助,请您点赞: 未经许可,禁止转载! 申明:本文是个人原创,目前只发表于CSDN平台. 前两年基于Apache POI做了个Excel转Html的程序 ...

  7. Java - Poi 操作 Excel

    Java - Poi 操作 Excel 关注 "弋凡"(YiFan)微信公众号吧 记录简单笔记 做你的最爱 注意 XSSFWorkbook 对象是操作 .xlsx 格式的表格 HS ...

  8. 利用java poi对excel表的读写操作

    2019独角兽企业重金招聘Python工程师标准>>> 利用java poi对excel表的读写操作 POI简介: Apache POI是一种流行的API,它允许程序员使用Java程 ...

  9. php表格列宽拖拽,JavaScript_JQuery拖动表头边框线调整表格列宽效果代码,类似于桌面程序中的表格拖动 - phpStudy...

    JQuery拖动表头边框线调整表格列宽效果代码 类似于桌面程序中的表格拖动表头的效果,当鼠标停留在表头边框线上时,鼠标会变成表示左右拖动的形状,接着拖动鼠标,会在表格中出现一条随鼠标移动的竖线,最后放 ...

  10. java POI创建Excel示例(xslx和xsl区别 )

    Java用来处理office类库有很多,其中POI就是比较出名的一个,它是apache的类库,现在版本到了3.10,也就是2014年2月8号这个版本. 在处理PPT,Excel和Word前,需要导入以 ...

最新文章

  1. nginx限制某个IP同一时间段的访问次数
  2. 常见动态内存的管理程序错误
  3. 论文排版中页码的设置方法
  4. 快手“连横”京东,是志同道合还是抱团取暖?
  5. Handler和Message详解
  6. 自定义v-drag指令(横向拖拽滚动)
  7. 如何获取元素在父级div里的位置_关于元素的浮动你了解多少
  8. VS2015配置环境支持opencv3库(网络方法总结)
  9. 剑指offer(C++)-JZ24:反转链表(数据结构-链表)
  10. LeetCode 852. Peak Index in a Mountain Array
  11. node.js 事件循环
  12. SQL语句详解(五)——SQL字段修饰符
  13. 黑幕背后的Autorelease
  14. win10无法修改mac地址_Oops,手机MAC地址也可以随机了
  15. python程序员工资-2018 年程序员工资大揭底!快来看看程序员赚多少钱
  16. 解决: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上,运行“ slui.exe 0x2a 0x803f7001 “以显示错误文本,激活win10步骤流程。
  17. python自测单词软件_还在用背单词App?使用Python开发英语单词自测工具,助你逆袭单词王!...
  18. 感悟篇:我在B端做数据分析(一)
  19. 【Python 3.7】分子运动:修改 rw_visual.py,将其中的 plt.scatter() 替换为 plt.plot() 。为 模拟花粉在水滴表面的运动路径
  20. 什么是大小端,为什么会出现大小端,如何检测是大端还是小端

热门文章

  1. ECCV 2022 | 石溪大学联合小鹏汽车提出先验知识指导的无监督领域自适应
  2. matlab构建boost电路,基于matlab的boost电路仿真.doc
  3. 从kubernetes看如何设计超大规模资源调度系统
  4. 等保中级测评师复习大纲2019版
  5. 一个好用的PLC调试神器
  6. 机器学习中的泛化误差
  7. Required request body is missing:public java.util.List错误
  8. Windows server 下关闭135/139/445端口
  9. JSONP跨域以及CORS跨域
  10. 携程异步消息系统实践