【问题标题】:Apache POI appending data to xlsx file when task ran twice任务运行两次时,Apache POI 将数据附加到 xlsx 文件
【发布时间】:2019-04-30 22:13:51
【问题描述】:

我有一个template.xls 文件,我从一些数据库查询中添加数据。我添加数据并生成一个名为yyyyMMddHHmmss.xls 的新文件。这很好用。文件越来越大,所以我尝试对xlsx 文件做同样的事情。当我第一次生成文件时,它工作得很好。如果我再次运行该过程(即使我重新启动我的 java 应用程序),它会以某种方式将最后一个文件保留在内存中并将数据附加到该文件中。在这两种情况下,它都会从template.xls(x) 中提取源文件,这是一个未修改的文件。

两者之间的代码是相同的,只是在后一种情况下我传递的是xlsx 而不是xls

ClassLoader classLoader = getClass().getClassLoader();
File file = new File(Objects.requireNonNull(classLoader.getResource("template.xlsx")).getFile());
Workbook workbook = WorkbookFactory.create(file);
// write data
Date date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
String currentDate = formatter.format(date);
FileOutputStream fileOutputStream = new FileOutputStream(currentDate + ".xlsx");
workbook.write(fileOutputStream);
fileOutputStream.close();
workbook.close();

我正在使用Java 8u201org.apache.poi:poi:4.1.0(也尝试过4.0.1

【问题讨论】:

  • 试试用Workbook workbook = WorkbookFactory.create(new FileInputStream(file));代替File是否可以直接解决这个问题。阅读stackoverflow.com/questions/46146161/…,了解使用File 创建XSSFWorkbook 的缺点。
  • @AxelRichter 如果你想推广它来回答这个问题

标签: apache-poi


【解决方案1】:

正如Apache POI - FileInputStream works, File object fails (NullPointerException) 中所述,从File 创建XSSFWorkbook 的缺点是,在该工作簿中所做的所有更改将始终存储到该文件中,而XSSFWorkbook.write。即使write 写入另一个文件也是如此。但是甚至不可能显式写入同一个文件,因为File 在创建工作簿后保持打开状态,因此写入同一个文件会导致异常。

因此,使用

File 创建 XSSFWorkbook
Workbook workbook = WorkbookFactory.create(file);

file*.xlsx 文件时,这不是一个好主意。相反,Workbook 需要使用 FileInputstream 创建:

Workbook workbook = WorkbookFactory.create(new FileInputStream(file));

虽然链接的 SO Q/A 来自 2017 年,但今天使用 apache poi 4.1.0 时始终不会出现同样的问题。

【讨论】:

    猜你喜欢
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 2019-08-12
    • 2016-02-15
    • 1970-01-01
    相关资源
    最近更新 更多