POI에서 getViewableIterator를 사용하는 방법
-
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의 Ben Nadel은 귀하의 상황을 처리할 수 있는 구성 요소를 작성했습니다.그의 프로젝트가 도움이 되었는지 살펴보고 다시 보고해 주세요.