正常设置列宽
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++;
}