2016-06-02 2 views
4

테스트 케이스 이름을 단락 제목과 세부 테스트 문항으로 상세하게 설명하는 워드 문서 (docx)가 있습니다. 다른 정보가 있습니다.Apache POI : Java에서 word document (docx)의 단락과 다음 테이블을 추출하십시오.

Apache POI를 사용하여 테이블에서 테스트 케이스 이름 (단락에서)과 테스트 단계 (테이블에서)를 추출해야합니다.

예제 단어 내용

Section 1: Index 
Section 2: Some description 
    A. Paragraph 1 
    B. Table 1 
    C. Paragraph 2 
    D. Paragraph 3 
    E. Table 2 
Section 3: test cases (The title "test cases" is constant, so I can look for it in the doc) 
    A. Paragraph 4 (First test case) 
    B. Table 3 (Test steps table immediately after the para 4) 
    C. Paragraph 5 (Second test case) 
    B. Table 4 (Test steps table immediately after the para 5) 

아파치 POI는 단락과 테이블의 목록을 제공하는 API를 제공하지만 나는 단락 (테스트 케이스)를 읽고 즉시이 단락을 다음 표를 찾을 수 없습니다입니다 .

나는, bodyElementIterator은 (이상 신체의 모든 요소를 ​​반복)하지만 그들 중 대부분은 모든 테이블을 제공 단락 [para1, para2, para3, para4, para5]getTables() 방법의 목록을 제공 getParagraphText() 방법을 제공 (모든 텍스트를 읽기 위해) XWPFWordExtractor를 사용하여 시도 문서는 목록으로 [table1, table2, table3, table4]입니다.

어떻게 모든 단락을 검토하고 제목 '테스트 사례'(단락 4) 다음 단락에서 중단 한 다음 단락 4 (표 3) 바로 다음에있는 테이블을 찾습니다. 그런 다음 5 단락과 4 단락을 반복하십시오.

여기는 단락 목록과 테이블 목록을 제공하지만 추적 할 수있는 시퀀스가 ​​아닌 gist link (코드)입니다.

도움을 주시면 감사하겠습니다.

답변

3

POI의 워드 API가 플럭스 및 버그 아직,하지만 당신은 두 가지 방법 중 하나를 사용하여 단락을 반복 할 수 있어야한다 :

XWPFDocument doc = new XWPFDocument(fis); 
List<XWPFParagraph> paragraphs = doc.getParagraphs(); 
for (XWPFParagraph p : paragraphs) { 
    ... do something here 
} 

또는

XWPFDocument doc = new XWPFDocument(fis); 
Iterator<XWPFParagraph> iter = doc.getParagraphsIterator(); 
while (iter.hasNext()) { 
    XWPFParagraph p = iter.next(); 
    ... do something here 
} 

JavaDoc에서 XWPFDocument.getParagraphs()은 머리말이나 꼬리말에있는 텍스트를 담고있는 단락을 검색한다고 말하지만, 이것은 잘라내어 붙여 넣기 오류라고 믿어야합니다. XWPFHeaderFooter.getParagraphs()은 똑같이 말합니다. 소스를 보면 XWPFDocument.getParagraphs()은 수정할 수없는 목록을 반환하며 반복기를 사용하면 단락을 수정할 수 있습니다. 이것은 미래에 변화 할 가능성이 있지만 그것이 현재 작동하는 방식입니다.

은 신체의 모든 요소의 목록을 검색하려면, 단락 및 테이블, 당신은 사용할 필요가 :

XWPFDocument doc = new XWPFDocument(fis); 
Iterator<IBodyElement> iter = doc.getBodyElementsIterator(); 
while (iter.hasNext()) { 
    IBodyElement elem = iter.next(); 
    if (elem instanceof XWPFParagraph) { 
     ... do something here 
    } else if (elem instanceof XWPFTable) { 
     ... do something here 
    } 
} 

이것은 순서로 신체의 모든 요소를 ​​통해 루프를 허용해야합니다.

+1

주석 주셔서 감사합니다. 단락 목록은 paras 목록과 테이블 목록을 제공하지만 테이블 목록을 제공하지만 어떻게 표시됩니까? 내 요구 사항은 특정 단락의 내용 바로 다음에 오는 테이블 내용을 추출하는 것입니다. 필자가 paras를 계속 읽어야 할 때, 그리고 필자가 요구 한 para가 올 때, 그 시점부터 테이블을 멈추고 읽는 방법. – Sauchin

+0

@Sauchin 당신이 이것을 알아 냈습니까? 나는 같은 문제를 가지고있다. 해결책을 찾았다면 –

+0

해결책을 찾았을 수도 있습니다. 이전에 게시하지 않은 것에 대해 사과드립니다. 나는 며칠 만에 대답을 올릴 것이다. 나는 여행 중이며, 불행하게도 소스 코드에 접근 할 수 없다. – Sauchin