Pergunta

Atualmente estou usando o POI para tentar texto extrato de fora de um lote de documentos do Word e eu preciso ser capaz de determinar quais entradas um documento contém. Eu tenho sido capaz de chegar tão longe como puxar a raiz do documento e puxando a primeira entrada, mas eu quero ser capaz de ver todas as entradas. O método getEntries() parece fornecer essa funcionalidade, mas eu estou em uma perda a respeito de como usar getViewableIterator() para retirá-los.

Abaixo está o que eu tenho o código-wise:

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

No primeiro ciclo, eu sou capaz de conseguir a primeira entrada apenas multa. No entanto, eu recebo um erro java.lang.IllegalStateException assim que remove() é executado. Obviamente eu não estou usando o método remove() corretamente, mas eu não tenho sido capaz de encontrar qualquer exemplos de como isso deve ser bem utilizado. Qualquer ajuda seria muito apreciada.

Foi útil?

Solução

Eu realmente não entendo suas tags XML (geralmente eu usar Java em sua forma normal, com chaves e outras coisas), mas geralmente uma Java iterador funciona como o seguinte:

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

Na prática, remove é utilizado apenas muito raramente, em casos que você quer ir através de uma coleção e remover tudo o que você não precisa de mais tempo nele. remoção pode falhar se a recolha é somente leitura ou se você está tentando iterar sobre ele duas vezes com dois iteradores diferentes ao mesmo tempo. Basta ficar com hasNext e no próximo.

Outras dicas

Ben Nadel de Kinky Solutions fama escreveu um componente que pode lidar com sua situação. Dê uma olhada ver e relatório de volta se o seu projeto que você ajudou.

POI Utility ColdFusion Component

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top