Domanda

Attualmente sto usando POI per tentare di estrarre il testo da un batch di documenti di Word e ho bisogno di essere in grado di determinare quali campi un documento contiene. Sono stato in grado di ottenere, per quanto tirando la radice del documento e tirando la prima voce, ma voglio essere in grado di visualizzare tutte le voci. Il metodo getEntries() sembra fornire questa funzionalità, ma io sono in perdita su come usare getViewableIterator() per tirarli fuori.

Qui di seguito è quello che ho codice-saggio:

<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>

Al primo ciclo, io sono in grado di ottenere la prima voce che bene. Tuttavia, ottengo un errore java.lang.IllegalStateException non appena viene eseguito remove(). Ovviamente non sto usando il metodo remove() correttamente, ma non sono stato in grado di trovare alcun esempio di come questo dovrebbe essere usato correttamente. Qualsiasi aiuto sarebbe molto apprezzato.

È stato utile?

Soluzione

Io non capisco i tag XML (di solito io uso Java nella sua forma normale, con le parentesi graffe e roba), ma in generale un iteratore Java funziona come il seguente:

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

In pratica, rimuovere viene utilizzato solo raramente, nei casi che si desidera passare attraverso una raccolta e rimuovere tutto ciò che non è necessario ancora in esso. rimuovere può fallire se il collecion è di sola lettura o se si sta cercando di scorrere su di esso due volte con due iteratori differenti allo stesso tempo. Basta attaccare con hasNext e successiva.

Altri suggerimenti

Ben Nadel di Kinky Solutions fama ha scritto un componente che potrebbe gestire la situazione. Date uno sguardo vedere e riferire se il suo progetto ti ha aiutato.

POI Utility ColdFusion Componente

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top