You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 16:30:44