(一)首先,將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)若內容的長度小於合併單元格的寬度,就不需要進行行高設定了;若內容的長度大於合併單元格的寬度,那麼透過合併單元格的寬度除以內容的長度,計算內容需要多少行才能全部顯示出來,這裡採用取比商大的最小整數,考慮到單元格有padding和margin距離,最好是再加上一行量;這裡需要注意如何計算單元格中內容的寬度了,首先將字串形式的內容按換行符轉換成字元陣列,接著計算字元陣列中每一個元素的寬度,將它們的寬頻和單元格實際寬度相除,這樣就可以統計字元陣列每個元素需要多少行來顯示,最終將這些行數累加起來,最後還加上字元陣列大小值,這樣就得到了單元格內容需要的行數。
(5)計算合併單元格字型的高度,然後乘以內容需要的行數(第4步中求得的行數),得到內容需要的總高度;
(6)判斷合併單元格是否是行合併(透過起始行號和終止行號是否相等來判斷,若相等就不是行合併,否則就是行合併),若是行合併的情況,那麼就需要計算是由多少行合併的(終止行號減去起始行號,再加一),接著計算每一行需要的平均高度(單元格內容的總高度除以行合併的單元格的行數),然後透過迴圈設定行合併的單元格區域的每一行所需要的平均高度。若不是行合併的單元格,那麼直接將行高設定為單元格內容所需的總高度即可。
(一)首先,將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)若內容的長度小於合併單元格的寬度,就不需要進行行高設定了;若內容的長度大於合併單元格的寬度,那麼透過合併單元格的寬度除以內容的長度,計算內容需要多少行才能全部顯示出來,這裡採用取比商大的最小整數,考慮到單元格有padding和margin距離,最好是再加上一行量;這裡需要注意如何計算單元格中內容的寬度了,首先將字串形式的內容按換行符轉換成字元陣列,接著計算字元陣列中每一個元素的寬度,將它們的寬頻和單元格實際寬度相除,這樣就可以統計字元陣列每個元素需要多少行來顯示,最終將這些行數累加起來,最後還加上字元陣列大小值,這樣就得到了單元格內容需要的行數。
(5)計算合併單元格字型的高度,然後乘以內容需要的行數(第4步中求得的行數),得到內容需要的總高度;
(6)判斷合併單元格是否是行合併(透過起始行號和終止行號是否相等來判斷,若相等就不是行合併,否則就是行合併),若是行合併的情況,那麼就需要計算是由多少行合併的(終止行號減去起始行號,再加一),接著計算每一行需要的平均高度(單元格內容的總高度除以行合併的單元格的行數),然後透過迴圈設定行合併的單元格區域的每一行所需要的平均高度。若不是行合併的單元格,那麼直接將行高設定為單元格內容所需的總高度即可。