我能够使用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();  }

最佳答案

我看不到您当前的代码有多大错,但是在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();


我建议执行处置,因为这似乎可以防止剩余的信息被存储。关于是否正确的方法,我建议您获取一个测试文件并进行一些测试,该代码执行的好坏将受到系统(CPU能力,内存等)和所用文档大小的影响。处理。

祝好运!

07-26 08:25