0%

一个POI创建Workbook的Bug?

笔者在 Win10 下使用 POI 4.1.2 版本读写 Excel 文件时遇到了一个奇怪的问题,经过一翻探索终于找到了解决方案。故有此记。

闲话不多说,先上代码!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void test() throws IOException {
File excelFile = FileUtils.toFile(getClass().getResource("/test.xlsx"));
File outputDir = new File("E:/test");
FileUtils.copyFileToDirectory(excelFile, outputDir);
File copyFile = FileUtils.getFile(outputDir, excelFile.getName());

Workbook workbook = WorkbookFactory.create(copyFile);

// 读取 Excel 文件内容
// 修改 Excel 内容

FileOutputStream stream = new FileOutputStream(copyFile);
workbook.write(stream);
IOUtils.close(stream);
IOUtils.close(workbook);
}

执行以上代码时,很奇怪的地方在于,只读取文件并不会有任何问题。但是,如果修改了内容并要回写文件就会报以下错误:

1
org.apache.poi.ooxml.POIXMLException: java.io.EOFException: Unexpected end of ZLIB input stream

最初笔者以为是什么资源未正确关闭引起的,仔细检查后并未发现有不妥之处。经过一番搜索,在 Stack Overflow 发现了一个相关帖子,提及这可能是 POI 的一个 Bug,建议不要使用文件对象创建 Workbook,而应使用输入流。

据此,将创建代码改为如下形式:

1
Workbook workbook = WorkbookFactory.create(new FileInputStream(copyFile));

错误就此解决。