20191012——POI設定單元格自動行高(思路)
在經過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)判斷合併單元格是否是行合併(通過起始行號和終止行號是否相等來判斷,若相等就不是行合併,否則就是行合併),若是行合併的情況,那麼就需要計算是由多少行合併的(終止行號減去起始行號,再加一),接著計算每一行需要的平均高度(單元格內容的總高度除以行合併的單元格的行數),然後通過迴圈設定行合併的單元格區域的每一行所需要的平均高度。若不是行合併的單元格,那麼直接將行高設定為單元格內容所需的總高度即