2016-05-28 5 views
0

Ich versuche Apache POI zu verwenden, um eine Word-Datei dynamisch zu generieren, indem Sie einige Daten in einer Arraylist und dann drucken es in der Konsole Ausgabe sowie die Word-Datei. Ich kann die Ausgabe sowohl in der Konsole als auch in der Word-Datei erhalten, aber innerhalb jedes Arraylist-Elements habe ich am Ende ein neues Zeilenzeichen hinzugefügt, so dass die Array-Elemente zeilenweise gedruckt werden. In der Konsolenausgabe funktioniert das neue Zeilenzeichen, dh die Zeilenelemente kommen zeilenweise vor, aber in der erzeugten Wortdatei fehlt der Zeilenumbruch. Wie kann ich die Zeilenumbrüche in der erzeugten Wortdatei beibehalten und das Komma am Ende der Array-Elemente entfernen . HINWEIS: die Arraylist ist 'Ergebnis' und "isLinkBroken (neue URL (element.getAttribute (" href ")))" ist eine Funktion, die einige value.the betroffenen Code-Schnipsel zurück ist unten angegeben:behalten Newline in Word-Datei-Generierung mit Apache POI

protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException { 
    String url= request.getParameter("url"); 
    System.setProperty("webdriver.chrome.driver", "H:\\suraj\\sftwr\\chromedriver_win32\\chromedriver.exe"); 
    ChromeDriver ff = new ChromeDriver(); 
    ff.get("http://"+url); 
    ArrayList result = new ArrayList();   
    List<WebElement> allImages = findAllLinks(ff); 
    int i=0; 
    System.out.println("Total number of elements found " + allImages.size()); 
    for(WebElement element : allImages){ 
     try {    
     if(!isLinkBroken(new URL(element.getAttribute("href"))).equals("OK")) { 
      i++; 
      System.out.println("inside"+i); 
      System.out.println("URL: " + element.getAttribute("href")+ " returned " + isLinkBroken(new URL(element.getAttribute("href")))); 
      result.add(i+" URL: " + element.getAttribute("href")+ " returned " + isLinkBroken(new URL(element.getAttribute("href")))+"\n"); 
     } 
     } 
     catch(Exception exp) { 
     System.out.println("outside"); 
     System.out.println("At " + element.getAttribute("innerHTML") + " Exception occured -&gt; " + exp.getMessage());     
     } 
    } 
    System.out.println("OUTPUT"); 
    System.out.println(result.toString()); 
    FileOutputStream outStream=new FileOutputStream("H:\\suraj\\InactiveURL\\test.docx"); 
    XWPFDocument doc=new XWPFDocument(); 
    XWPFParagraph para = doc.createParagraph(); 
    para.setAlignment(ParagraphAlignment.LEFT); 
    XWPFRun pararun=para.createRun(); 
    pararun.setText(result.toString()); 
    doc.write(outStream); 
    outStream.close(); 
}  

Antwort

0

Um das Listenobjekt auf die setText-Methode zu setzen, sollten Sie die Liste durchlaufen und Inhalte mit dem String-Builder erstellen. Hier

ist der Beispielcode:

XWPFRun pararun = para.createRun(); 
    StringBuilder content = new StringBuilder(); 
    for (int j = 0; j < result.size(); j++) { 
     content.append(result.get(j)); 
    } 
    pararun.setText(content.toString()); 
    doc.write(outStream); 
+0

Danke für die Antwort Uday, aber die Lösung spiegelt keine Änderung wider. Die Worddatei hat immer noch keine Zeilenumbrüche dazwischen. –

0

Das Wort .docx Format kodiert nicht Newlines (noch andere Leerzeichen bricht wie Tabs) als ihre Mutter ascii Darstellungen. Stattdessen müssen Sie für jene

zusätzliche XML-Tags verwenden Wenn Sie an der JavaDocs for XWPFRun anschauen, werden Sie alle Leerzeichen Pause Optionen, wie XWPFRun.addTab() und XWPFRun.addCarriageReturn()

Es gibt sehen eine good example in the XWPF examples, die Sie durchlesen sollten. Im Grunde aber, um den Text zu nehmen

This is line one 
This is line two 

Und kodieren, dass in .docx mit XWPF, sollten Sie so etwas tun

XWPFParagraph p1 = doc.createParagraph(); 
XWPFRun r1 = p1.createRun(); 

r1.setText("This is line one"); 
r1.addCarriageReturn(); 
r1.setText("This is line two"); 

