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

为什么Apache poi的工作簿。close()方法是否将内容写入输入文件?

宇文修文
2023-03-14

ApachePOI的文档(版本3.17)说

无效关闭()

抛出java。伊奥。IOException

关闭从中读取工作簿的基础输入资源(文件或流)。

我的代码从模板文件创建工作簿,并对其进行处理,然后将其写入新文件。模板文件应该保持不变。但是当我调用close()方法时,文件的更改方式与输出文件相同。

有人能解释一下吗?close()方法中是否有类似于内置write()调用的功能?这是一个bug还是一个特性?

到目前为止,我的解决方案是不使用close()调用,但不知何故它感觉不完整。

    String inPath = "/home/elmicha/test/template.xlsx";
    String outPath = "/home/elmicha/test/out.xlsx";

    try {
        Workbook xlsxFile = WorkbookFactory.create(new File(inPath));

        xlsxFile.getSheetAt(0).createRow(0).createCell(0).setCellValue("test");

        try (FileOutputStream pOuts = new FileOutputStream(outPath)) {
            xlsxFile.write(pOuts);
            
        xlsxFile.close();
        
        }

    } catch (IOException | InvalidFormatException | EncryptedDocumentException ex) {
        //...
    }

共有2个答案

齐栋
2023-03-14

只有在忽略FileNotFoundException时,使模板文件只读的“解决方案”才能起作用。。。(权限被拒绝)文档引起。然后关闭。我们应该设置文件在处理后可写,以便进一步使用。

因此,以下方法将起作用:

import org.apache.poi.ss.usermodel.*;

import java.io.File;
import java.io.FileOutputStream;

class ReadAndWriteExcelWorkbook {

 public static void main(String[] args) throws Exception {

  File templatefile = new File("file.xlsx");

  templatefile.setWritable(true);
  try (Workbook workbook = WorkbookFactory.create(templatefile)) { //at this point the file must be writable
  //try (Workbook workbook = WorkbookFactory.create(templatefile, null, true)) { //this will not work

   Sheet sheet = workbook.getSheetAt(0);

   for (int r = 0; r < 10; r++) {
    Row row = sheet.getRow(r);
    if (row == null) row = sheet.createRow(r);
    Cell cell = row.getCell(r);
    if (cell == null) cell = row.createCell(r);
    cell.setCellValue("changed");
   }

   FileOutputStream out = new FileOutputStream("fileNew.xlsx");
   workbook.write(out);
   out.close();

   templatefile.setWritable(false);

  } catch (java.io.FileNotFoundException ioex) {
   ioex.printStackTrace(); //we simply do ignoring this FileNotFoundException
  }

  templatefile.setWritable(true);

 }
}

注意事项:

WorkbookFactory。创建(模板文件)模板文件必须是可写的,因为它默认为WorkbookFactory。创建时将布尔只读设置为。因此,如果此时将模板文件设置为只读,则WorkbookFactory。创建(模板文件)将失败。

我们不能使用WorkbookFactory.create(templatefile, null, true)-将boolean只读设置为true-因为这将在workbook.write失败,而POIXMLDocument.write将更改提交给底层OPCPackage

姚雅珺
2023-03-14

这很不寻常。我不明白为什么要写入模板文件。这当然不是我的经历。你可以试试:

  • 使用FileInputStream而不是File来使其无法写入模板文件。
  • 使用试用资源自动关闭工作簿

这里有一个例子:

String inPath = "/home/elmicha/test/template.xlsx";
String outPath = "/home/elmicha/test/out.xlsx";

try (Workbook xlsxFile = WorkbookFactory.create(new FileInputStream(inPath))) {
    xlsxFile.getSheetAt(0).createRow(0).createCell(0).setCellValue("test");

    try (FileOutputStream pOuts = new FileOutputStream(outPath)) {
        xlsxFile.write(pOuts);
    }

} catch (IOException | InvalidFormatException | EncryptedDocumentException ex) {
    //...
}

或者也许:

String inPath = "/home/elmicha/test/template.xlsx";
String outPath = "/home/elmicha/test/out.xlsx";

try (Workbook xlsxFile = WorkbookFactory.create(new FileInputStream(inPath));
    FileOutputStream pOuts = new FileOutputStream(outPath)) {

    xlsxFile.getSheetAt(0).createRow(0).createCell(0).setCellValue("test");
    xlsxFile.write(pOuts);


} catch (IOException | InvalidFormatException | EncryptedDocumentException ex) {
    //...
}
 类似资料:
  • 然后另一个问题是工作簿的名称都不同,所有300个。是否有一个宏可以复制我打开的工作簿,而不是每次都输入实际的名称?

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

  • 我有一段代码,目前正在写入一个

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

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

  • 本文向大家介绍C#实现写入文本文件内容的方法,包括了C#实现写入文本文件内容的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现写入文本文件内容的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的C#程序设计有所帮助。