根据官网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