360SDN.COM

首页/Java/列表

java使用XWPFDocument读取word并修改发送

来源:  2017-10-24 14:14:26    评论:0点击:

isFile为文件路径,data为一个map对象,data.put("userName",userName);那么就需要在文档中写${userName}就可以输出到文档了
[java] view plain copy
 
    package com.jeeplus.modules.stock;  
      
    import java.io.FileInputStream;  
    import java.io.FileOutputStream;  
    import java.io.IOException;  
    import java.io.InputStream;  
    import java.io.OutputStream;  
    import java.util.Iterator;  
    import java.util.List;  
    import java.util.Map;  
    import java.util.regex.Matcher;  
    import java.util.regex.Pattern;  
      
    import org.apache.poi.openxml4j.exceptions.InvalidFormatException;  
    import org.apache.poi.openxml4j.opc.OPCPackage;  
    import org.apache.poi.xwpf.usermodel.XWPFDocument;  
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;  
    import org.apache.poi.xwpf.usermodel.XWPFRun;  
      
      
    public class FileAlterInfo {  
        /** 
         * 实现对word读取和修改操作 
         * 
         * @param filePath 
         *            word模板路径和名称 
         * @param map 
         *            待填充的数据,从数据库读取 
         * @throws IOException 
         * @throws InvalidFormatException 
         */  
        public static void readwriteWord(String inFile, Map<String, Object> data) throws InvalidFormatException, IOException {  
            InputStream is = new FileInputStream(inFile);  
            XWPFDocument document;  
            try {  
                document = new XWPFDocument(OPCPackage.open(is));  
                // 替换段落里面的变量  
                replaceInPara(document, data);  
                OutputStream os = new FileOutputStream(inFile);  
                document.write(os);  
                close(os);  
                close(is);  
            } catch (Exception e) {  
      
                e.printStackTrace();  
            }  
      
        }  
      
        /** 
         * 替换段落里面的变量 
         * 
         * @param doc 
         *            要替换的文档 
         * @param params 
         *            参数 
         */  
        private static void replaceInPara(XWPFDocument doc, Map<String, Object> params) {  
            Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();  
            XWPFParagraph para;  
            while (iterator.hasNext()) {  
                para = iterator.next();  
                replaceInPara(para, params);  
            }  
        }  
      
        /** 
         * 替换段落里面的变量 
         * 
         * @param para 
         *            要替换的段落 
         * @param params 
         *            参数 
         */  
        private static void replaceInPara(XWPFParagraph para, Map<String, Object> params) {  
            List<XWPFRun> runs;  
            Matcher matcher;  
            String runText = "";  
      
                if (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);  
      
                        }  
      
                    }  
                System.out.println(runText);  
                    matcher = matcher(runText);  
      
                    if (matcher.find()) {  
                        while ((matcher = matcher(runText)).find()) {  
                            runText = matcher.replaceFirst(String.valueOf(params.get(matcher.group(1))));  
                        }  
                        // 直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun,把文本附加在当前文本后面,  
                        // 所以我们不能直接设值,需要先删除当前run,然后再自己手动插入一个新的run。  
                        para.insertNewRun(0).setText(runText);  
                    }  
                }  
      
        }  
      
        /** 
         * 正则匹配字符串 
         * 
         * @param str 
         * @return 
         */  
        private static Matcher matcher(String str) {  
            Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);  
            Matcher matcher = pattern.matcher(str);  
            return matcher;  
        }  
      
        /** 
         * 关闭输入流 
         * 
         * @param is 
         */  
        private static void close(InputStream is) {  
            if (is != null) {  
                try {  
                    is.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
      
        /** 
         * 关闭输出流 
         * 
         * @param os 
         */  
        private static void close(OutputStream os) {  
            if (os != null) {  
                try {  
                    os.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  
为您推荐

友情链接 |九搜汽车网 |手机ok生活信息网|ok生活信息网|ok微生活
 Powered by www.360SDN.COM   京ICP备11022651号-4 © 2012-2016 版权