Java POI无法打开在Excel中打开的工作簿

Java POI无法打开在Excel中打开的工作簿,java,excel,apache-poi,Java,Excel,Apache Poi,当我尝试在POI中打开.xlsx文件时,出现异常: java.lang.IllegalArgumentException: The supplied POIFSFileSystem does not contain a BIFF8 'Workbook' entry. Is it really an excel file? at org.apache.poi.hssf.usermodel.HSSFWorkbook.getWorkbookDirEntryName(HSSFWorkbook.j

当我尝试在POI中打开.xlsx文件时,出现异常:

java.lang.IllegalArgumentException: The supplied POIFSFileSystem does not contain a BIFF8 'Workbook' entry. Is it really an excel file?
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.getWorkbookDirEntryName(HSSFWorkbook.java:223)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:245)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:188)
java.lang.IllegalArgumentException:提供的POIFSFileSystem不包含BIFF8“工作簿”条目。它真的是excel文件吗?
在org.apache.poi.hssf.usermodel.HSSFWorkbook.getWorkbookDirEntryName上(HSSFWorkbook.java:223)
在org.apache.poi.hssf.usermodel.HSSFWorkbook上(HSSFWorkbook.java:245)
位于org.apache.poi.hssf.usermodel.HSSFWorkbook.(HSSFWorkbook.java:188)
我注意到代码认为它是一个.xls文件,尽管名称是.xlsx,我使用的是
WorkbookFactory.create(fileInputStream)
打开文件

我尝试将该文件重命名为.zip并在WinZip中打开,但得到一个错误-无效的zip文件


该文件确实在Excel中打开,如果我保存它(不做任何更改),那么它也会在POI中正确打开。

根据您所说的,您有一个
.xlsx
文件,但它在HSSF中出现,没有工作簿条目,我将推断您有一个加密的.xlsx文件

基本上有4种处理.xls或.xlsx文件的方法:

  • 未加密的.xls文件-OLE2存储,与HSSF一起使用
  • 加密的.xlsx文件-OLE2存储,一些加密的记录,如果您
  • 未加密的.xlsx文件-OOXML(xml的zip)存储,与XSSF一起使用
  • 加密的.xlsx文件-存储在OLE2中,其中包含加密部分,它封装OOXML,它。。。。。它最终与XSSF一起工作(很讨厌)
所以,我认为正在发生的是,您正在检查文件的类型,查看它是OLE2,然后将其传递给HSSF。HSSF查找它使用的位,但看不到,于是放弃

你需要做的是。基本上,您的代码需要类似于:

EncryptionInfo info = new EncryptionInfo(filesystem);
Decryptor d = Decryptor.getInstance(info);

try {
    if (!d.verifyPassword(password)) {
        throw new RuntimeException("Unable to process: document is encrypted");
    }

    InputStream dataStream = d.getDataStream(filesystem);
    XSSFWorkbook wb = new XSSFWorkbook(dataStream);

    // Process XLSX file here
} catch (GeneralSecurityException ex) {
    throw new RuntimeException("Unable to process encrypted document", ex);
}

如果你使用最新版本的POI,如果你给HSSF一个加密的.xlsx文件,它现在会抛出一个
EncryptedDocumentException
,这样你就可以更容易地从你说的内容中找出哪里出了错

,也就是说你有一个
.xlsx
文件,但是它在HSSF中出现,没有工作簿条目,我将推断您有一个加密的.xlsx文件

基本上有4种处理.xls或.xlsx文件的方法:

  • 未加密的.xls文件-OLE2存储,与HSSF一起使用
  • 加密的.xlsx文件-OLE2存储,一些加密的记录,如果您
  • 未加密的.xlsx文件-OOXML(xml的zip)存储,与XSSF一起使用
  • 加密的.xlsx文件-存储在OLE2中,其中包含加密部分,它封装OOXML,它。。。。。它最终与XSSF一起工作(很讨厌)
所以,我认为正在发生的是,您正在检查文件的类型,查看它是OLE2,然后将其传递给HSSF。HSSF查找它使用的位,但看不到,于是放弃

你需要做的是。基本上,您的代码需要类似于:

EncryptionInfo info = new EncryptionInfo(filesystem);
Decryptor d = Decryptor.getInstance(info);

