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

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

傅博容
2023-03-14

我正在尝试根据通用模板生成新的excel文件。我正在打开模板excel文件,编辑它并将其保存在新位置。要编写文件,我正在使用FileOutputStream,并且我在编写后关闭流以保存它。整个html" target="_blank">过程正常工作,但新创建的excel文件没有正确保存。我的模板文件为35kb,我新创建的excel文件仅显示30kb。当我打开新创建的excel文件时,我可以看到写入的数据,我需要保存并关闭它以反映正确的36kb大小。
新的excels需要上传到外部应用程序,该应用程序在直接上传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();

}

共有2个答案

孔磊
2023-03-14

该问题已使用excel的“按共享字符串”属性解决。我更新了工作簿构造函数调用,如下所示:

SXSSFWorkbook工作簿=新SXSSFWorkbook(workbookOld,RowAccessWindowsSize,true,true)

第二个true参数用于共享字符串的使用。使用此属性可以使数据对外部应用程序可见,而无需再次打开和保存数据。然而,大小问题仍然存在,为什么使用共享字符串仍然有效尚不清楚。有关共享字符串的更多信息,请查看此链接。

周瀚
2023-03-14

像XSSFWorkbook这样的打包I/O流应该首先关闭,可能仍在为打包的OutputStream编写尾声。低水位流可能被关闭。

请注意,一些包装类将在自己的关闭中自己关闭包装流。

由于try-with-资源是理想的,在异常的情况下也关闭,最终版本将是:

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资源发生的。

 类似资料:
  • 我在tomcat上配置了ssl,在IE上禁用了tls支持,并启用了ssl支持,但我仍然得到错误消息 Tomcat设置

  • 了解如何在Java编程中使用POI Excel。 以下是示例 - 如何使用Java创建空白Excel工作表。 如何使用Java将数据写入Excel工作表。 如何使用Java在电子表格中创建不同类型的单元格。 如何使用Java将不同样式应用于电子表格中的单元格。 如何使用Java将字体应用于单元格的内容。 如何使用Java为单元格中的文本设置方向。 如何使用Java向单元格的内容添加超链接。 如何使

  • 如果有一个单元格带有公式并保存文件,那么在手动关闭文件后,excel将被要求保存更改?如何从程序中完全保存文件,因为如果不保存,我无法通过读取文件获得正确的值。 当前文件保存: 公式更新: 公式: 文件读取: 单元格值:-20000000,-10002399000 程序公式单元格值:0,文件公式单元格值:-0653687014

  • 我有一个小的java应用程序,它需要两个包含各种数据的电子表格,并创建一个包含多个表格和有组织的数据/方程等的巨大工作簿,所有这些都在一个漂亮的格式化工作簿中。我在Eclipse中使用Apache POI创建了这个。 我想在实际的程序中存储一张表,它是“主要概述文档”,本质上是关于如何阅读其余表的指南。 这个概述永远不会改变,所以我不想在程序中编写/编码它,而是想将工作表保存在我的实际源文件夹中(

  • 我有一个中间件,它可以在不允许他访问路由的情况下限制对路由的访问。我把它添加到: 路线: 控制器功能:: 现在说真的:如果角色id为2,中间件应该返回404视图而不执行路由。但它打印执行字符串在屏幕上! 1.如果我删除或评论: 它返回 如果我把路线登记移到 “网络”= 和评论: 然后屏幕显示“中间件”,中间件工作 我的问题是,如果我使用它,为什么middlware允许函数执行 在第一个手柄功能?为

  • 问题内容: 我是Apache POI Java开发的新手,我正在尝试使用以下代码在Excel中添加水印。但是水印标识会覆盖其后面的内容。我想在背景中添加水印。 您能帮我告诉我如何在excel中添加水印(在XSSF或HSSF工作簿中)或在exel标头中添加图片吗? 感谢Mudassir 问题答案: Microsoft Excel没有内置的水印功能。但是,有两种方法可以模拟水印的外观 ..不幸的是,a