| 
					
				 | 
			
			
				@@ -0,0 +1,197 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+package com.huaxu.test; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.poi.POIXMLDocument; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.poi.xwpf.usermodel.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.io.File; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.io.FileOutputStream; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.io.IOException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.List; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.Map; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.Set; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+public class WordUtil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 根据模板生成新word文档 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 判断表格是需要替换还是需要插入,判断逻辑有$为替换,表格无$为插入 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param inputUrl 模板存放地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param textMap 需要替换的信息集合 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param tableList 需要插入的表格信息集合 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return 成功返回true,失败返回false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static boolean changWord(String inputUrl, String outputUrl, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    Map<String, String> textMap, List<String[]> tableList) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //模板转换默认成功 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        boolean changeFlag = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //获取docx解析对象 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(inputUrl)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //解析替换文本段落对象 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            changeText(document, textMap); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //解析替换表格对象 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           changeTable(document, textMap, tableList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //生成新的word 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            File file = new File(outputUrl); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            FileOutputStream stream = new FileOutputStream(file); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            document.write(stream); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            stream.close(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (IOException e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            e.printStackTrace(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            changeFlag = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return changeFlag; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 替换段落文本 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param document docx解析对象 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param textMap 需要替换的信息集合 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static void changeText(XWPFDocument document, Map<String, String> textMap){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //获取段落集合 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<XWPFParagraph> paragraphs = document.getParagraphs(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (XWPFParagraph paragraph : paragraphs) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //判断此段落时候需要进行替换 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String text = paragraph.getText(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(checkText(text)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                List<XWPFRun> runs = paragraph.getRuns(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for (XWPFRun run : runs) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    //替换模板原来位置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    run.setText(changeValue(run.toString(), textMap),0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 替换表格对象方法 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param document docx解析对象 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param textMap 需要替换的信息集合 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param tableList 需要插入的表格信息集合 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static void changeTable(XWPFDocument document, Map<String, String> textMap, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                   List<String[]> tableList){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //获取表格对象集合 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<XWPFTable> tables = document.getTables(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (int i = 0; i < tables.size(); i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //只处理行数大于等于2的表格,且不循环表头 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            XWPFTable table = tables.get(i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(table.getRows().size()>1){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //判断表格是需要替换还是需要插入,判断逻辑有$为替换,表格无$为插入 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(checkText(table.getText())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    List<XWPFTableRow> rows = table.getRows(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    //遍历表格,并替换模板 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    eachTable(rows, textMap); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                  System.out.println("插入"+table.getText()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    insertTable(table, tableList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 遍历表格 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param rows 表格行对象 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param textMap 需要替换的信息集合 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static void eachTable(List<XWPFTableRow> rows ,Map<String, String> textMap){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (XWPFTableRow row : rows) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            List<XWPFTableCell> cells = row.getTableCells(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (XWPFTableCell cell : cells) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //判断单元格是否需要替换 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(checkText(cell.getText())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    List<XWPFParagraph> paragraphs = cell.getParagraphs(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for (XWPFParagraph paragraph : paragraphs) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        List<XWPFRun> runs = paragraph.getRuns(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        for (XWPFRun run : runs) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            run.setText(changeValue(run.toString(), textMap),0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 为表格插入数据,行数不够添加新行 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param table 需要插入数据的表格 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param tableList 插入数据集合 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static void insertTable(XWPFTable table, List<String[]> tableList){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //创建行,根据需要插入的数据添加新行,不处理表头 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for(int i = 1; i < tableList.size(); i++){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            XWPFTableRow row =table.createRow(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //遍历表格插入数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<XWPFTableRow> rows = table.getRows(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for(int i = 2; i < rows.size(); i++){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            XWPFTableRow newRow = table.getRow(i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            newRow.addNewTableCell(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            newRow.addNewTableCell(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            List<XWPFTableCell> cells = newRow.getTableCells(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for(int j = 0; j < cells.size(); j++){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                XWPFTableCell cell = cells.get(j); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                int index=i-2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 cell.setText(tableList.get(index)[j]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 判断文本中时候包含$ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param text 文本 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return 包含返回true,不包含返回false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static boolean checkText(String text){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        boolean check  =  false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(text.indexOf("$")!= -1){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            check = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return check; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 匹配传入信息集合与模板 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param value 模板需要替换的区域 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param textMap 传入信息集合 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return 模板需要替换区域信息集合对应值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static String changeValue(String value, Map<String, String> textMap){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Set<Map.Entry<String, String>> textSets = textMap.entrySet(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (Map.Entry<String, String> textSet : textSets) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //匹配模板与替换值 格式${key} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String key = "${"+textSet.getKey()+"}"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(value.indexOf(key)!= -1){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                value = textSet.getValue(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //模板未匹配到区域替换为空 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(checkText(value)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            value = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |