POI如何自動調整Excel單元格中字型的大小

2022-01-23 15:58:43 字數 2334 閱讀 7514

在excel裡用ctrl+向下方向鍵可以到達最後一行。

可以看到:

1、對2003版,最大行數是65536行

2、對2007以上版本,最大行數是1048576行

hssfrow row = sheet.createrow((short) 0);

hssfcellstyle style =workbook.createcellstyle();

style.setalignment(hssfcellstyle.align_center);

hssffont font =workbook.createfont();

style.setverticalalignment(hssfcellstyle.vertical_center);

style.setalignment(hssfcellstyle.align_center);

font.setfontname("宋體");

font.setfontheightinpoints((

short) 14);//

設定字型大小

目的是要將excel中的文字全部顯示出來,可以設定對齊格式為【縮小字型填充】,但是這樣的話只能展示出一行資料,字型會變得很小。還有一種辦法,設定對齊格式為【自動換行】,然後讓單元格中的字型自動調整大小。

我的實現思路是,設定單元格中的字型大小,最大10號字,最小5號字,判斷優先使用大的字型;如果最小的5號字也放不下,那就只能調整模板了。關鍵點就是判斷當前字型大小能否將內容完全展示在單元格中。

需要提前說明一點,我的這個方法是不精確的演算法,excel設定字型的時候太強大了,不同的字型的字間距、行間距都會不同。

判斷字型大小是否合理的思路:

1、計算出單元格的總寬度、總高度

2、計算出其中的內容的總長度,不同的字型大小,長度是不同的

3、內容總長度除以單元格寬度,得出實際上一共有多少行資料 x 

4、單元格的總高度除以內字型的高度,得出能展示出來的資料有多少行 y

5、如果 y>=x ,那麼表示所有的資料都能展示出來

這個判斷單元格中的字型大小是否合理的思路也不難,難的是如何獲取到需要的引數。

1、設定單元格字型大小的方法是:font.setfontheightinpoints(k),但是獲取字型寬度和高度的方法並不精確,因為字型間會有字間距,換行以後行之間也有間距,所以這個演算法並不精確。

這個例子中,我的獲取字型高度的方法是直接取 k,獲取字型寬度的方法是 k*2

2、在上訴關鍵點的第5步中,本來我的想法是 y向下取整, x向上取整,然後再進行比較。但是測試後發現,設定的字型都會偏小。 直接取y>=x,結果反而更合理些。

3、進行相除運算,單位必須相同。poi中point(座標點)和pixel(畫素點)的大小關係,我在之前的文章有介紹過,引用結論,獲取行高的畫素值的方法就是: (row.getheightinpoints() / 72) * 96

樣例中的單元格是合併單元格,起始座標 (3,5),結束座標 (3,8)

public static void main(string args)  catch (ioexception e) 

}/**

* 設定單元格字型大小

*/private static void setfontsize(workbook book, cell cell)

}//解決單元格樣式覆蓋的問題

cellstyle cstyle = book.createcellstyle();

cstyle.clonestylefrom(cell.getcellstyle());

cstyle.setwraptext(true);

cstyle.setfont(font);

cell.setcellstyle(cstyle);

}/**

* 校驗單元格中的字型大小是否合理

*/private static boolean checkcellreasonable(cell cell, short fontsize)

/** * 獲取單元格的總寬度(單位:畫素)

*/private static double gettotalwidth(cell cell)

return totalwidthinpixels;

}/**

* 獲取單元格的列數,如果是合併單元格,就獲取總的列數

*/private static int getcolnum(sheet sheet, int row, int column)

}return 1;

}

其中,獲取單元格總寬度的方法gettotalwidth(cell cell),有更簡單的方法,在《我的poi**庫》裡介紹

使用poi匯出excel根據指定列自動合併行

一 效果圖 二 js function assemble dg columns arr.push arr.push arr.push arr.push arr.push arr.push arr.push arr.push arr.push arr.push arr.push arr.push re...

POI生成EXCEL,公式不自動執行的問題

當使用poi操作excel時,發現由poi生成的公式能夠在開啟excel是被執行,而事先手工寫入excel模板檔案的公式則不自動被呼叫,必須手動雙擊該cell才能生效。採取的辦法 1.使用cell.setcellformula方法重新在制定cell裡寫入公式。2.使用sheet.setforcefo...

使用POI讀取Excel時如何把數字轉換成字串

因為excel本身有格式型別,當它以數字格式存的時候我們在使用poi讀取的時候就需要呼叫與格式型別相匹配的方法 xssfworkbook wb new xssfworkbook fis xssfsheet sheet wb.getsheetat 0 int rows sheet.getphysica...