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