2016-06-02 13 views
4

Ich habe eine Reihe von Word-Dokumenten (docx), die Test-Fallnamen als Absatz Titel und die Testschritte in der nachfolgenden Tabelle entlang mit einigen anderen Informationen.Apache POI: Extrahieren Sie einen Absatz und die folgende Tabelle aus Word-Dokument (docx) in Java

Ich muss den Testfallnamen (aus Absatz) und die Testschritte (aus Tabelle) aus der Tabelle mit Apache POI extrahieren.

Die Beispielwortinhalte sind

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) 

Apache POI APIs Liste der Absätze geben liefert und Tabellen, aber ich bin nicht in der Lage den Absatz (Testfall) zu lesen und sofort auf einen Tisch suchen, die diesen Absatz folgt .

Ich versuchte XWPFWordExtractor mit (den ganzen Text lesen), bodyElementIterator (iterieren alle Körperelemente), aber die meisten von ihnen getParagraphText() Methode geben, die eine Liste der Absätze [para1, para2, para3, para4, para5] und getTables() Methode gibt, die in der alle Tabellen gibt Dokument als Liste [table1, table2, table3, table4].

Wie gehe ich über alle Absätze, stoppe bei Absatz, der nach der Überschrift 'Testfälle' (Absatz 4) ist und dann nach Tabelle suchen, die unmittelbar nach dem Absatz 4 (Tabelle 3) ist. Dann wiederholen Sie dies für Absatz 5 und Tabelle 4.

Hier ist die gist link (Code) Ich versuchte, die eine Liste von Absätzen und Liste von Tabellen gibt, aber nicht in der Reihenfolge, die ich verfolgen kann.

Jede Hilfe wird sehr geschätzt.

Antwort

3

Das Wort API in POI ist noch im Fluss, und Buggy, aber Sie sollten über die Absätze in einem von zwei Wegen zu durchlaufen in der Lage:

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

oder

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

Die Javadocs sagen Sie, dass die Absätze abruft, die den Text in der Kopf- oder Fußzeile enthalten, aber ich muss glauben, dass dies ein Fehler beim Ausschneiden und Einfügen ist, da die XWPFHeaderFooter.getParagraphs() dasselbe sagt. Betrachtet man die Quelle, gibt eine nicht änderbare Liste zurück, während der Iterator die Absätze modifizierbar lässt. Dies wird sich wahrscheinlich in Zukunft ändern, aber so funktioniert es jetzt.

Um eine Liste aller Körperelemente abrufen, Absätze und Tabellen, müssen Sie verwenden:

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

Dies sollte Sie eine Schleife durch alle Körperelemente, um ermöglichen.

+1

danke für die Kommentare, mein Hauptanliegen ist, gibt die Liste der Pars Liste und die Liste der Tabellen gibt Liste der Tabellen, aber wie behalte ich die Reihenfolge, in der sie erscheinen? Meine Anforderung besteht darin, Tabelleninhalte zu extrahieren, die unmittelbar nach einem bestimmten Absatzinhalt folgen. Einige, wie ich weiter paras lesen muss und wenn meine erforderliche para reinkommt, hör auf und lese ab diesem Punkt Tabellen. – Sauchin

+0

@Sauchin hast du das herausgefunden. Ich habe das gleiche Problem. Vielleicht posten Sie als Ihre eigene Antwort, wenn Sie eine Lösung haben –

+0

Ich habe die Lösung gefunden. Ich entschuldige mich dafür, dass ich nicht früher gepostet habe. Ich werde die Antwort in ein paar Tagen posten. Ich reise und habe leider keinen Zugang zum Quellcode. – Sauchin