XWPFDocument给word中参数赋值并修改发送

isFile为文件路径,data为一个map对象,data.put("userName",userName);那么就需要在文档中写${userName}就可以输出到文档了

  1. package com.jeeplus.modules.stock;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.io.OutputStream;  
  8. import java.util.Iterator;  
  9. import java.util.List;  
  10. import java.util.Map;  
  11. import java.util.regex.Matcher;  
  12. import java.util.regex.Pattern;  
  13.   
  14. import org.apache.poi.openxml4j.exceptions.InvalidFormatException;  
  15. import org.apache.poi.openxml4j.opc.OPCPackage;  
  16. import org.apache.poi.xwpf.usermodel.XWPFDocument;  
  17. import org.apache.poi.xwpf.usermodel.XWPFParagraph;  
  18. import org.apache.poi.xwpf.usermodel.XWPFRun;  
  19.   
  20.   
  21. public class FileAlterInfo {  
  22.     /** 
  23.      * 实现对word读取和修改操作 
  24.      * 
  25.      * @param filePath 
  26.      *            word模板路径和名称 
  27.      * @param map 
  28.      *            待填充的数据,从数据库读取 
  29.      * @throws IOException 
  30.      * @throws InvalidFormatException 
  31.      */  
  32.     public static void readwriteWord(String inFile, Map<String, Object> data) throws InvalidFormatException, IOException {  
  33.         InputStream is = new FileInputStream(inFile);  
  34.         XWPFDocument document;  
  35.         try {  
  36.             document = new XWPFDocument(OPCPackage.open(is));  
  37.             // 替换段落里面的变量  
  38.             replaceInPara(document, data);  
  39.             OutputStream os = new FileOutputStream(inFile);  
  40.             document.write(os);  
  41.             close(os);  
  42.             close(is);  
  43.         } catch (Exception e) {  
  44.   
  45.             e.printStackTrace();  
  46.         }  
  47.   
  48.     }  
  49.   
  50.     /** 
  51.      * 替换段落里面的变量 
  52.      * 
  53.      * @param doc 
  54.      *            要替换的文档 
  55.      * @param params 
  56.      *            参数 
  57.      */  
  58.     private static void replaceInPara(XWPFDocument doc, Map<String, Object> params) {  
  59.         Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();  
  60.         XWPFParagraph para;  
  61.         while (iterator.hasNext()) {  
  62.             para = iterator.next();  
  63.             replaceInPara(para, params);  
  64.         }  
  65.     }  
  66.   
  67.     /** 
  68.      * 替换段落里面的变量 
  69.      * 
  70.      * @param para 
  71.      *            要替换的段落 
  72.      * @param params 
  73.      *            参数 
  74.      */  
  75.     private static void replaceInPara(XWPFParagraph para, Map<String, Object> params) {  
  76.         List<XWPFRun> runs;  
  77.         Matcher matcher;  
  78.         String runText = "";  
  79.   
  80.             if (matcher(para.getParagraphText()).find()) {  
  81.                 runs = para.getRuns();  
  82.                 if (runs.size() > 0) {  
  83.                     int j = runs.size();  
  84.                     for (int i = 0; i < j; i++) {  
  85.                         XWPFRun run = runs.get(0);  
  86.                     String i1 = run.toString();  
  87.                         runText += i1;  
  88.                         para.removeRun(0);  
  89.   
  90.                     }  
  91.   
  92.                 }  
  93.             System.out.println(runText);  
  94.                 matcher = matcher(runText);  
  95.   
  96.                 if (matcher.find()) {  
  97.                     while ((matcher = matcher(runText)).find()) {  
  98.                         runText = matcher.replaceFirst(String.valueOf(params.get(matcher.group(1))));  
  99.                     }  
  100.                     // 直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun,把文本附加在当前文本后面,  
  101.                     // 所以我们不能直接设值,需要先删除当前run,然后再自己手动插入一个新的run。  
  102.                     para.insertNewRun(0).setText(runText);  
  103.                 }  
  104.             }  
  105.   
  106.     }  
  107.   
  108.     /** 
  109.      * 正则匹配字符串 
  110.      * 
  111.      * @param str 
  112.      * @return 
  113.      */  
  114.     private static Matcher matcher(String str) {  
  115.         Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);  
  116.         Matcher matcher = pattern.matcher(str);  
  117.         return matcher;  
  118.     }  
  119.   
  120.     /** 
  121.      * 关闭输入流 
  122.      * 
  123.      * @param is 
  124.      */  
  125.     private static void close(InputStream is) {  
  126.         if (is != null) {  
  127.             try {  
  128.                 is.close();  
  129.             } catch (IOException e) {  
  130.                 e.printStackTrace();  
  131.             }  
  132.         }  
  133.     }  
  134.   
  135.     /** 
  136.      * 关闭输出流 
  137.      * 
  138.      * @param os 
  139.      */  
  140.     private static void close(OutputStream os) {  
  141.         if (os != null) {  
  142.             try {  
  143.                 os.close();  
  144.             } catch (IOException e) {  
  145.                 e.printStackTrace();  
  146.             }  
  147.         }  
  148.     }  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值