2012-09-27 91 views
2

我使用Apache读取xls文件POI 3.8,但我得到异常:无法读取整个标题; 0字节读取;预期512个字节

 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); 

帮我吗?

+0

你确定该文件不是空的吗? – Thilo

+0

你可以在excel或openOffice中打开文件吗?如果不是则文件损坏 –

+0

文件不为空 –

回答

6

如果我们看一看在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个字节的InputStream的构造函数,然后调用私有构造。

如果没有足够的字节要读取,readFirst512方法会抛出异常。

另外,POI's document表示POI文件系统结构开始于512字节的标题块。

所以......看起来你的文件对POI来说不够大。

+0

我有同样的问题,但该文件是1,536字节...任何想法如何解决这个问题? – softwareplay

3

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

+0

即使打开文件,做一个小的编辑和保存工作。在我的情况下,我编辑了一个单元格,保存并撤消更改,再次保存,异常消失。因为它可能是一个模板文件,它一路上被损坏了。 Excel可以解决问题POI崩溃。以编程方式,我将调整我的代码,首先将模板文件复制到临时目录,然后执行任何操作。 –

0

如果您将正在读取或写入的文件放在不同的文件夹中,您可能不会收到错误消息。看起来像Mozilla的“下载”这样的默认文件夹具有受限制的权限。