我有一个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 8u201
和org.apache.poi:poi:4.1.0
(也尝试过4.0.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));
时始终不会出现相同的问题。