POI 编程按单元格文本内容自适应设置列宽

最近遇到关于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;

}


最终方案效果

你可能感兴趣的:(POI 编程按单元格文本内容自适应设置列宽)