运行脚本遇OfficeXmlFileException错误:需用XSSF替代HSSF处理Office2007+XML
解决org.apache.poi.poifs.filesystem.OfficeXmlFileException错误
这个错误我太熟了!本质就是你用错了POI的模块——你现在调用的是处理旧版.xls(OLE2格式)的HSSF系列API,但要读取的是新版Office 2007+的.xlsx(OOXML格式)文档,所以POI直接给你抛了这个明确的提示。下面是具体的解决方法:
1. 确保引入正确的POI依赖
首先检查你的POM文件,必须引入处理OOXML格式的poi-ooxml模块,而且版本要和基础的poi模块保持一致,避免版本冲突:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> <!-- 替换成你实际使用的POI版本 --> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> <!-- 版本必须和poi模块完全一致 --> </dependency>
2. 替换代码中的API实现
把原来使用HSSF的代码,替换成对应XSSF的类:
错误示例(处理.xls的代码):
package com.examplesite.base; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import java.io.FileInputStream; public class ExcelReader { public static void main(String[] args) throws Exception { HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream("test.xlsx")); // 这里用错了API! // ... 后续操作 } }
修正后的代码(处理.xlsx):
package com.examplesite.base; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; public class ExcelReader { public static void main(String[] args) throws Exception { XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream("test.xlsx")); // ... 后续操作 } }
3. 更通用的兼容写法(同时支持.xls和.xlsx)
如果你的程序需要同时处理两种格式的Excel文件,推荐使用POI提供的WorkbookFactory,它会自动识别文件格式并创建对应的Workbook实例,不用手动区分HSSF和XSSF:
package com.examplesite.base; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import java.io.File; public class ExcelReader { public static void main(String[] args) throws Exception { Workbook workbook = WorkbookFactory.create(new File("test.xlsx")); // 不管是.xls还是.xlsx都能处理 // 后续操作统一使用Workbook接口,无需关心具体实现类 org.apache.poi.ss.usermodel.Sheet sheet = workbook.getSheetAt(0); // ... 其他操作 workbook.close(); // 记得关闭资源 } }
额外注意事项
- 确认你读取的文件确实是
.xlsx格式,有时候文件后缀名可能被错误修改,导致格式不匹配; - 如果使用较新版本的POI(比如5.x+),部分API可能有调整,记得参考官方文档调整代码;
- 操作完Workbook后一定要调用
close()方法释放资源,避免内存泄漏。
内容的提问来源于stack exchange,提问作者bugfinder




