Java Selenium读取加密.xlsx文件遇OLE2格式错误如何解决?
解决加密.xlsx读取的OLE2格式报错问题
你的报错核心原因是:你认为的.xlsx文件实际是OLE2容器包装的加密Open XML文件(比如用旧版Office加密的xlsx,或文件被错误保存为OLE2格式),XSSF组件仅支持纯XML结构的普通xlsx,因此直接调用XSSF会触发格式不匹配错误。
以下是针对不同加密场景的解决方案:
场景1:OLE2包装的加密xlsx(对应你的报错场景)
需要先解析OLE2容器并解密,再读取内部的XML内容。使用POI的POIFSFileSystem和Decryptor处理:
import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.poifs.crypt.EncryptionInfo; import org.apache.poi.poifs.crypt.Decryptor; import java.io.FileInputStream; import java.io.InputStream; public class EncryptedOLE2XlsxReader { public static void main(String[] args) throws Exception { String excelPath = "加密文件路径.xlsx"; String password = "文件密码"; try (POIFSFileSystem oleFs = new POIFSFileSystem(new FileInputStream(excelPath))) { EncryptionInfo encryptionInfo = new EncryptionInfo(oleFs); Decryptor decryptor = Decryptor.getInstance(encryptionInfo); // 验证密码 if (!decryptor.verifyPassword(password)) { throw new IllegalArgumentException("密码错误"); } // 获取解密后的数据流,交给WorkbookFactory处理 try (InputStream decryptedStream = decryptor.getDataStream(oleFs)) { Workbook workbook = WorkbookFactory.create(decryptedStream); // 示例:读取第一个sheet的第一行第一列 System.out.println(workbook.getSheetAt(0).getRow(0).getCell(0).getStringCellValue()); workbook.close(); } } } }
- 依赖注意:需确保引入
poi-scratchpad包(处理OLE2容器必需),POI 4+版本API更稳定,3.x版本需调整Decryptor的初始化方式。
场景2:普通加密xlsx(纯XML结构,可改后缀为.zip解压)
直接使用WorkbookFactory带密码参数读取即可,无需处理OLE2容器:
import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import java.io.FileInputStream; public class NormalEncryptedXlsxReader { public static void main(String[] args) throws Exception { String excelPath = "加密文件路径.xlsx"; String password = "文件密码"; try (FileInputStream fis = new FileInputStream(excelPath)) { Workbook workbook = WorkbookFactory.create(fis, password); // 后续数据读取操作 workbook.close(); } } }
关键提示
- 不要直接用HSSF处理:错误提示的HSSF是针对纯OLE2格式的.xls文件,你的文件是OLE2包装的.xlsx,因此解密后仍需用XSSF(WorkbookFactory会自动识别)。
- POI版本建议:优先使用POI 4或5版本,3.x对加密Open XML文件的支持存在兼容性问题。
内容的提问来源于stack exchange,提问作者Bhargav
相关产品推荐
相关产品推荐

