代码之家  ›  专栏  ›  技术社区  ›  Anne Porosoff

如何在POI中使用GetViewableIterator

  •  2
  • Anne Porosoff  · 技术社区  · 15 年前

    我目前正在使用POI尝试从一批Word文档中提取文本,我需要能够确定文档包含哪些条目。我已经能够尽可能地提取文档根目录和第一个条目,但我希望能够查看所有条目。这个 getEntries() 方法似乎提供了这个功能,但我对如何使用 getViewableIterator() 把他们拉出来。

    以下是我对代码的理解:

    <cfset myFile = createObject("java", "java.io.FileInputStream").init(fileInputPath)>
    <cfset fileSystem = CreateObject( "java", "org.apache.poi.poifs.filesystem.POIFSFileSystem" ).Init(myFile)>
    
    <cfloop from="1" to="#fileSystem.getRoot().getEntryCount()#" index="i">
         <cfset viewableIterator = fileSystem.getRoot().getEntries().next().getViewableIterator()>
         <cfset nextEntry = fileSystem.getRoot().getEntries().next()>
         <cfif viewableIterator.hasNext()>
             <cfdump var="#nextEntry.getShortDescription()#">
             <cfset viewableIterator.remove()>
         </cfif>
    </cfloop>
    

    在第一个循环中,我可以很好地得到第一个条目。但是,我得到一个 java.lang.IllegalStateException 一旦出现错误 remove() 执行。显然我没有用 移除() 方法正确,但我还没有找到任何关于如何正确使用它的示例。任何帮助都将不胜感激。

    2 回复  |  直到 9 年前
        1
  •  0
  •   mihi    15 年前

    我不太理解你的XML标签(通常我用Java的正常形式,用大括号和东西),但是一般来说,Java迭代器的工作原理如下:

    while(iterator.hasNext()) {
      x = iterator.next(); // get element
      // do with x what you want
      if (/*you want to remove x from the underlying list*/)
          iterator.remove();
    }
    

    在实践中,只很少使用remove,在您希望遍历集合并删除其中不再需要的所有内容的情况下。如果Collecion是只读的,或者试图同时使用两个不同的迭代器对其进行两次迭代,则Remove可能会失败。坚持hasnext和next。

        2
  •  1
  •   rip747    15 年前

    KinkySolutions Fame的BenNadel编写了一个组件,可以处理您的情况。看一看,如果他的项目对你有帮助,就汇报。

    POI Utility ColdFusion Component