java - Apache POI : Writing into excel with Java: opening Workbook, java.io.IOException : Cannot write data, 文档似乎已关闭

标签 java excel

我有一个存储 Excel 工作簿的类:

private Map<String, Workbook> workbooks = new HashMap();

public Workbook createWorkbook(String name)  {
    Workbook workbook = new XSSFWorkbook();
    workbooks.put(name, workbook);
    return workbook;
}

以及使用指定名称写入工作簿的方法:

public void write(List<ExcelData> data, String workbookName) {
   Workbook workbook = workbooks.get(workbookName);
   CreationHelper createHelper = workbook.getCreationHelper();

   ... write stuff

   FileOutputStream fileOut = new FileOutputStream(workbookName + ".xlsx");
   workbook.write(fileOut);
   fileOut.close();

   workbook.close();
}

但是,当我尝试为同一工作簿调用方法 write 两次时:

testExcel.write(data, "Default");
testExcel.write(data1, "Default");

我明白了

Exception in thread "main" java.io.IOException: Cannot write data, document seems to have been closed already

错误。我知道我可以像这样打开现有的 Excel 工作簿:

FileInputStream inputStream = new FileInputStream(new File(excelFilePath));
Workbook workbook = WorkbookFactory.create(inputStream);

但我想知道是否有办法通过存储 Workbook 变量来绕过它。其内在机制是什么?调用workbook.write()后变量是否失效?

最佳答案

您可以将工作簿的名称存储在列表中,而不是存储工作簿本身

private List<String> workbooks = new ArrayList();

重写createWorkbook以仅存储Excel工作表的名称 重写 write 方法,以便它创建一个新工作簿,如下所示

public void write(List<ExcelData> data, String workbookName) {

Workbook workbook = new XSSFWorkbook();
CreationHelper createHelper = workbook.getCreationHelper();

...写东西

 FileOutputStream fileOut = new FileOutputStream(workbookName + ".xlsx");
 workbook.write(fileOut);
 fileOut.close();

 workbook.close();
}

关于java - Apache POI : Writing into excel with Java: opening Workbook, java.io.IOException : Cannot write data, 文档似乎已关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57395665/

相关文章:

excel - 如何使单元格值以 Excel VBA 中的其他单元格值为条件?

excel - 甲骨文 APEX : Export Interactive Report to Excel

excel - 将文件名的一部分指定为变量

python - 编辑 csv 以按特定顺序显示 5 列,同时将格式应用于日期时间字段

java - Xpath 包含一个变量

java - 将数据插入数据库会卡住我的应用程序

vba - 为什么当我按 Run Sub 时 Excel VBA 会提示我输入宏名称

java - 权限对话框

java - JSON - 检查数组是否存在

java - 使用 JDBC 读取 csv 文件时如何转义 '"'?