POIでgetViewableIteratorを使用する方法
-
16-09-2019 - |
質問
私は現在、Word文書のバッチのうち、テキストを抽出しようとするPOIを使用していると私は、ドキュメントが含まれているエントリかを決定できるようにする必要があります。私は、ドキュメントルートを引っ張り、最初のエントリを引っ張っ限り取得することができましたが、私はすべてのエントリを表示できるようにしたいです。 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()
メソッドを使用していないが、私は、これは適切に使用すべきかのいずれかの例を見つけることができませんでした。任意の助けいただければ幸いです。
解決
私は本当にあなたの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();
}
実際には、削除するには、コレクションを通過し、あなたはそれにもはや必要としないすべてのものを削除したい場合には、非常にまれのみを使用されていません。 collecionが読み取り専用か、同時に2つの異なるイテレータで二回、それを反復処理しようとしている場合であれば失敗する可能性があります削除します。ただのhasNextと次に固執ます。
他のヒント
キンキーソリューション名声のベンNadelは、あなたの状況に対処する可能性があるコンポーネントを書きました。彼のプロジェクトがあなたを助けたかどうかを確認し、折り返し報告を見つけます。