POI 匯出Excel實現合併單元格以及列自適應寬度
阿新 • • 發佈:2019-01-08
目錄
POI 匯出Excel
1. 合併單元格
POI是apache提供的一個讀寫Excel文件的開源元件,在操作excel時常要合併單元格,合併單元格的方法是:
public CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)
/* 說明: 1, // 起始行 1, // 結束行 0, // 起始列 2 // 結束列 */ sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 2));
2. 自適應列寬度:
sheet.autoSizeColumn(i); // i:列索引
sheet.autoSizeColumn(i, true);
這兩種方式都是自適應列寬度,但是注意這個方法在後邊的版本才提供,poi的版本不要太老。
注意:第一個方法在合併單元格的的單元格並不好使,必須用第二個方法。
2.2 強調的是設定自適應列寬:
方法一: sheet.autoSizeColumn(i); // 上面的屬性,只能解決英文、數字列寬自適應,如果該列為中文,會出現列寬不足現象。 1. sheet.autoSizeColumn(i);//先設定自動列寬 2. sheet.setColumnWidth(i, sheet.getColumnWidth(i)*17/10); // 設定列寬為自動列寬的1.7倍(當然不是嚴格的1.7倍,int的除法恕不再討論),這個1.6左右也可以,這是本人測試的經驗值* 方法二: 可通過手動設定列寬解決 首先通過value.getBytes().length方法對比找到該列資料最大長度 通過sheet.setColumnWidth(i, cellLength*2*256);手動設定列寬。 長度乘以2是為了解決純數字列寬度不足會顯示科學計數法問題,乘以256得到的資料才是excel真實列寬。 案例參考: if (autoSize) { // Autosize columns for (int i=0; i < maxColumns && i < rowsetBody[0].length; i++) { workbookSheet.autoSizeColumn(i); //設定中文列寬自適應 int curColWidth = workbookSheet.getColumnWidth(i)/256; for (int rowNum = 0; rowNum < workbookSheet.getLastRowNum(); rowNum++) { Row currentRow; //當前行未被使用過 if (workbookSheet.getRow(rowNum) == null) { currentRow = workbookSheet.createRow(rowNum); } else { currentRow = workbookSheet.getRow(rowNum); } if (currentRow.getCell(i) != null) { Cell currentCell = currentRow.getCell(i); if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) { int length = currentCell.getStringCellValue().getBytes().length; if (curColWidth < length) { curColWidth = length; } } } } workbookSheet.setColumnWidth(i,curColWidth*256); } }
3. 設定列寬
3.1 字串
sheet.setColumnWidth(m, “列名”.getBytes().length*2*256);
注:這個方法是計算字串的長度,以便設定列寬,該方法在解決中文的問題上比較好,前面兩種方法對中文不好好用。。。。
3.2 單元格是公式單元格(單元格存的是公式)
還有在自適應寬度的時候,有時候遇到單元格是公式單元格,自適應不起作用,那是因為單元格存的是公式,並不是真正的資料,解決方法:
HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(sheet.getWorkbook()); CellValue cell71Val = evaluator.evaluate(cell71); cell71.setCellValue(cell71Val.getNumberValue());
將格式化後的資料再次set進去,就是真正的值了。