当前位置: 首页 > 知识库问答 >
问题:

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

章飞虎
2023-03-14

我正在处理一个项目,该项目需要读取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();

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

共有3个答案

公子昂
2023-03-14

我认为这里的问题是,您使用相同的filePathxslFile打开和保存文件。

打开文件,

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

保存文件,

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

您需要一个输入流来读取和处理您的文件,但是当您在相同的路径和文件名下创建一个输出流时,这个流变得不可访问。

党浩阔
2023-03-14

以下是在使用OPCPackage进行读取时如何做到这一点(try/catch/finally ommitted以确保可读性):

OPCPackage pkg = OPCPackage.open("existingFile.xlsx");
XSSFWorkbook wb = (XSSFWorkbook) WorkbookFactory.create(pkg);

进行修改。。。XSSFSheet=wb。getSheetAt(0)。。。

fos = new FileOutputStream("outputFileName.xlsx");
wb.write(fos);
pkg.close();
fos.close();
Faces.sendFile(new File(outputFileName)

上面来自Jayamohan的评论帮助我解决了这个问题(使用不同的文件路径输入和输出)。谢谢你!

巫马翰翮
2023-03-14

我收到了相同的错误消息,但使用了不同的类。我目前使用的poi版本是poi ooxml 3.9,但它仍然存在问题。现在我解决了我的问题,我认为这个问题是在您第一次获得工作簿实例时出现的。

当我将数据写入文件时,我是这样做的(针对异常和关闭的实践规则):

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

当我获得这样的工作簿实例时,我得到了“无法从 /docProps/app.xml获得输入流”的错误消息:

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

当我修复这个问题时,修改过的代码

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

在我的例子中,无论您是从同一个文件打开、读取和写入,还是从一个文件读取然后写入另一个文件,都没有关系。如果您阅读poi源代码,您会看到我使用的工厂方法可能会调用OPCPackage类中的open()方法。尝试使用getting InputStream方法作为其参数

 类似资料:
  • 问题内容: 我正在一个项目中,该项目需要读取Excel工作簿,调用必要的Web服务,然后从Web服务获取响应,并将该信息输入到已读取的同一Excel工作簿中。 这是我尝试写入Excel工作簿时遇到的错误: 这是我打开文件/读取的代码: 之后,我读取每一行并提取每个单元格值。 完成此操作后,我将在“成功和结果消息”标题下创建单元格,然后执行以下操作: 有没有人遇到过类似的问题? 问题答案: 列出的当

  • 这是我读写现有excel文件的课程。我一直在主类中通过传递filePath和fileName来调用这些函数。 当我在main中使用readExcel获取一个工作簿并调用这个函数时: 我得到了正确的行,并且能够调用此行上的所有函数。但是对于写Excel()中完全相同的工作表中的完全相同的行,我得到了一个空指针异常(上面代码中***前面的行)。getRow()在这里给我null。我在这里做错了什么?

  • 我已经编写了用于编写xlsm(Excel2007)的java文件。 使用ApachePOI库,编写xlsx文件是成功的。编写xlsm文件是成功的。但我无法打开xlsm文件,因为打开xlsm文件时出错。 使用ApachePOI库编写xlsm文件可行吗? 如果可以编写xlsm,请提供如何使用ApachePOI库编写xlsm文件的指南。 谢谢

  • 问题内容: 我正在创建一种从文件写入和读取工作簿的方法,但是当我第二次调用此方法时。发生错误:org.apache.xmlbeans.impl.values.XmlValueDisconnectedException 问题答案: 同意Akokskis,编写两次导致问题的文件,但是您可以在编写之后尝试重新加载工作簿,这样便可以正常工作。例如

  • 我一直在寻找一个答案或一个例子。我开始使用GoogleAPI sheets v4,并找到了将数据附加到电子表格的答案,其中的问题在这个堆栈问题中 尽管该解决方案是功能性的,但它不可伸缩,它以增量方式向工作表中添加值,而不检查标题。我真正想做的是为标题行“Defect”=“x”标题行“Date”=y等添加hashmap之类的值。 有没有人有一个解决这个问题的示例,或者你能告诉我一个可以用来回答这个问

  • 问题内容: 我已经在ubuntu中安装了openpyxl。 现在我正在运行带有xlsx文件的openpyxl。 导入模块时,它给我以下错误。 谁能知道我该怎么做才能解决问题? 问题答案: 我想你要: 请注意此处名称的大写。