gpt4 book ai didi

java - Apache-POI:无法写入现有工作簿

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:51:31 24 4
gpt4 key购买 nike

我正在处理一个需要读取 Excel 工作簿的项目,调用必要的 Web 服务,然后从 Web 服务获取响应并将该信息输入到读取的同一个 Excel 工作簿中。

这是我在尝试写入 Excel 工作簿时看到的错误:

Exception in thread "main" org.apache.poi.POIXMLException: java.io.IOException: Can't obtain the input stream from /docProps/app.xml
at org.apache.poi.POIXMLDocument.getProperties(POIXMLDocument.java:141)
at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:177)
at ext.ExcelProcessor.main(ExcelProcessor.java:197)
Caused by: java.io.IOException: Can't obtain the input stream from /docProps/app.xml
at org.apache.poi.openxml4j.opc.PackagePart.getInputStream(PackagePart.java:500)
at org.apache.poi.POIXMLProperties.<init>(POIXMLProperties.java:75)
at org.apache.poi.POIXMLDocument.getProperties(POIXMLDocument.java:139)
... 2 more

这是我打开文件/阅读的代码:

pkg = OPCPackage.open(xslFile);
theWorkbook = new XSSFWorkbook(pkg);

在此之后,我读取每一行并提取每个单元格的值。

完成此操作后,我将在成功和结果消息的标题下创建单元格,然后执行以下操作:

String sessionData = sessionKey[1];
String[] cellValCurrRow = rowCellVals.get(r-1);
String attachmentData[] = WQSServices.uploadAttachment(sessionData, cellValCurrRow);

XSSFCell cell = xslRows[r].getCell(7);

if(cell == null)
{
cell = xslRows[r].createCell(7);
}

System.out.println("The Cell: "+cell.getStringCellValue());

XSSFCell cell2 = xslRows[r].getCell(8);

if(cell2 == null)
{
cell2 = xslRows[r].createCell(8);
}

System.out.println("The Cell: "+cell2.getStringCellValue());

cell.setCellType(Cell.CELL_TYPE_STRING);
cell2.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue(attachmentData[0]);
cell2.setCellValue(attachmentData[1]);

System.out.println("New Cell Data: 1-"+cell.getStringCellValue()+" 2-"+cell2.getStringCellValue());

FileOutputStream fos = new FileOutputStream(xslFile);
theWorkbook.write(fos);
fos.close();

有没有人遇到过类似的问题?

最佳答案

我收到了相同的错误消息,但使用了不同的类。我使用的当前 poi 版本是 poi-ooxml 3.9,但它仍然存在问题。现在我解决了我的问题,我认为这个问题是在您首先获取 Workbook 实例时出现的。

当我将数据写入文件时,我喜欢这样(有异常和关闭的实践规则):

    FileOutputStream fos = new FileOutputStream(filePath);
wb.write(fos);
fos.close();

当我像这样获取 Workbook 实例时,出现“无法从/docProps/app.xml 获取输入流”的错误消息:

    Workbook wb = WorkbookFactory.create(new File(filePath));

当我解决这个问题时,修改后的代码是

    Workbook wb = WorkbookFactory.create(new FileInputStream(filePath));

在我的例子中,打开并读取并写入同一个文件,或者从一个文件读取然后写入另一个文件并不重要。如果您阅读 poi 源代码,您会发现我使用的工厂方法可能会调用 OPCPackage 类中的 open() 方法。尝试使用获取 InputStream 作为其参数的方法。

关于java - Apache-POI:无法写入现有工作簿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14117617/

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