使用easypoi时,动态设置excel列宽
2021-05-12 本文已影响0人
fzhyzamt
首先需要调用trackAllColumnsForAutoSizing
,因为SXSSFSheet
会将数据缓冲写入硬盘(这也是这个Sheet类型的特性,只负责写入不负责读取)。
因为autoSizeColumn
对中文支持有问题,所以需要额外乘上一个倍数来兼容中文宽度。
最后设置最小宽度则是因为有时在一些非常宽的列之后(比如我这里是U到X字段很宽),多列被错误的缩短了,见下图:
ExportParams exportParams = new ExportParams(null, "测试sheet");
List<ExcelExportEntity> exportColumnList = buildColumnList();
JSONArray dataList = queryData();
try {
Workbook workbook = ExcelExportUtil.exportBigExcel(exportParams, exportColumnList, dataList);
// 自动列宽
SXSSFSheet sheet = ((SXSSFSheet) workbook.getSheetAt(0));
sheet.trackAllColumnsForAutoSizing();
for (int i = 0; i < exportColumnList.size(); i++) {
sheet.autoSizeColumn(i);
sheet.setColumnWidth(i, sheet.getColumnWidth(i) * 17 / 10); // 中文宽度
int minWidth = exportColumnList.get(i).getName().length() * 600;
if (sheet.getColumnWidth(i) < minWidth)
sheet.setColumnWidth(i, minWidth); // 无数据额外处理
}
writeToResponse(workbook);
} finally {
ExcelExportUtil.closeExportBigExcel();
}