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 はごくまれにしか使用されません。つまり、コレクションを調べて、不要になったものをすべて削除したい場合です。コレクションが読み取り専用の場合、または 2 つの異なる反復子で同時に 2 回反復しようとすると、remove は失敗する可能性があります。hasNext と next に固執するだけです。

于 2009-04-26T20:31:24.423 に答える