1. 程式人生 > >POI 匯出Excel實現合併單元格以及列自適應寬度

POI 匯出Excel實現合併單元格以及列自適應寬度

目錄

參考推薦:

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進去,就是真正的值了。

4. POI IndexedColors 所有顏色索引

參考推薦