項目情況:
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);