`

docx文件替换内容

    博客分类:
  • java
 
阅读更多

package com.test;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigInteger;
import java.util.HashMap;
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.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHpsMeasure;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr;

public class XwpfTest {

    public static void main(String[] args) throws Exception {
        XwpfTest xwpfTest = new XwpfTest();
        xwpfTest.testTemplateWrite();
    }

    /**
     * 用一个docx文档作为模板,然后替换其中的内容,再写入目标文档中。
     *
     * @throws Exception
     */
    public void testTemplateWrite() throws Exception {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("yearstart", "2014"); 
        params.put("monthstart", "01"); 
        params.put("daystart", "02"); 
        params.put("yearend", "2017"); 
        params.put("monthend", "07"); 
        params.put("dayend", "07");
        params.put("username", "乙方"); //用户名
        params.put("idcard", "333333333333"); //身份证号
        params.put("householdaddress", ""); //户籍地址
        params.put("localaddress", "联系地址"); //联系地址
        params.put("zipcode", "666666");   //邮政编码
        params.put("begin", "2014年01月02日"); //合同开始日期
        params.put("enddate", "2017年07月07日"); //合同结束日期
        params.put("mobile", "151045222233");  //联系电话
        params.put("userpost", "java工程师");  //岗位
        params.put("orgcode", "综合部");  //所在部门
        params.put("userno", "43000");  //工号
        params.put("email", "123@163.com");  //工号
        params.put("systemuserid", "yi.fang");  //登录名
        params.put("probation", "6");  //登录名
        params.put("tel","2222222222");  //登录名

       
        String filePath = "D:\\temp\\【合同模板】个股期权软件许可合同V1.0_20150701发布版.docx";
        InputStream is = new FileInputStream(filePath);
        XWPFDocument doc = new XWPFDocument(is);
        this.replaceInPara(doc, params);
        // 替换表格里面的变量
        this.replaceInTable(doc, params);
        String fileName = "D:\\temp\\" + System.currentTimeMillis();
        fileName += ".docx";
        ByteArrayOutputStream ostream = new ByteArrayOutputStream();
        FileOutputStream os = new FileOutputStream(fileName);
        doc.write(ostream);
        os.write(ostream.toByteArray());
       
       
        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 text = para.getParagraphText();
        if (this.matcher(text.trim()).find()) {
            System.out.println("==="+text.trim());
            runs = para.getRuns();
            for (int i = 0; i < runs.size(); i++) {
                System.out.println("size="+runs.size());
                XWPFRun run = runs.get(i);
                String runText = run.toString();
                System.out.println("1111111"+runText);
                matcher = this.matcher(runText);
                if (matcher.find()) {
                    while ((matcher = this.matcher(runText)).find()) {
                        System.out.println("4444444"+matcher.group(1));
                        runText = matcher.replaceFirst(String.valueOf(params
                                .get(matcher.group(1))));
                    }
                    // 直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun,把文本附加在当前文本后面,
                    // 所以我们不能直接设值,需要先删除当前run,然后再自己手动插入一个新的run。
                    System.out.println("22"+runText);
                    run.setText(runText,0);
                   
                   
                }
            }
        }

    }

    /**
     * 替换表格里面的变量
     *
     * @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();
            }
        }
    }
   
    public static void setFontSize(int size,CTR run)
    {
        CTRPr pr = run.isSetRPr() ? run.getRPr() : run.addNewRPr();
        CTHpsMeasure ctSize = pr.isSetSz() ? pr.getSz() : pr.addNewSz();
        ctSize.setVal(new BigInteger("21"));
    }
   
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics