poi 设置列宽问题

正常设置列宽
sheet.setDefaultColumnWidth(int width)
或者
sheet.setColumnWidth(int columnIndex, int width)
ps 列宽,单位为字符宽度的1/256
往往数据都是动态的我们需要自适应列宽。
poi 内置 sheet.autoSizeColumn(i);
but 同一列有些数据为空的情况下,排版十分错乱,
另外高版本时候 例如使用(SXSSFSheet)会报错

Exception in thread "main" java.lang.IllegalStateException: Could not auto-size column. Make sure the column was tracked prior to auto-sizing the column.
此时需要在调用前加上一段代码
sheet.trackAllColumnsForAutoSizing();
sheet.autoSizeColumn(i); 

是不是没有办法解决了?办法自然有
创建cell 记录该列最大的宽度即可,缓存到map。最后统一设置
sheet.setColumnWidth(int columnIndex, int width)
// 设置第5列的列宽为20个字符宽度
sheet.setColumnWidth(4, 20*256)
伪代码如下

 //存储最大列宽  
 Map<Integer,Integer> maxWidth = new HashMap<Integer,Integer>();  
 int cIndex=0;
 Row row = currentSheet.createRow(currentRowIndex);
 for (Map.Entry<String, String> titleField : excelTitle.entrySet()) {
            Cell cell = row.createCell(cIndex);
            cell.setCellValue(isTitle ? titleField.getValue() : formatVal(t, titleField.getKey(), getCellVal(t, titleField.getKey())));
            cell.setCellStyle(cellStyle);
            int length = 0;
            if (cell.getStringCellValue() != null) {
                length = cell.getStringCellValue().getBytes().length * 256;
            }
            //这里把宽度最大限制到15000
            length = length > 15000 ? 15000 : length;
            maxWidth.put(cIndex, Math.max(length, maxWidth.get(cIndex) == null ? minWidth : maxWidth.get(cIndex)));
            cIndex++;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值