任务运行两次时,Apache POI将数据附加到xlsx文件

时间:2019-04-30 22:13:52

标签: apache-poi

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

1 个答案:

答案 0 :(得分:1)

正如Apache POI - FileInputStream works, File object fails (NullPointerException)所述,从XSSFWorkbook创建File有一个缺点,那就是在{{ 1}}。即使XSSFWorkbook.write写入另一个文件也是如此。但是,甚至不可能显式地写入同一文件,因为write在创建工作簿后保持打开状态,因此写入同一文件会导致异常。

因此,使用

File创建XSSFWorkbook
File
Workbook workbook = WorkbookFactory.create(file); file文件时,

不是一个好主意。相反,需要使用*.xlsx创建Workbook

FileInputstream

尽管链接的SO Q / A来自2017年,但使用Workbook workbook = WorkbookFactory.create(new FileInputStream(file)); 时始终不会出现相同的问题。