try {
    if (!d.verifyPassword(password)) {
        throw new RuntimeException("Unable to process: document is encrypted");
    }

    InputStream dataStream = d.getDataStream(filesystem);
    XSSFWorkbook wb = new XSSFWorkbook(dataStream);

    // Process XLSX file here
} catch (GeneralSecurityException ex) {
    throw new RuntimeException("Unable to process encrypted document", ex);
}

如果你使用最新版本的POI,如果你给HSSF一个加密的.xlsx文件,它现在会抛出一个
EncryptedDocumentException
,这样你就可以更容易地从你说的内容中找出哪里出了错

,也就是说你有一个
.xlsx
文件,但是它在HSSF中出现,没有工作簿条目,我将推断您有一个加密的.xlsx文件

基本上有4种处理.xls或.xlsx文件的方法:

  • 未加密的.xls文件-OLE2存储,与HSSF一起使用
  • 加密的.xlsx文件-OLE2存储,一些加密的记录,如果您
  • 未加密的.xlsx文件-OOXML(xml的zip)存储,与XSSF一起使用
  • 加密的.xlsx文件-存储在OLE2中,其中包含加密部分,它封装OOXML,它。。。。。它最终与XSSF一起工作(很讨厌)
所以,我认为正在发生的是,您正在检查文件的类型,查看它是OLE2,然后将其传递给HSSF。HSSF查找它使用的位,但看不到,于是放弃

你需要做的是。基本上,您的代码需要类似于:

EncryptionInfo info = new EncryptionInfo(filesystem);
Decryptor d = Decryptor.getInstance(info);

try {
    if (!d.verifyPassword(password)) {
        throw new RuntimeException("Unable to process: document is encrypted");
    }

    InputStream dataStream = d.getDataStream(filesystem);
    XSSFWorkbook wb = new XSSFWorkbook(dataStream);

    // Process XLSX file here
} catch (GeneralSecurityException ex) {
    throw new RuntimeException("Unable to process encrypted document", ex);
}

如果你使用最新版本的POI,如果你给HSSF一个加密的.xlsx文件,它现在会抛出一个
EncryptedDocumentException
,这样你就可以更容易地从你说的内容中找出哪里出了错

,也就是说你有一个
.xlsx
文件,但是它在HSSF中出现,没有工作簿条目,我将推断您有一个加密的.xlsx文件

基本上有4种处理.xls或.xlsx文件的方法:

  • 未加密的.xls文件-OLE2存储,与HSSF一起使用
  • 加密的.xlsx文件-OLE2存储,一些加密的记录,如果您
  • 未加密的.xlsx文件-OOXML(xml的zip)存储,与XSSF一起使用
  • 加密的.xlsx文件-存储在OLE2中,其中包含加密部分,它封装OOXML,它。。。。。它最终与XSSF一起工作(很讨厌)
所以,我认为正在发生的是,您正在检查文件的类型,查看它是OLE2,然后将其传递给HSSF。HSSF查找它使用的位,但看不到,于是放弃

你需要做的是。基本上,您的代码需要类似于:

EncryptionInfo info = new EncryptionInfo(filesystem);
Decryptor d = Decryptor.getInstance(info);

try {
    if (!d.verifyPassword(password)) {
        throw new RuntimeException("Unable to process: document is encrypted");
    }

    InputStream dataStream = d.getDataStream(filesystem);
    XSSFWorkbook wb = new XSSFWorkbook(dataStream);

    // Process XLSX file here
} catch (GeneralSecurityException ex) {
    throw new RuntimeException("Unable to process encrypted document", ex);
}


如果您使用最新版本的POI,如果您将加密的.xlsx文件提供给HSSF,它现在将抛出一个
EncryptedDocumentException
,这样您就可以更容易地找出哪里出了问题

它受到保护,但没有加密。我尝试了你的代码,但得到了一个例外,在很多情况下,它找不到算法,protected=encrypted,原因最为微软所知。可以使用默认密码进行保护,但仍将加密有趣!那么为什么我会得到一个异常java.security.nosuchagorithmexception:找不到任何支持AES/ECB/nopadding的提供程序可能是因为它以POI不支持的方式进行了加密。这是昨天类似的POI错误报告中的文件吗?我没有提交错误报告它受到保护,