我能够使用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(); }
答案 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功率,内存等)以及你的文件大小的影响处理
祝你好运!