最近遇到关于EXCEL导出需求,导出时需要自动设置列宽。去网上查了资料和自己实验后整理出一种列宽计算公式,希望能给大家一种思路吧。
首先是单元格内容获取,我这边由于项目表单是html的,所以解析是以Element标签形式解析。
表单样式 底层HTML标签将HTML转化为Docment类再按tr -> td 解析到单元格
获取单元格内容我采取的是能取到空格的方式获取单元格内容 (256是指一个字符所占宽度的256分之一,感兴趣可以看看源码)
//方案一
sheet.autoSizeColumn(i);
可能是我jar包版本不是最新的,导出结果有部分没展示出来,这样肯定不符合需求
方案一效果//方案二
sheet.autoSizeColumn(i);
sheet.setColumnWidth(i,sheet.getColumnWidth(i) *17 /10);
网上看到的一种方式,效果比前面要好,但是空白部分偏多。
方案二效果//方案三
sheet.setColumnWidth(i, tdText.getBytes().length * 256);
对中文支持比较好,不考虑空白部分留存的话。其中getBytes()得到一个操作系统默认的编码格式的字节数组,例如:
try {
byte[] bytes = "我".getBytes("UTF-8");
} catch (Exception e) {
}
根据不同编码格式所获得的结果也不一样,将分别返回“我”这个汉字在GBK、UTF-8、ISO8859-1、unicode编码下的byte数组表示,此时gbk的长度为2,utf8的长度为3,iso88591的长度为1,unicode为4。
方案三效果//方案四
sheet.setColumnWidth(i, tdText.length() *256);
直接获取String类长度,对中文支持不太好,如果只是字母和数字这种方式比较简便。(如图 :有限公司没有显示)
//最终方案
由于中文和字母 数字所占字符位不一样所以采用分开计算,先用正则统计字符串中文个数,再求出非中文个数,其中中文按两个字符计算。
//计算中文个数
int count = calculateChineseNumber(tdText);
//计算所需宽度
strLen = (tdText.length() - count) * 256 + (count + 1) * 512;
//设置宽度
sheet.setColumnWidth(i, strLen);
自定义函数:
public static int calculateChineseNumber(String str) {
int count =0;
String regEx ="[\\u4e00-\\u9fa5]";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
for (int i =0; i <= matcher.groupCount(); i++) {
count = count +1;
}
}
return count;
}
最终方案效果
网友评论