无法读取完整的标题;读取了0字节;预期的是512字节。

3
我正在使用Apache poi 3.8来读取xls文件,但是遇到了异常:
        java.io.IOException: Unable to read entire header; 0 bytes read; expected 512 bytes
        at org.apache.poi.poifs.storage.HeaderBlock.alertShortRead(HeaderBlock.java:226)
        at org.apache.poi.poifs.storage.HeaderBlock.readFirst512(HeaderBlock.java:207)
        at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:104)
        at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:138)

使用的代码示例:

     FileInputStream myInput = new FileInputStream(excelFilePathWithExtension);
     logger.debug("FileInputStream::"+myInput);

     POIFSFileSystem myFileSystem = new POIFSFileSystem(myInput);
     logger.debug("POIFSFileSystem::"+myFileSystem);

     Workbook workbook = WorkbookFactory.create(myFileSystem);

请帮助我吗?

(需要翻译的内容)

你确定那个文件不是空的吗? - Thilo
你能否在Excel或OpenOffice中打开文件?如果不能,则该文件已损坏。 - Nandkumar Tekale
文件在 MS Excel 中打开。 - Sameek Mishra
如果Excel文件为空,我们就不应该读取该文件吗?那么正确的检查空Excel文件的方法是什么? - Harleen
4个回答

7
如果我们看一下HeaderBlocks类,我们可以看到这些块:
public HeaderBlock(InputStream stream) throws IOException {
    // Grab the first 512 bytes
    // (For 4096 sized blocks, the remaining 3584 bytes are zero)
    // Then, process the contents
    this(readFirst512(stream));
    ...
}

你使用的构造函数将读取输入流的前512个字节,然后调用一个私有构造函数。
如果没有足够的字节可读,则readFirst512方法会抛出异常。
此外,POI文档指出,POI文件系统结构始于512字节的标头块。
所以...看起来你的文件不够大适用于POI。

我有同样的问题,但文件大小为1,536字节... 有什么解决办法吗? - softwareplay

3
在MS-Excel中打开并另存为不同的名称。再试一次。

即使只是打开文件,进行一些小的编辑并保存也可以解决问题。在我的情况下,我编辑了一个单元格,保存后撤销更改,再次保存,异常就消失了。由于这是一个模板文件,可能在过程中出现了损坏。Excel可以修复POI崩溃的问题。编程上,我将调整我的代码,首先将模板文件复制到临时目录,然后执行任何操作。 - Louis Papaloizou

0

如果您将要读取或写入的文件放置在不同的文件夹中,则可能不会出现错误。一些默认文件夹,如Mozilla的“下载”文件夹,似乎具有受限权限。


0

我也遇到了同样的问题,即使我的Excel文件包含数据。在将我的POI jar文件版本升级到poi-3.9.jar后,我的问题得到了解决。希望这对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接