POI:解决使用poi自带的excel自适应列宽方法导出的excel表头被遮挡问题
程序员文章站
2022-04-30 18:25:29
...
项目情况:
pmdb项目中需要导出excel文件,因为文件格式为最简单的表格样式,所以编写了一个通用的方法,通过输入查询出来的数据,生成excel,使用自适应的方式设置列宽。这时候虽然根据表格内容设置的列宽满足要求,但是表头的部分标题因为过长导致被遮挡。
解决方式:
查询了poi底层实现之后,发觉它是通过SheetUtil的getColumnWidth方法获取每列中每个单元格中内容的长度进行计算的。于是,我决定使用这个方法将所有的表头的标题内容长度取出来,判断这个长度是否大于sheet中的该列计算出来的列宽,如果是,就设置该列的列宽为标题的长度。
代码:
//根据类型指定excel文件的列宽
private static void setColumnWidthByType(SXSSFSheet sheet,int titleLength) {
sheet.trackAllColumnsForAutoSizing();
for(int i=0;i<titleLength;i++){
int columnWidth = sheet.getRow(0).getCell(i).getStringCellValue().length();//获取表头的宽度
int autowidth=(int)SheetUtil.getColumnWidth(sheet,i,false,1,sheet.getLastRowNum());
if(columnWidth>autowidth){
sheet.setColumnWidth(i, (int)256.0D*(columnWidth+1));
}else{
sheet.autoSizeColumn(i);
}
}
}
备注:
如果导出的表格行数过多,sheet.getRow(0)就会返回null。原因是SXSSFWorkbook初始化的时候默认传递rowAccessWindowSize的值为100,也就是说只能显示100行数据。
解决这个问题只需要在创建对象的时候传入-1即可,这样导出的excel就不受行数的限制了:SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(-1);