标签:
根据官网ex:
SXSSF(包:org.apache.poi.xssf.streaming)是一种API-compatible流扩展XSSF时使用 非常大的电子表格制作,和堆空间是有限的。 SXSSF达到低内存占用通过限制访问的行 在一个滑动窗口,而XSSF给访问的所有行吗 文档。 老行不再是在窗口变得无法访问, 他们将被写入到磁盘。
您可以指定在工作簿窗口大小通过施工时间 新SXSSFWorkbook(int windowSize) 或者你可以把它per-sheet通过 SXSSFSheet # setRandomAccessWindowSize(int windowSize)
当创建一个新行通过createRow()和总数 不能记录将超过指定的窗口大小,然后 行索引值最低的刷新和无法访问 通过getRow()了。
默认的窗口大小 100年 并通过SXSSFWorkbook.DEFAULT_WINDOW_SIZE定义。
windowSize 1表示无限的访问。 在这种情况下所有的 记录没有被调用刷新flushRows()是可用的 随机存取。
注意,SXSSF分配临时文件 必须 总是显式清理,通过调用dispose方法。
SXSSFWorkbook默认使用内联字符串而不是共享的字符串 表。 这是非常有效的,因为不需要保存在文档内容 内存,但也是产生不兼容的文档 一些客户。 与所有独特的字符串在字符串启用共享文档 必须保存在内存中。 根据你的文档内容可以使用 比使用共享更多的资源字符串禁用。
仔细检查你的记忆在决定前预算和兼容性的需求 是否启用共享字符串。
下面的例子写一张100行之窗。 当行数达到101, rownum = 0的行是刷新到磁盘,从内存,当rownum达到102然后rownum = 1的行是刷新,等等。
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
标签:
原文地址:http://my.oschina.net/u/734885/blog/498451