gpt4 book ai didi

java - 为什么 Apache POI OPCPackage close() 方法不会保存/写入内容以打开可写文件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:26:03 27 4
gpt4 key购买 nike

使用以下代码,不会保存对我的 Excel 电子表格所做的单元格值更改:

OPCPackage pkg = OPCPackage.open(inputFile);
XSSFWorkbook wb = new XSSFWorkbook(pkg);

ModifyWorkbook();

pkg.close();

以下是我写的解决方法,但我不明白为什么有必要。

OPCPackage pkg = OPCPackage.open(inputFile);
XSSFWorkbook wb = new XSSFWorkbook(pkg);

ModifyWorkbook();

File tmp = File.createTempFile("tempSpreadsheet", ".xlsx");
FileOutputStream newExcelFile = new FileOutputStream(tmp);
wb.write(newExcelFile);
newExcelFile.close();
tmp.deleteOnExit();
pkg.close();

关于该主题的 javadoc 和指南指出 .close() 方法应该保存并关闭。在关闭之前检查修改过的单元格的值,表明已进行了更改,但仅 pkg.close() 方法不足以在关闭时将这些更改写入文件。

最佳答案

调用 OPCPackage.close() 将关闭底层 OOXML 文件结构。它不会做的是导致 XSSF(或任何 X??F 格式)写出它们的更改。因此,您将写出一个未更改的文件....

如果您正在进行低级修改,您可以打开 OPCPackage,进行更改,然后调用 close 将它们写出。如果您正在做高级工作,您打开 OPCPackage,使用 UserModel 代码进行更改,然后请求 usermodel 写出它的更改。重要的是最后一步。

您当前的代码有点像:

File f = new File("test.txt");
Sting s = readFileCompletely(f);
s = s.replaceAll("foo", "bar");
f.close();
// Why hasn't the file contents changed?

读取文件并修改高层对象是不够的,您还需要告诉高层对象写出更改。 (出于性能原因,高级对象将内容缓存在内存中)

关于java - 为什么 Apache POI OPCPackage close() 方法不会保存/写入内容以打开可写文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16108142/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com