Wenn Sie aus einem Textblock fangen, dann sollten Sie aufgeteilt, dass auf Zeilenumbrüche. Als nächstes fügen Sie jede Trennlinie mit einem separaten run.setText Anruf, und machen Sie einen run.addCarriageReturn zwischen jeder

+0

Danke für die ausführliche Antwort Gagravarr; Ich kam früher durch diese vordefinierten Methoden, aber das Problem, das bei ihrer Verwendung entsteht, ist, dass die Anzahl der hinzuzufügenden Absätze vorher nicht bekannt ist und ich daher eine Schleife ausführen muss und innerhalb jeder Schleife einen Absatz erstellen sollte. Aber dieser Ansatz überschreibt die früheren Absätze (da alle Absatzvariablen daher denselben Namen haben und ich denke, dass das der Grund ist) und nur ein einziger Absatz wird zuletzt gedruckt. –

+0

Dann machst du etwas sehr falsch!Erstellen Sie einfach einen neuen Absatz für jede Schleife, überschreiben Sie nicht die alte. Ohne Code können wir nicht helfen, aber es gibt nichts auf der POI-Ebene, es zu stoppen, nur Bugs in Ihrem Code .... – Gagravarr

0

Wenn Sie in Word Begriffen denken, wenn Sie die Sie wirklich einen neuen Absatz Eingabetaste drücken Schlüssel hinzufügen. Wenn Sie einen Zeilenumbruch wünschen, sollten Sie für jedes Element im Array einen neuen Absatz hinzufügen, anstatt alles in einem einzigen Absatz zu speichern.

Hier sind einige Änderungen an Ihrem Code:

protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException { 
    String url= request.getParameter("url"); 
    System.setProperty("webdriver.chrome.driver", "H:\\suraj\\sftwr\\chromedriver_win32\\chromedriver.exe"); 
    ChromeDriver ff = new ChromeDriver(); 
    ff.get("http://"+url); 
    ArrayList<String> result = new ArrayList<String>();   
    List<WebElement> allImages = findAllLinks(ff); 
    int i=0; 
    System.out.println("Total number of elements found " + allImages.size()); 
    for(WebElement element : allImages){ 
     try {    
     if(!isLinkBroken(new URL(element.getAttribute("href"))).equals("OK")) { 
      i++; 
      System.out.println("inside"+i); 
      System.out.println("URL: " + element.getAttribute("href")+ " returned " + isLinkBroken(new URL(element.getAttribute("href")))); 
      result.add(i+" URL: " + element.getAttribute("href")+ " returned " + isLinkBroken(new URL(element.getAttribute("href")))); 
     } 
     } 
     catch(Exception exp) { 
     System.out.println("outside"); 
     System.out.println("At " + element.getAttribute("innerHTML") + " Exception occured -&gt; " + exp.getMessage());     
     } 
    } 
    System.out.println("OUTPUT"); 
    System.out.println(result.toString()); 
    FileOutputStream outStream=new FileOutputStream("H:\\suraj\\InactiveURL\\test.docx"); 
    XWPFDocument doc=new XWPFDocument(); 
    for (String elem : result) { 
     XWPFParagraph para = doc.createParagraph(); 
     XWPFRun pararun=para.createRun(); 
     pararun.setText(elem); 
    } 
    doc.write(outStream); 
    outStream.close(); 
} 

Hinweis: Ich habe das Newline-Zeichen aus der Zeichenfolge entfernt und hinzugefügt Liste Generic Array. Diese sollten Ihre Ausgabe nicht ändern (außer auf der Konsole). Die wirkliche Änderung besteht darin, den Absatz in eine Schleife zu schreiben. Das sollte jedoch viele Absätze hinzufügen, die Sie für das Dokument benötigen.

+0

Danke für die detaillierte Antwort jmarkmurphy; Ich kam früher durch diese vordefinierten Methoden, aber das Problem, das bei ihrer Verwendung entsteht, ist, dass die Anzahl der hinzuzufügenden Absätze vorher nicht bekannt ist und ich daher eine Schleife ausführen muss und innerhalb jeder Schleife einen Absatz erstellen sollte. Aber dieser Ansatz überschreibt die früheren Absätze (da alle Absatzvariablen daher denselben Namen haben und ich denke, dass das der Grund ist) und nur ein einziger Absatz wird zuletzt gedruckt. –

+0

Danke lieber jmarkmurphy; Es hat genau so funktioniert, wie ich es wollte. hail den Geist der Codierung :) –

+0

Wenn dies die Antwort auf Ihre Frage war, bitte upvote und markieren Sie als beantwortet. – jmarkmurphy