POI到量大的数据到EXCEL

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

你可能感兴趣的:(POI到量大的数据到EXCEL)