2

我能够使用 XSSF 读取现有的 xlsm 并使用 SXSSF 将数据写入工作表。最后使用 Outputstream 将其作为另一个 xlsm 输出。
在文档中提到 SXSSF 以编写 xlsx
是否是正确的方法来读取和写入 xlsm 以获取大量数据,否则如果通过此解决方案完成文件将被损坏?
这是有效的示例代码,

public static void main(String[] args) throws Throwable {

    OPCPackage pkg = OPCPackage.open(new File("sample.xlsm"));
        XSSFWorkbook wb_template;
        wb_template = new XSSFWorkbook(
            pkg
        );
        System.out.println("package loaded");
    SXSSFWorkbook wb = new SXSSFWorkbook(wb_template); 
    wb.setCompressTempFiles(true);

    SXSSFSheet sh = (SXSSFSheet) wb.createSheet();
    sh.setRandomAccessWindowSize(100);// keep 100 rows in memory, exceeding rows will be flushed to disk
    for(int rownum = 4; rownum < 5000; 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);
       }

    }
    FileOutputStream out = new FileOutputStream(new File("C:\\ouput\\new_file.xlsm"));
    wb.write(out);
    out.close();  }
4

1 回答 1

3

我认为您当前的代码没有太大问题,但是在apache 网站上它说 SXSSF 在您的计算机上留下了临时文件,并且您必须调用 dispose 如下:

Note that SXSSF allocates temporary files that you must always clean up explicitly, by calling the dispose method.
SXSSFWorkbook wb = new SXSSFWorkbook(100);
// dispose of temporary files backing this workbook on disk
wb.dispose();

我建议执行 dispose,因为它似乎可以防止存储剩余信息。关于这是否是正确的方法,我建议获取一个测试文件并试一试,这段代码的执行情况将受到您的系统(cpu 功率、内存等)和文档大小的影响加工。

祝你好运!

于 2013-10-23T07:59:07.080 回答