2009-04-26 8 views
2

現在、POIを使用してWordドキュメントのバッチからテキストを抽出しようとしていますが、ドキュメントに含まれるエントリを特定できる必要があります。私はドキュメントルートを引っ張って最初のエントリを引っ張っても、すべてのエントリを表示できるようにしたいと思っています。 getEntries()メソッドはこの機能を提供しているようですが、私はそれらを引き出すためにgetViewableIterator()を使用する方法については犠牲になっています。以下はPOIで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> 

、私はちょうど罰金最初のエントリを取得することができますよ。しかし、remove()が実行されるとすぐにjava.lang.IllegalStateExceptionエラーが発生します。明らかに私はremove()メソッドを正しく使用していませんが、これを正しく使用する方法の例は見つかりませんでした。どんな助けでも大歓迎です。 、実際には

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(); 
} 

答えて

0

は、私は本当に(通常、私は中括弧やもので、通常の形でJavaを使用してください)あなたのXMLタグを理解していないが、一般的にJavaのイテレータは、次のように動作しますあなたがコレクションを通過して、もう不要なものをすべて削除したい場合、removeはごくまれにしか使用されません。コレクションが読み取り専用である場合、または2つの異なるイテレーターで同時に2回反復しようとしている場合、removeは失敗する可能性があります。ちょうどhasNextとnextをつけてください。

+0

私はこれを正しく理解してくださいするには、[OK]を、ループ内のxの各呼び出しで、反復子が自動的にハッシュの次の要素に移動する必要がありますか? (ちなみにXMLは実際にはXMLではなく、ColdFusionのマークアップです) –

+0

はい、next()を呼び出すたびにイテレータは次の要素に移動します。 – mihi

+0

トピックの質問:私は彼に尋ねることができるように受け入れられたが、誰がこの答えをdownvoted見ることができますか? – mihi

1

Kinky Solutions fameのBen Nadelが、あなたの状況を処理する可能性のあるコンポーネントを作成しました。彼のプロジェクトがあなたを助けたかどうか見て、報告してください。

POI Utility ColdFusion Component

+0

私はBen Nadelのコンポーネントを簡単に見てみましたが、それはExcelファイル用に書かれているため、主にWordに固有の問題でした。それにもかかわらず、私は最終的に自分で回避策を見つけ出すことができました。 –

関連する問題