POI3.5 final
jdk 1.5同一个excel文件分别放在不同的路径下面
java/a.excel
resource/a.excel两个目录java和resource都已经放到build path里面结果resource/a.excel这个,读取老是报错 wb = new HSSFWorkbook(new ClassPathResource("resource/a.excel")
.getInputStream(),
true /*yes to copy macro*/);抛如下异常:
Caused by: java.io.IOException: block[ 63 ] already removed - does your POIFS have circular or duplicate block references?
at org.apache.poi.poifs.storage.BlockListImpl.remove(BlockListImpl.java:89)
at org.apache.poi.poifs.storage.SmallDocumentBlockList.remove(SmallDocumentBlockList.java:30)
at org.apache.poi.poifs.storage.BlockAllocationTableReader.fetchBlocks(BlockAllocationTableReader.java:187)
at org.apache.poi.poifs.storage.BlockListImpl.fetchBlocks(BlockListImpl.java:123)
at org.apache.poi.poifs.storage.SmallDocumentBlockList.fetchBlocks(SmallDocumentBlockList.java:30)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.processProperties(POIFSFileSystem.java:534)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.processProperties(POIFSFileSystem.java:521)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.processProperties(POIFSFileSystem.java:521)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:176)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:316)
... 60 more
我试过把同一个excel放到不同的目录下,唯独有一个目录是抛这个错误,
哪位有这方面经验的指点一下。

解决方案 »

  1.   

    new ClassPathResource("resource/a.excel")
    改为引用绝对路径看看
      

  2.   

    小弟没遇到过,不过从异常来看,不应该是你形容的那种情况,如果把                
    两个目录颠倒下,估计就是java/那个目录报异常了。
    应该是你使用不当吧。个人观点,哈哈
      

  3.   

    你先用绝对路径试一下,你就在resource里面出错,我感觉不是POI问题另外你是否直接把文件放在build path下面的。其次resource是否是source folder呢
      

  4.   

    用绝对路径应该可以保证没有问题。但是看暴出来的错误的意思。貌似 POI 会判断你读取的excel是不是同一个文件。建议你去把POI的源码下来,挂上去调试。看看它里面报这个错是什么原因。
      

  5.   

    奇怪
    我在build path的source里,把另一个test/source的exclude **改成 exclude <none>java/main/resource
      include all
      exclude <none>
    java/test/resource
      include all
      exclude <none> //之前是exclude **但还是不知道具体是啥原因引起的,
    估计可能跟楼上老兄说的优点关系
      

  6.   

    你确定运行的classpath下有一个resource目录?
    看你的目录规划,在编译后,java和resource目录本身不会进入classpath,但它们下面的文件和子目录都会进入classpath的根目录。
    也就是说你java/a.excel和resource/a.excel,都会到cp的根目录下,但2个同名,只会取一个。
      

  7.   

    可能是获取的流有问题,去搜索一下你的异常,用FileInputStream应该就没问题的。 http://old.nabble.com/exception-when-inputstream-is-read-from-getClass%28%29.getClassLoader%28%29.getResourceAsStream%28%22file.xls%22%29-td26406348.html
      

  8.   

    resource这个名字的问题吧
    换个名字
      

  9.   

    以下两个都配置在source里面,project由maven管理
    java/main/resources, output路径为:target/classes2 ,区别于maven默认的target/classes
    java/test/resources, output路径为:target/test-classes2, 区别于maven默认的target/test-classes实际build产生四个target下的目录
    target/classes
    target/classes2
    target/test-classes
    target/test-classes2结果只有target/classes/a/a.xls这个文件出错,感觉是maven拷贝文件的时候出错,但是test下面的又是正确的,非常奇怪
      

  10.   

    目录标准的设置方法:
    src/main/java,输出到target/classes
    src/main/resource,输出到target/classes,exclude:**
    src/test/java,输出到target/test-classes
    src/test/resource,输出到target/test-classes,exclude:**你按这个设置再试试
      

  11.   


    请问一下,
    include:all
    exclude:**
    这个怎么理解?我怎么感觉是矛盾的?
      

  12.   


    这个可能吗?貌似有点道理!楼主看看应用服务器下的class目录下的内容