问题详情:
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;
}
}