2016-05-28 68 views
0

我正在嘗試使用apache POI通過收集arraylist中的一些數據然後將其打印在控制檯輸出以及word文件中來動態生成word文件。我能夠在控制檯以及word文件中獲得輸出,但在每個arraylist元素中,我在最後添加了一個新的行字符,以便數組元素以行方式打印。在控制檯輸出新的行字符工作,即arraylist元素行,但在生成的文件文件中缺少換行符。如何保留生成的word文件中的換行符,並刪除數組元素末尾的逗號。 注:ArrayList的是 '結果' 和 「isLinkBroken(新URL(element.getAttribute(」 HREF 「)))」 是返回一些價值。有關代碼段下面給出一個函數:在使用apache POI的word文件生成中保留換行符

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(); 
}  

回答

0

將列表對象設置爲setText方法,您應該遍歷列表並使用字符串構建器創建內容。

下面是示例代碼:

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

感謝您的反應,但解決方案沒有反映任何變化。 word文件之間仍然沒有換行符。 –

0

話語.docx格式不編碼換行符(還是其他空白符狀突片)作爲他們的母語ASCII表示。相反,你需要的,如果你看一下JavaDocs for XWPFRun使用額外的XML標記那些

,你會看到所有的空格破選項,如XWPFRun.addTab()XWPFRun.addCarriageReturn()

有一個good example in the XWPF examples,你應該通讀。但是基本上,採取文字

This is line one 
This is line two 

而且使用XWPF編碼成.docx,你應該這樣做

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

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

如果你從文本塊開始,你應該拆分上換行。接着,添加每個分割線有獨立的run.setText調用,如果你想在Word方面做之間run.addCarriageReturn每個

+0

感謝您的詳細回覆Gagravarr;我之前通過了這些預定義的方法,但使用它們時出現的問題是,要添加的段落的數量並不是事先知道的,因此我需要運行一個循環,並在每個循環內部創建一個段落。但是這種方法覆蓋了前面的段落(因爲所有段落變量因此具有相同的名稱,並且我認爲這是原因)並且最後只打印單個段落。 –

+0

然後你做的事情非常錯誤!只需在每個循環中創建一個新段落,不要覆蓋舊段落。如果沒有代碼,我們無法提供幫助,但POI級別上的任何內容都無法阻止它,只是代碼中存在bug ... – Gagravarr

0

,當你按下回車鍵,你真的加入新的段落。如果你想要在行之間進行中斷,那麼應該爲數組中的每個元素添加一個新段落,而不是試圖將所有內容都放在一個段落中。

這裏有一些修改代碼:

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(); 
} 

注:我從你的字符串刪除換行符,並增加了一個通用到您的數組列表。這些不應該改變你的輸出(除了在控制檯上)。真正的改變是將創建段落放在一個循環中。這應該增加你需要的許多段落到文檔中。

+0

感謝您的詳細回覆jmarkmurphy;我之前通過了這些預定義的方法,但使用它們時出現的問題是,要添加的段落的數量並不是事先知道的,因此我需要運行一個循環,並在每個循環內部創建一個段落。但是這種方法覆蓋了前面的段落(因爲所有段落變量因此具有相同的名稱,並且我認爲這是原因)並且最後只打印單個段落。 –

+0

謝謝親愛的jmarkmurphy;它按我想要的方式工作。歡迎編碼精神:) –

+0

如果這是您的問題的答案,請upvote並標記爲已回答。 – jmarkmurphy

相關問題