Как использовать getViewableIterator в POI - PullRequest
2 голосов
/ 27 апреля 2009

В настоящее время я использую 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(), но я не смог найти ни одного примера того, как это следует правильно использовать. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 27 апреля 2009

Бен Надель из известной компании Kinky Solutions написал компонент, который может справиться с вашей ситуацией. Посмотрите, посмотрите и сообщите, помог ли вам его проект.

Компонент POI Utility ColdFusion

0 голосов
/ 27 апреля 2009

Я не совсем понимаю ваши 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();
}

На практике удаление используется очень редко, если вы хотите просмотреть коллекцию и удалить из нее все, что вам больше не нужно. Удалить может произойти сбой, если коллекция только для чтения или если вы пытаетесь выполнить итерацию дважды, используя два разных итератора одновременно. Просто придерживайтесь hasNext и next.

...