gpt4 book ai didi

java - 即使在执行 fileoutputstream.close() 之后,Apache-POI 也不保存 Excel 工作簿

转载 作者:行者123 更新时间:2023-12-02 05:05:00 26 4
gpt4 key购买 nike

我正在尝试基于通用模板生成新的 Excel 文件。我正在打开模板 Excel 文件,对其进行编辑并将其保存在新位置。为了写入文件,我使用 FileOutputStream 并在写入后关闭流以保存它。整个过程工作正常,但新创建的 Excel 文件未正确保存。我的模板文件有 35kb,而我新创建的 Excel 文件仅显示 30kb。当我打开新创建的 Excel 文件时,我可以看到写入的数据,我需要保存它并关闭它以反射(reflect) 36kb 的正确大小。
新的 Excel 需要上传到外部应用程序,直接上传 30kb 未保存的 Excel 时显示“未找到数据”,而 36kb 保存的文件成功上传文件。

我尝试了互联网上建议的各种不同方法来完成同样的事情,但它们都没有生成正确的 Excel 文件。我使用的是 java 1.7 和 apache-poi 版本 3.17。

以下是我的代码示例:-

public void createExcelFiles() throws ParseException, IOException {

File file = new File(ExcelTemplatePath);
FileInputStream fip = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(excelOutputFile);

XSSFWorkbook workbookOld = new XSSFWorkbook(fip);
try (SXSSFWorkbook workbook = new SXSSFWorkbook(workbookOld, rowAccessWindowSize)) {

if (makeLargeFiles) {
SXSSFSheet sheet = (SXSSFSheet) workbook.getSheetAt(0);
makeExcelFile.makeLargeFile(sheet);
workbook.write(fos);
} else {
Sheet sheet = workbookOld.getSheetAt(0);
makeExcelFile.makeNormalFile(sheet);
workbookOld.write(fos);

}
fos.close();
fip.close();
workbook.close();
}
workbookOld.close();

}

最佳答案

XSSFWorkbook 这样的包装 I/O 流应该首先关闭,可能仍在向包装的 OutputStream 写入尾声。并且低层流可能被关闭。

请注意,某些包装类会在自己的 close 内自行关闭包装的流。

由于 try-with-resources 是理想的,为了在出现异常时也关闭,最终版本将是:

public void createExcelFiles() throws ParseException, IOException {
File file = new File(ExcelTemplatePath);
try (FileInputStream fip = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(excelOutputFile);
XSSFWorkbook workbookOld = new XSSFWorkbook(fip);
SXSSFWorkbook workbook = new SXSSFWorkbook(workbookOld, rowAccessWindowSize)) {

if (makeLargeFiles) {
SXSSFSheet sheet = (SXSSFSheet) workbook.getSheetAt(0);
makeExcelFile.makeLargeFile(sheet);
workbook.write(fos);
} else {
Sheet sheet = workbookOld.getSheetAt(0);
makeExcelFile.makeNormalFile(sheet);
workbookOld.write(fos);

}
}
// Doing in reverse order of declaration:
// 1. workbook.close();
// 2. workbookOld.close();
// 3. fos.close();
// 4. fip.close();
}

在您的代码中出现了逆转,并且通过 try-with-resources 显式地发生了关闭。

关于java - 即使在执行 fileoutputstream.close() 之后,Apache-POI 也不保存 Excel 工作簿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56358431/

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