使用Apache POI 导入导出时出现You need to call a different part of POI to process this data (eg XSSF instead of HSSF)Java异常
问题复现
在学习导出功能时使用HSSFWorkbook
导出了一个xxx.xlsx
格式的文件,然后用XSSFWorkbook
的读取方式来拿文件去导入时出现了这个bug
这是当时做导出测试代码
Workbook wb = new HSSFWorkbook();
CreationHelper creationHelper = wb.getCreationHelper();
Sheet sheet = wb.createSheet("new sheet");
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("dsad");
try (OutputStream fileOut = new FileOutputStream("MyExcel.xlsx")) {
wb.write(fileOut);
}
然后那这个去做导入操作,因为导出的格式为.xlsx
就使用OPCPackage
去获取文件
OPCPackage pkg = OPCPackage.open("MyExcel.xlsx");
XSSFWorkbook wb = new XSSFWorkbook(pkg);
Sheet newSheet = wb.getSheet("new sheet");
Row row = newSheet.getRow(0);
Cell cell = row.getCell(0);
System.out.println(cell.getStringCellValue());
pkg.close();
然后在执行导入时就报了这个错误
org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException: The supplied data appears to be in the OLE2 Format.
You are calling the part of POI that deals with OOXML (Office Open XML) Documents. You need to call a different part of POI
to process this data (eg HSSF instead of XSSF)
问题分析
HSSFWorkbook
对应的是xls
,XSSFWorkbook
对应的是xlsx
,导入导出时所使用的Workbook
对象要一致。如果使用xls
就都用HSSFWorkbook
,使用xlsx
就都用XSSFWorkbook
。
问题解决
// 将导出新建的 HSSFWorkbook 换成 XSSFWorkbook
Workbook wb = new XSSFWorkbook();
CreationHelper creationHelper = wb.getCreationHelper();
Sheet sheet = wb.createSheet("new sheet");
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("dsad");
try (OutputStream fileOut = new FileOutputStream("MyExcel.xlsx")) {
wb.write(fileOut);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义