1. 程式人生 > >POI 生成excel(大資料量) SXSSF

POI 生成excel(大資料量) SXSSF

使用POI 的SXSSF (Streaming Usermodel API)生成較大的excel,同時開啟壓縮

 

 1 import junit.framework.Assert;
 2 import org.apache.poi.ss.usermodel.Cell;
 3 import org.apache.poi.ss.usermodel.Row;
 4 import org.apache.poi.ss.usermodel.Sheet;
 5 import org.apache.poi.ss.usermodel.Workbook;
 6 import org.apache.poi.ss.util.CellReference;
7 import org.apache.poi.xssf.streaming.SXSSFWorkbook; 8 9 public static void main(String[] args) throws Throwable { 10 SXSSFWorkbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk 11 Sheet sh = wb.createSheet(); 12 for(int
rownum = 0; rownum < 1000; rownum++){ 13 Row row = sh.createRow(rownum); 14 for(int cellnum = 0; cellnum < 10; cellnum++){ 15 Cell cell = row.createCell(cellnum); 16 String address = new CellReference(cell).formatAsString(); 17 cell.setCellValue(address);
18 } 19 20 } 21 22 // Rows with rownum < 900 are flushed and not accessible 23 for(int rownum = 0; rownum < 900; rownum++){ 24 Assert.assertNull(sh.getRow(rownum)); 25 } 26 27 // ther last 100 rows are still in memory 28 for(int rownum = 900; rownum < 1000; rownum++){ 29 Assert.assertNotNull(sh.getRow(rownum)); 30 } 31 32 FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx"); 33 wb.write(out); 34 out.close(); 35 36 // dispose of temporary files backing this workbook on disk 37 wb.dispose(); 38 }

 

遇到的問題:

錯誤是NPE錯誤,類似如下,原因是缺少字型或者環境變數未設定,需要安裝"ttf-dejavu"字型,具體可以參考:

https://stackoverflow.com/questions/30626136/cannot-load-font-in-jre-8

https://www.jianshu.com/p/c05b5fc71bd0

 1 java.lang.NullPointerException
 2     at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
 3     at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
 4     at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
 5     at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774)
 6     at sun.font.SunFontManager$2.run(SunFontManager.java:431)
 7     at java.security.AccessController.doPrivileged(Native Method)
 8     at sun.font.SunFontManager.<init>(SunFontManager.java:376)
 9     at sun.awt.FcFontManager.<init>(FcFontManager.java:35)
10     at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
11     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
12     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
13     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
14     at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
15     at java.lang.Class.newInstance(Class.java:442)
16     at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
17     at java.security.AccessController.doPrivileged(Native Method)
18     at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
19     at java.awt.Font.getFont2D(Font.java:495)
20     at java.awt.Font.canDisplayUpTo(Font.java:2080)
21     at java.awt.font.TextLayout.singleFont(TextLayout.java:470)
22     at java.awt.font.TextLayout.<init>(TextLayout.java:531)
23     at org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:275)
24     at org.apache.poi.xssf.streaming.AutoSizeColumnTracker.<init>(AutoSizeColumnTracker.java:117)
25     at org.apache.poi.xssf.streaming.SXSSFSheet.<init>(SXSSFSheet.java:79)
26     at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:656)
27     at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:677)
28     at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:83)

 

 

 

還有一種,easyexcel,沒用過,可以參考https://github.com/alibaba/easyexcel