POIFSFileSystem报错分析及解决方案
一、
在使用Apache POI库处理Excel文件时,POIFSFileSystem
类常被用于读取Excel 972003格式的文件(即.xls文件),在实际操作中,开发者可能会遇到各种与POIFSFileSystem
相关的错误,本文将详细解析这些常见错误及其解决方案,并附带相关FAQ。
二、常见错误及解决方案
1. OfficeXmlFileException异常
错误信息:
org.apache.poi.poifs.filesystem.OfficeXmlFileException: 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)
原因:
尝试使用HSSFWorkbook
来读取Excel 2007及更高版本(.xlsx)的文件,而HSSFWorkbook
只能读取Excel 972003(.xls)文件。
解决方案:
根据文件扩展名选择适当的Workbook实现类,如果文件是Excel 2007及更高版本,应使用XSSFWorkbook
。
String fileName = "example.xlsx"; InputStream inp = new FileInputStream(fileName); Workbook workbook; if (fileName.endsWith(".xls")) { workbook = new HSSFWorkbook(inp); } else if (fileName.endsWith(".xlsx")) { workbook = new XSSFWorkbook(inp); }
或者,更优雅的方式是使用WorkbookFactory
来自动判断文件类型并创建相应的Workbook对象:
Workbook workbook = WorkbookFactory.create(inp);
2. NPOIFSFileSystem类找不到
错误信息:
java.lang.NoClassDefFoundError: org/apache/poi/poifs/filesystem/NPOIFSFileSystem
原因:
项目中缺少必要的POI依赖包。
解决方案:
确保在项目的构建文件中添加以下Maven依赖项:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poiooxml</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poiooxmlschemas</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poiscratchpad</artifactId> <version>4.1.2</version> </dependency>
3. NotOLE2FileException异常
错误信息:
org.apache.poi.poifs.filesystem.NotOLE2FileException: Invalid header signature; read 0x0010000000060809, expected 0xE11AB1A1E011CFD0 Your file appears not to be a valid OLE2 document
原因:
尝试读取一个不是有效的OLE2文档的文件。
解决方案:
确保输入文件是一个有效的Excel 972003(.xls)文件,如果需要读取其他类型的文件,请使用相应的API。
4. FileMagic类找不到
错误信息:
java.lang.NoSuchMethodError: org/apache/poi/poifs/filesystem/FileMagic
原因:
POI库版本不兼容或缺少某些依赖项。
解决方案:
检查并统一所有POI相关的依赖项版本,如果使用的是POI 4.1.2版本,则所有相关依赖都应为4.1.2版本。
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poiooxml</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poiooxmlschemas</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poiscratchpad</artifactId> <version>4.1.2</version> </dependency>
在使用Apache POI处理Excel文件时,遇到POIFSFileSystem
相关的错误通常是由于文件格式不匹配或缺少必要的依赖项所致,通过正确选择Workbook实现类并确保所有必要的依赖项已添加到项目中,可以有效解决这些问题,建议使用WorkbookFactory.create()
方法来简化Workbook对象的创建过程,并根据文件内容自动选择合适的实现类。
四、FAQs
Q1: 如何确定Excel文件是972003格式还是2007+格式?
A1: 可以通过文件扩展名(.xls表示972003格式,.xlsx表示2007+格式)或者使用Tika
等库来检测文件的实际内容类型,如果文件扩展名与实际内容类型不符,建议以实际内容类型为准。
Q2: 如果遇到java.io.IOException: Stream closed
异常怎么办?
A2: 这个异常通常是由于流被多次关闭或者在读取过程中流被意外关闭导致的,确保流在使用过程中保持打开状态,并且在使用完毕后正确关闭流,使用trywithresources
语句可以自动管理资源,避免此类问题的发生。
try (InputStream inp = new FileInputStream(fileName)) { Workbook workbook = WorkbookFactory.create(inp); } catch (IOException | InvalidFormatException e) { e.printStackTrace(); }