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

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

作者: 肥宅快乐猿 | 来源:发表于2019-12-26 20:18 被阅读0次

    最近遇到关于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 编程按单元格文本内容自适应设置列宽

          本文链接:https://www.haomeiwen.com/subject/nmrloctx.html