根據官網ex: apache
SXSSF(包:org.apache.poi.xssf.streaming)是一種API-compatible流擴展XSSF時使用 很是大的電子表格製做,和堆空間是有限的。 SXSSF達到低內存佔用經過限制訪問的行 在一個滑動窗口,而XSSF給訪問的全部行嗎 文檔。 老行再也不是在窗口變得沒法訪問, 他們將被寫入到磁盤。 dom
您能夠指定在工做簿窗口大小經過施工時間 新SXSSFWorkbook(int windowSize) 或者你能夠把它per-sheet經過 SXSSFSheet # setRandomAccessWindowSize(int windowSize) xss
當建立一個新行經過createRow()和總數 不能記錄將超過指定的窗口大小,而後 行索引值最低的刷新和沒法訪問 經過getRow()了。 this
默認的窗口大小 100年 並經過SXSSFWorkbook.DEFAULT_WINDOW_SIZE定義。 spa
windowSize 1表示無限的訪問。 在這種狀況下全部的 記錄沒有被調用刷新flushRows()是可用的 隨機存取。 code
注意,SXSSF分配臨時文件 必須 老是顯式清理,經過調用dispose方法。 orm
SXSSFWorkbook默認使用內聯字符串而不是共享的字符串 表。 這是很是有效的,由於不須要保存在文檔內容 內存,但也是產生不兼容的文檔 一些客戶。 與全部獨特的字符串在字符串啓用共享文檔 必須保存在內存中。 根據你的文檔內容能夠使用 比使用共享更多的資源字符串禁用。 xml
仔細檢查你的記憶在決定前預算和兼容性的需求 是否啓用共享字符串。 索引
下面的例子寫一張100行之窗。 當行數達到101, rownum = 0的行是刷新到磁盤,從內存,當rownum達到102而後rownum = 1的行是刷新,等等。 ip
import junit.framework.Assert; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellReference; import org.apache.poi.xssf.streaming.SXSSFWorkbook; public static void main(String[] args) throws Throwable { SXSSFWorkbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk Sheet sh = wb.createSheet(); for(int rownum = 0; rownum < 1000; rownum++){ Row row = sh.createRow(rownum); for(int cellnum = 0; cellnum < 10; cellnum++){ Cell cell = row.createCell(cellnum); String address = new CellReference(cell).formatAsString(); cell.setCellValue(address); } } // Rows with rownum < 900 are flushed and not accessible for(int rownum = 0; rownum < 900; rownum++){ Assert.assertNull(sh.getRow(rownum)); } // ther last 100 rows are still in memory for(int rownum = 900; rownum < 1000; rownum++){ Assert.assertNotNull(sh.getRow(rownum)); } FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx"); wb.write(out); out.close(); // dispose of temporary files backing this workbook on disk wb.dispose(); }
下一個示例關閉清洗法(windowSize = 1)和代碼手動控制部分的數據寫入磁盤
import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellReference; import org.apache.poi.xssf.streaming.SXSSFWorkbook; public static void main(String[] args) throws Throwable { SXSSFWorkbook wb = new SXSSFWorkbook(-1); // turn off auto-flushing and accumulate all rows in memory Sheet sh = wb.createSheet(); for(int rownum = 0; rownum < 1000; rownum++){ Row row = sh.createRow(rownum); for(int cellnum = 0; cellnum < 10; cellnum++){ Cell cell = row.createCell(cellnum); String address = new CellReference(cell).formatAsString(); cell.setCellValue(address); } // manually control how rows are flushed to disk if(rownum % 100 == 0) { ((SXSSFSheet)sh).flushRows(100); // retain 100 last rows and flush all others // ((SXSSFSheet)sh).flushRows() is a shortcut for ((SXSSFSheet)sh).flushRows(0), // this method flushes all rows } } FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx"); wb.write(out); out.close(); // dispose of temporary files backing this workbook on disk wb.dispose(); }
SXSSF衝單數據在臨時文件(每單臨時文件),這些臨時文件的大小 能夠長到一個很是大的價值。 例如,對於一個20 MB csv數據大小的臨時xml成爲超過十億字節。 若是臨時文件的大小是一個問題,你能夠告訴SXSSF使用gzip壓縮:
SXSSFWorkbook wb = new SXSSFWorkbook(); wb.setCompressTempFiles(true); // temp files will be gzipped