gpt4 book ai didi

java - 为什么我无法阻止 Apache POI 更改源文件?

转载 作者:行者123 更新时间:2023-12-01 17:44:48 25 4
gpt4 key购买 nike

我正在使用 Apache POI 工作簿在 Java 中打开 Excel 文件(源),更改特定单元格中的数据,将工作簿保存到单独的文件中,然后关闭工作簿(因为文档指出要关闭工作簿,即使它是只读的)。

POI 每次都会更改源 Excel 文件中的数据。根据 POI 文档的建议,我尝试了几种不同的方法来防止这种情况发生,但这些方法都失败了。

以下两种尝试理论上应该可行,但实际上却行不通。

尝试 1 - 将源文件设置为只读

File file = new File("{path-to-existing-source-file}");

file.setReadOnly();

Workbook workbook = WorkbookFactory.create(file); // throws a FileNotFoundException

WorkbookFactory.create(file) 处抛出“访问被拒绝”的 FileNotFoundException:

java.io.FileNotFoundException: {path-to-source-file-that-exists} (Access is denied)
at java.io.RandomAccessFile.open0(Native Method)
at java.io.RandomAccessFile.open(RandomAccessFile.java:316)
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:243)
at org.apache.poi.poifs.nio.FileBackedDataSource.newSrcFile(FileBackedDataSource.java:158)
at org.apache.poi.poifs.nio.FileBackedDataSource.<init>(FileBackedDataSource.java:60)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:224)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:172)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:298)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:271)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:252)
at com.stackoverflow.MyClass(MyClass.java:71)

源文件存在,并且它是有效的只读文件。

尝试 2 - 使用允许显式设置只读的 POI API 构造函数

File file = new File("{path-to-existing-source-file}");
Workbook workbook = WorkbookFactory.create(file, null, true); // true is read-only

// dataBean is just a container bean with the appropriate reference values
Sheet sheet = workbook.getSheet(dataBean.getSheetName());
Row row = sheet.getRow(dataBean.getRowNumber());
Cell cell = row.getCell(dataBean.getColumnNumber());
cell.setCellValue(dataBean.getValue());

// target is another File reference
OutputStream outStream = new FileOutputStream(new File("path-to-target-file"));
workbook.write(outStream); // throws InvalidOperationException

在写入调用期间抛出 InvalidOperationException:

Caused by: org.apache.poi.openxml4j.exceptions.InvalidOperationException: 
Operation not allowed, document open in read only mode!
at org.apache.poi.openxml4j.opc.OPCPackage.throwExceptionIfReadOnly(OPCPackage.java:551)
at org.apache.poi.openxml4j.opc.OPCPackage.removePart(OPCPackage.java:955)
at org.apache.poi.openxml4j.opc.PackagePart.getOutputStream(PackagePart.java:531)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.commit(XSSFWorkbook.java:1770)
at org.apache.poi.ooxml.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:463)
at org.apache.poi.ooxml.POIXMLDocument.write(POIXMLDocument.java:236)
at com.stackoverflow.MyClass(MyClass.java:90)

“不允许操作,文档以只读模式打开!”。当然是设置为只读;我不想写入源,我只想将所有数据发送到新目标。

使用 POI 时,我可以设置或更改什么来不改变来源?

我们当前的解决方法是创建重复的源文件,但这不是一个好的解决方案。

最佳答案

我遇到了同样的问题,并通过使用 FileInputStream 而不是 File 解决了它。

Workbook workbook = WorkbookFactory.create(file);

变成:

Workbook workbook = WorkbookFactory.create(new FileInputStream(file));

关于java - 为什么我无法阻止 Apache POI 更改源文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56809842/

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