word 包括列表的 套打 (已經解決有的可以 有的不可以) 針對拆分到兩個甚至更多的XWPFRun中問題


 
public class XwpfTest {
 
   /**
    * 用一個docx文檔作為模板,然后替換其中的內容,再寫入目標文檔中。
    * @throws Exception
    */
   @Test
   public void testTemplateWrite() throws Exception {
      Map<String, Object> params = new HashMap<String, Object>();
      params.put("reportDate", "2014-02-28");
      params.put("appleAmt", "100.00");
      params.put("bananaAmt", "200.00");
      params.put("totalAmt", "300.00");
      String filePath = "D:\\word\\template.docx";
      InputStream is = new FileInputStream(filePath);
      XWPFDocument doc = new XWPFDocument(is);
      //替換段落里面的變量
      this.replaceInPara(doc, params);
      //替換表格里面的變量
      this.replaceInTable(doc, params);
      OutputStream os = new FileOutputStream("D:\\word\\write.docx");
      doc.write(os);
      this.close(os);
      this.close(is);
   }
 
   /**
    * 替換段落里面的變量
    * @param doc 要替換的文檔
    * @param params 參數
    */
   private void replaceInPara(XWPFDocument doc, Map<String, Object> params) {
      Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();
      XWPFParagraph para;
      while (iterator.hasNext()) {
         para = iterator.next();
         this.replaceInPara(para, params);
      }
   }
 
   /**
    * 替換段落里面的變量
    * @param para 要替換的段落
    * @param params 參數
    */
   private void replaceInPara(XWPFParagraph para, Map<String, Object> params) {
      List<XWPFRun> runs;
      Matcher matcher;

      String runText="";
      if (this.matcher(para.getParagraphText()).find()) {
         runs = para.getRuns();
         if (runs.size()>0){

      int j = runs.size();

      for (int i = 0;i<j;i++){

        XWPFRun run = runs.get(0);

        String i1 = run.toString;

        runText+=i1;

        para.removeRun(0);

      }

    }
            matcher = this.matcher(runText);

            if (matcher.find()) {
                while ((matcher = this.matcher(runText)).find()) {
                   runText = matcher.replaceFirst(String.valueOf(params.get(matcher.group(1))));
                }
                //直接調用XWPFRun的setText()方法設置文本時,在底層會重新創建一個XWPFRun,把文本附加在當前文本后面,
                //所以我們不能直接設值,需要先刪除當前run,然后再自己手動插入一個新的run。
              
                para.insertNewRun(0).setText(runText);
            }
         }
      }
   }
 
   /**
    * 替換表格里面的變量
    * @param doc 要替換的文檔
    * @param params 參數
    */
   private void replaceInTable(XWPFDocument doc, Map<String, Object> params) {
      Iterator<XWPFTable> iterator = doc.getTablesIterator();
      XWPFTable table;
      List<XWPFTableRow> rows;
      List<XWPFTableCell> cells;
      List<XWPFParagraph> paras;
      while (iterator.hasNext()) {
         table = iterator.next();
         rows = table.getRows();
         for (XWPFTableRow row : rows) {
            cells = row.getTableCells();
            for (XWPFTableCell cell : cells) {
                paras = cell.getParagraphs();
                for (XWPFParagraph para : paras) {
                   this.replaceInPara(para, params);
                }
            }
         }
      }
   }
 
   /**
    * 正則匹配字符串
    * @param str
    * @return
    */
   private Matcher matcher(String str) {
      Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);
      Matcher matcher = pattern.matcher(str);
      return matcher;
   }
 
   /**
    * 關閉輸入流
    * @param is
    */
   private void close(InputStream is) {
      if (is != null) {
         try {
            is.close();
         } catch (IOException e) {
            e.printStackTrace();
         }
      }
   }
 
   /**
    * 關閉輸出流
    * @param os
    */
   private void close(OutputStream os) {
      if (os != null) {
         try {
            os.close();
         } catch (IOException e) {
            e.printStackTrace();
         }
      }
   }
 
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM