The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI ...

问题详情

The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)

导致原因

使用JAVA中的上传EXCEL时,手动将xlsx文件或者xls文件互相手动修改后缀上传时导致报错。主要原因是因为手动将一个xlsx文件的后缀更改为xls后,实际上并没有将文件的格式从Office Open XML格式更改为Excel 97-2003格式。因此,当您将这个文件上传到您的程序中时,程序会尝试使用HSSFWorkbook来处理该文件,但是由于该文件实际上是Office Open XML格式,因此会报错。

解决方案

使用第三方工具Apache Tika来检测文件MIME格式,文件的MIME格式是唯一的,例如EXCEL的文件格式后缀为XLSL或者XLS,其中MIME格式为"application/vnd.ms-excel"或"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"之一。因此我们可以通过MIME格式来准确的校验文件的真实格式。

maven导入依赖

<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-core</artifactId>
    <version>1.28</version>
</dependency>

校验文件格式使用的代码

public boolean validateFile(MultipartFile file) throws IOException {
    //文件流
    InputStream inputStream = file.getInputStream();
    //创建tika分析实例
    Tika tika = new Tika();
    //检测文件的MIME类型
    String mimeType = tika.detect(inputStream);
    //判断文件类型进行相应操作
    if (mimeType.equals("application/vnd.ms-excel") || mimeType.equals("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")) {
        Workbook wb;
        if (mimeType.equals("application/vnd.ms-excel")) {
            wb = new HSSFWorkbook(inputStream);
        } else {
            wb = new XSSFWorkbook(inputStream);
        }
        ...
        return true;
    } else {
        inputStream.close();
        return false;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值