20191012——POI設置單元格自動行高(思路)

  • 2019 年 10 月 12 日
  • 筆記

在經過Jxls或者POI導出數據至excel中後,發現有的單元格內容太多,既沒有自動換行,也沒有自動增大行高。那如何通過Java程式碼來實現呢?請看下面步驟:

(一)首先,將excel設置為最合適的行高,通過CTRow對象的setCustomHeight(false)函數實現,具體的程式碼如下:

XSSFWorkbook workbook = new XSSFWorkbook(文件路徑或者文件流);

XSSFSheet sheet = workbook.getSheet(sheetIndex);

XSSFRow xssfRow = sheet.getRow(rowIndex);

CTRow ctRow = xssfRow.getCTRow();

ctRow.setCustomHeight(false);

(二)然後,循環每個sheet頁的行,通過XSSFCell的setWrapText(true),就可以設置單元格自動換行,並且自動調整行高,將單元格內容全部顯示出來;

(三)最後,對於合併的單元格,只能是通過XSSFRow的setHeight(行高值)來設置,這裡說一下思路:

   (1)通過sheet獲取當前sheet頁總共有哪些合併的單元格,例如List<CellRangeAddress> listCombineCell = sheet.getMergedRegions();

   (2)計算合併單于格的高度和寬度,採用循環的方式求的每一行的高度之和或者是每一列的寬度之和;

   (3)獲取合併單元格的內容,首先統計中文字元的個數,然後使用String的getByte().length獲取位元組數,加上中文字元的個數,最後將這兩者之和乘以256(為何要乘以256,可以看POI中獲取列寬的源碼,在裡面除以列256),這樣得到了內容的長度;

   (4)若內容的長度小於合併單元格的寬度,就不需要進行行高設置了;若內容的長度大於合併單元格的寬度,那麼通過合併單元格的寬度除以內容的長度,計算內容需要多少行才能全部顯示出來,這裡採用取比商大的最小整數;

   (5)計算合併單元格字體的高度,然後乘以內容需要的行數(第4步中求得的行數),得到內容需要的總高度;

   (6)判斷合併單元格是否是行合併(通過起始行號和終止行號是否相等來判斷,若相等就不是行合併,否則就是行合併),若是行合併的情況,那麼就需要計算是由多少行合併的(終止行號減去起始行號,再加一),接著計算每一行需要的平均高度(單元格內容的總高度除以行合併的單元格的行數),然後通過循環設置行合併的單元格區域的每一行所需要的平均高度。若不是行合併的單元格,那麼直接將行高設置為單元格內容所需的總高度即可。