Java用POI读取excel文件,报异常:NotOLE2FileException: Invalid header signature; read xxx, expected 0xE11AB1A1

本文记录了在使用POI进行Excel导出时遇到的模板文件损坏问题,并详细阐述了解决过程,包括调整Maven配置避免文件在打包过程中被错误过滤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天在开发时遇到了极其坑爹的问题。开发的主要功能是在导出某些订单数据至Excel,因为自己一个一个去写表头这种操作代码耦合性实在太强,到时想要修改表头格式又需要回到去代码中修改,所以这是一种很愚蠢的零分操作!那么在这里就用到了POI的Excel模版功能(POI是apache提供给java对office进行读写操作的库,也是前些天开发时才了解到)。模版作为一种资源文件就被我存放在聚合工程的某一module的/src/main/resources/exportconfig 目录下:

那么,具体问题是啥呢?就是我标题中说到的异常:

NotOLE2FileException: Invalid header signature; read 0xE011BDBFEFBDBFEF, expected 0xE11AB1A1E011CFD0

我也是第一次遇到如此神奇的异常呀!那么它究竟是个什么意思?经过相关搜索后发现是当POI在进行模板文件加载后,发现这个文件的格式不是标准的excel文件(.xls或者.xlsx),这个文件的格式不是excel,那么POI当然也就没办法打开了!

诸如stackoverflow这样的网站也有不少人贴出了这样的问题,上面给出的回复是我看到的excel文件仅仅是“看起来是”,事实上这可能是一个破损的或者是一个后缀强行加上了“xls”的其他格式的文件,所以很多热心网友给出的解决方案是通过excel打开这个文件,然后将文件“另存为”xls格式。在我满怀希望地经过多次这样的操作后,我发现这根本没有一点卵用(事实上,我发现无论是excel还是mac的numbers都可以很顺利地打开文件)。所以我隐隐觉得不应该是模板本身的格式问题。经过了多次奇奇怪怪的操作后,结果很显然是令我绝望的。当然,这些失败的经验也给我了一点启发:

会不会是工程在部署时格式被破坏了呢??学长大佬的一句话让我有一种茅塞顿开之感:工程在部署时是打成war包的,那么是不是在打包的时候出了问题?

于是我在本地将工程打成war包,命令如下:

mvn package -Dmaven.test.skip

在打包后,找到excel模板所在的jar包,解压后,打开,惊人地发现格式已经被破坏了!!


(这里出于隐私,就不贴出原本的模板文件了)

那么会是什么问题呢?但是可以肯定的是maven打包的时候出了问题!在经过相关查看后,发现pom文件中有这么一段<build> </build>下的依赖:

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
    </resource>
</resources>

这段依赖是什么意思呢?通过这段依赖可以根据不同的环境(测试、预发、线上等环境)来过滤项目中的属性资源配置。到了这里,我大概也知道了就是因为这段依赖导致打包时excel文件被修改了。当问题可以被具像化时,我认为离成功就不远了!于是我就满怀激情地去调bug了!

首先我想到,那么可不可以直接将filtering改成false呢?结果很明显是不可以的——当不对属性资源进行过滤替换时,会出现spring无法读取某个变量的情况!

既然这个方案不行,那么接下来又尝试其他的方案:filtering下配置<exclude> </exclude>,根据网上其他的解决方案,配置了<exclude></exclude>之后这个问题也没有被解决,当时我的心态都快奔了 - -

接着我又准备在maven的打包插件下配置<nonFilteredFileExtensions> </nonFilteredFileExtensions>,顾名思义就是不被过滤的文件后缀:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <webResources>
            <resource>
                <!-- 元配置文件的目录,相对于pom.xml文件的路径 -->
                <directory>src/main/webapp/WEB-INF</directory>
                <!-- 目标路径 -->
                <targetPath>WEB-INF</targetPath>
                <filtering>true</filtering>
            </resource>
        </webResources>
        <nonFilteredFileExtensions>
            <nonFilteredFileExtension>xls</nonFilteredFileExtension>
            <nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
        </nonFilteredFileExtensions>
    </configuration>
</plugin>

这样的解决方案理应没什么毛病啊!那么为什么不对呢!为什么呢!为什么要对我这么残忍!然而我会放弃么?!不存在的,我这样身残志坚的选手人生字典中没有屈服这一说!于是,我尝试添加一个maven的插件,试图在maven打包时可以放过我的excel文件:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <configuration>
        <encoding>UTF-8</encoding>
        <nonFilteredFileExtensions>
            <nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
            <nonFilteredFileExtension>xls</nonFilteredFileExtension>
        </nonFilteredFileExtensions>
    </configuration>
</plugin>

然后!问题就被解决了!通过maven本地打包后的excel模板文件正常了!

喜大普奔,撒花庆祝!

over~~~

### 解决方案分析 当遇到 `Invalid header signature` 错误时,通常是因为尝试读取文件并非有效的 OLE2 文档(即 `.xls` 或兼容格式)。此错误表明 Apache POI 库期望找到特定的头部签名 (`0xE11AB1A1E011CFD0`) 来确认这是一个合法的 Excel 文件,但实际上读到的是其他数据。 以下是可能的原因及其解决方案: #### 原因一:文件损坏 如果 Excel 文件已损坏,则可能导致无法识别其头部签名。可以尝试修复该文件或将原始数据重新导出为新的 Excel 文件[^1]。 #### 原因二:文件类型不匹配 Apache POI 的 HSSF 和 XSSF 组件分别用于处理 `.xls` 和 `.xlsx` 文件。如果使用了错误的组件来打开文件,也可能引发此类错误。例如,使用 HSSFWorkbook 打开 `.xlsx` 文件会失败[^4]。 **解决方法** 确保使用的 API 类型与目标文件一致: - 对于 `.xls` 文件,应使用 `HSSFWorkbook`。 - 对于 `.xlsx` 文件,应使用 `XSSFWorkbook`。 代码示例如下: ```java import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public Workbook getWorkbook(String filePath) throws IOException { try (InputStream inputStream = new FileInputStream(filePath)) { if (filePath.toLowerCase().endsWith(".xls")) { return new HSSFWorkbook(inputStream); // For .xls files } else if (filePath.toLowerCase().endsWith(".xlsx")) { return new XSSFWorkbook(inputStream); // For .xlsx files } } throw new IllegalArgumentException("Unsupported file type"); } ``` #### 原因三:文件被伪装成 Excel 文件 某些情况下,上传的文件可能是其他类型的文档(如 PDF、TXT),但却被重命名为 `.xls` 或 `.xlsx` 后缀。这种操作不会改变文件的实际内容,因此仍会导致头部签名验证失败[^3]。 **解决方法** 在程序中增加额外校验逻辑,判断文件的真实 MIME 类型或扩展名是否与其实际内容相符。可以通过第三方库(如 Tika)实现更精确的内容检测。 #### 原因四:文件编码问题 有时由于字符集转换或其他技术原因,Excel 文件中的元数据可能会遭到破坏,从而影响头部签名的有效性[^2]。 **解决方法** 建议从源头解决问题——检查生成这些文件的应用程序设置,或者手动保存一份新副本以排除潜在干扰因素。 --- ### 总结 综上所述,要彻底消除 `Invalid header signature` 错误需逐一排查上述可能性并采取相应措施加以修正。优先考虑更换正确的解析器版本以及核实输入源的真实性最为重要。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值