我有一个存储 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/