Как использовать getViewableIterator в POI
-
16-09-2019 - |
Вопрос
В настоящее время я использую 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()
метод правильный, но я не смог найти никаких примеров того, как это следует правильно использовать.Мы были бы очень признательны за любую помощь.
Решение
Я не совсем понимаю ваши 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.
Другие советы
Бен Надел из Kinky Solutions fame написал компонент, который мог бы справиться с вашей ситуацией.Посмотрите и отчитайтесь, помог ли вам его проект.