2

我目前正在使用 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()执行,我就会收到错误。显然我没有remove()正确使用该方法,但我无法找到任何应​​该如何正确使用该方法的示例。任何帮助将不胜感激。

4

2 回答 2

1

Kinky Solutions 成名的 Ben Nadel 编写了一个可以处理您的情况的组件。如果他的项目对您有帮助,请查看并报告。

POI 实用程序 ColdFusion 组件

于 2009-04-27T12:51:06.657 回答
0

我不太了解您的 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 很少使用,以防您想要遍历一个集合并删除其中不再需要的所有内容。如果集合是只读的,或者您尝试同时使用两个不同的迭代器对其进行两次迭代,则 remove 可能会失败。只需坚持使用 hasNext 和 next 即可。

于 2009-04-26T20:31:24.423 回答