You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

运行脚本遇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

火山引擎 最新活动