读取模板xlsm并使用SXSSF(POI)将大数据写入现有工作表

时间:2013-10-23 07:28:23

标签: java excel apache-poi xlsx xlsm

我能够使用XSSF读取现有的xlsm,并使用SXSSF将数据写入工作表。最后输出它作为另一个带有Outputstream的xlsm。
在文档中编写xlsx时提到了SXSSF
对于大数据读取和写入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();  }

1 个答案:

答案 0 :(得分:2)

我对你当前的代码没有太大的错误,但在apache website它说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功率,内存等)以及你的文件大小的影响处理

祝你好运!