java/poi 调整Excel 列宽支持自适应中文字符宽度
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 列宽支持自适应中文字符宽度相关推荐
- 解决poi设置excel列宽精度丢失问题
如果只设置列宽n*256,则导出xls的列宽为(n-1)+0.29 即第i列 列宽为10: sheet.setColumnWidth( i, 10 * 256); == 精度丢失,最后只有9.29 = ...
- excel2010设置列宽为像素_使用像素单位设置 EXCEL 列宽或行高
在导出 Excel 的时候, 经常要需要给列设置宽度或给行设置高度, 在使用 NPOI 或 EppPlus 等组件进行操作的时候, 列宽和行高的单位都不是像素, 好像是英寸,具体是啥也说不清. 平常在 ...
- java导出excel设置行高列宽_使用POI生成Excel文件,可以自动调整excel列宽
//autoSizeColumn()方法自动调整excel列宽 importjava.io.FileOutputStream; importorg.apache.poi.hssf.usermodel. ...
- 使用POI生成Excel文件,可以自动调整excel列宽
//autoSizeColumn()方法自动调整excel列宽 importjava.io.FileOutputStream;importorg.apache.poi.hssf.usermodel.H ...
- bootstraptable列宽自适应内容_多列列表框行高和列宽的自适应调整
LabVIEW:2015 在使用多列列表框(Multicolumn Listbox)时,有时不同列显示的内容长度不一致,为了显示更加美观,并节省界面显示空间,需要实现多列列表框的行高和列宽的自适应调整 ...
- Excel列宽像素值计算方法详解
字数不多,全是干货: 心血凝结,全网唯一: 如有帮助,请您点赞: 未经许可,禁止转载! 申明:本文是个人原创,目前只发表于CSDN平台. 前两年基于Apache POI做了个Excel转Html的程序 ...
- Java - Poi 操作 Excel
Java - Poi 操作 Excel 关注 "弋凡"(YiFan)微信公众号吧 记录简单笔记 做你的最爱 注意 XSSFWorkbook 对象是操作 .xlsx 格式的表格 HS ...
- 利用java poi对excel表的读写操作
2019独角兽企业重金招聘Python工程师标准>>> 利用java poi对excel表的读写操作 POI简介: Apache POI是一种流行的API,它允许程序员使用Java程 ...
- php表格列宽拖拽,JavaScript_JQuery拖动表头边框线调整表格列宽效果代码,类似于桌面程序中的表格拖动 - phpStudy...
JQuery拖动表头边框线调整表格列宽效果代码 类似于桌面程序中的表格拖动表头的效果,当鼠标停留在表头边框线上时,鼠标会变成表示左右拖动的形状,接着拖动鼠标,会在表格中出现一条随鼠标移动的竖线,最后放 ...
- java POI创建Excel示例(xslx和xsl区别 )
Java用来处理office类库有很多,其中POI就是比较出名的一个,它是apache的类库,现在版本到了3.10,也就是2014年2月8号这个版本. 在处理PPT,Excel和Word前,需要导入以 ...
最新文章
- nginx限制某个IP同一时间段的访问次数
- 常见动态内存的管理程序错误
- 论文排版中页码的设置方法
- 快手“连横”京东,是志同道合还是抱团取暖?
- Handler和Message详解
- 自定义v-drag指令(横向拖拽滚动)
- 如何获取元素在父级div里的位置_关于元素的浮动你了解多少
- VS2015配置环境支持opencv3库(网络方法总结)
- 剑指offer(C++)-JZ24:反转链表(数据结构-链表)
- LeetCode 852. Peak Index in a Mountain Array
- node.js 事件循环
- SQL语句详解(五)——SQL字段修饰符
- 黑幕背后的Autorelease
- win10无法修改mac地址_Oops,手机MAC地址也可以随机了
- python程序员工资-2018 年程序员工资大揭底!快来看看程序员赚多少钱
- 解决: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上,运行“ slui.exe 0x2a 0x803f7001 “以显示错误文本,激活win10步骤流程。
- python自测单词软件_还在用背单词App?使用Python开发英语单词自测工具,助你逆袭单词王!...
- 感悟篇:我在B端做数据分析(一)
- 【Python 3.7】分子运动:修改 rw_visual.py,将其中的 plt.scatter() 替换为 plt.plot() 。为 模拟花粉在水滴表面的运动路径
- 什么是大小端,为什么会出现大小端,如何检测是大端还是小端
热门文章
- ECCV 2022 | 石溪大学联合小鹏汽车提出先验知识指导的无监督领域自适应
- matlab构建boost电路,基于matlab的boost电路仿真.doc
- 从kubernetes看如何设计超大规模资源调度系统
- 等保中级测评师复习大纲2019版
- 一个好用的PLC调试神器
- 机器学习中的泛化误差
- Required request body is missing:public java.util.List错误
- Windows server 下关闭135/139/445端口
- JSONP跨域以及CORS跨域
- 携程异步消息系统实践