简体   繁体   English

Apache POI SXSSF和XSSF

[英]Apache POI SXSSF and XSSF

I have one question. 我有一个问题。 Am I right that if I have a workbook which is created through xssf constructor then it is enough to change the constructor to sxssf workbook (with xssf wb passed as an argument) to make it work in a stream mode ? 我是对的,如果我有一个通过xssf构造函数创建的工作簿,那么将构造函数更改为sxssf工作簿(将xssf wb作为参数传递)就足以使其在stream mode工作了吗? Thanks a lof for your answers. 谢谢你的答案。

Solution: It all depends on the classes which you use for streaming. 解决方案:这完全取决于您用于流式传输的类。 If your class gathers more stream buffers than it can hold, this thing won't work. 如果你的类收集的流缓冲区比它能容纳的多,那么这个东西就不行了。 Otherwise it will 否则它会

Yes, you're right. 你是对的。 The difference between these two implementations is that stream version writes data directly to stream and stores at most specified number of rows in memory (default value is 100 and it's stored in SXSSFWorkbook.DEFAULT_WINDOW_SIZE). 这两个实现之间的区别在于流版本将数据直接写入流并在内存中存储最多指定行数(默认值为100,并且存储在SXSSFWorkbook.DEFAULT_WINDOW_SIZE中)。 Because of that you won't be able to get some row data after writing to output stream. 因此,在写入输出流之后,您将无法获得某些行数据。 Big benefit of using stream implementation is less memory usage. 使用流实现的巨大好处是减少内存使用。 If you need to export a lot of data just use SXSSFWorkbook. 如果您需要导出大量数据,请使用SXSSFWorkbook。

Example: 例:

public static void main(String[] args) throws IOException {
        FileOutputStream inMemoryOut = new FileOutputStream(new File("inMemoryWorkbook.xlsx"));
        XSSFWorkbook workbook = new XSSFWorkbook();
        WorkbookExample example = new WorkbookExample(workbook, inMemoryOut);
        example.export();

        FileOutputStream streamOut = new FileOutputStream(new File("streamWorkbook.xlsx"));
        SXSSFWorkbook streamWorkbook = new SXSSFWorkbook();
        WorkbookExample streamExample = new WorkbookExample(streamWorkbook, streamOut);
        streamExample.export();
    }

public class WorkbookExample {

    private Logger logger = Logger.getLogger(WorkbookExample.class.getName());
    private Workbook workbook;
    private OutputStream out;

    public WorkbookExample(Workbook workbook, OutputStream out) {
        this.workbook = workbook;
        this.out = out;
    }

    public void export() throws IOException {
        logger.info("export start for " + workbook.getClass().getName());

        List<Person> persons = new ArrayList<Person>();
        for (int i = 0; i < 1000; i++) {
            persons.add(new Person(String.valueOf("user_" + i)));
        }

        Sheet sheet = workbook.createSheet();
        for (int i = 0; i < persons.size(); i++) {
            Person p = persons.get(i);
            Row row = sheet.createRow(i);
            Cell cell = row.createCell(0);
            cell.setCellValue(p.getName());
        }
        workbook.write(out);
        logger.info("Is row 1 accessible after writing to output stream? " + String.valueOf(sheet.getRow(1) != null));
        out.close();
        workbook.close();

        logger.info("export finished for " + workbook.getClass().getName());
    }

    public static class Person {

        private String name;

        public Person(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

    }

}

Output: 输出:

kwi 21, 2015 7:56:14 PM pepuch.html2pdf.WorkbookExample export
    INFO: export start for org.apache.poi.xssf.usermodel.XSSFWorkbook
kwi 21, 2015 7:56:15 PM pepuch.html2pdf.WorkbookExample export
    INFO: Is row 1 accessible after writing to output stream? true
kwi 21, 2015 7:56:15 PM pepuch.html2pdf.WorkbookExample export
    INFO: export finished for org.apache.poi.xssf.usermodel.XSSFWorkbook
kwi 21, 2015 7:56:15 PM pepuch.html2pdf.WorkbookExample export
    INFO: export start for org.apache.poi.xssf.streaming.SXSSFWorkbook
kwi 21, 2015 7:56:15 PM pepuch.html2pdf.WorkbookExample export
    INFO: Is row 1 accessible after writing to output stream? false
kwi 21, 2015 7:56:15 PM pepuch.html2pdf.WorkbookExample export
    INFO: export finished for org.apache.poi.xssf.streaming.SXSSFWorkbook

As you see row 1 is not accessible any more after writing to output stream with SXSSFWorkbook. 如您所见,在使用SXSSFWorkbook写入输出流后,无法再访问第1行。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM