Java读写docx文档(读取内容并替换其中的关键字)

Java读取.docx(兼容.doc)文档,并替换其中的关键字为需要的内容,而这些关键字是动态配置的,并不固定,你并不知道配置中的关键字有哪些。
思路:
1.找到文档中的关键字:我们将需要替换的关键字放在配置文件中动态的配置然后读取,本例中关键字形式为${关键字},当然,也可以通过正则来找到关键字;
2.遍历配置文档,找到其中的关键字,同时遍历配置文件,如果该关键字在配置文件中存在,那么替换掉这个关键字,否则进行下一次循环。
下面贴我的代码。
需要的jar包:
dom4j-1.6.1.jar
poi-3.8-20120326.jar
poi-examples-3.8-20120326.jar
poi-excelant-3.8-20120326.jar
poi-ooxml-3.8-20120326.jar
poi-ooxml-schemas-3.8-20120326.jar
poi-scratchpad-3.8-20120326.jar
xmlbeans-2.3.0.jar
maven地址:

        <dependency>  
            <groupId>org.apache.poi</groupId>  
            <artifactId>poi</artifactId>  
            <version>3.9</version>  
        </dependency>  
        <dependency>  
            <groupId>org.apache.poi</groupId>  
            <artifactId>poi-ooxml</artifactId>  
            <version>3.9</version>  
        </dependency>  
        <dependency>  
            <groupId>org.apache.poi</groupId>  
            <artifactId>poi-ooxml-schemas</artifactId>  
            <version>3.9</version>  
        </dependency>

我上传的这些jar包的地址:http://download.csdn.net/detail/innerpeacescorpio/9619679
源文档内容示例:

                                            协议书
  甲方(受让人):${PARTY_A}
  乙方(转让人):________
  丙方(债务人):________
  为妥善解决甲、乙、丙三方的债权债务问题,甲、乙、丙三方在平等自愿、协商一致的基础上,依据合同法等有关法律、法规,就债权转让事宜达成如下协议:
  第一、债权转让
  1.1、乙方同意按本协议的条款和条件向甲方转让债权,甲方同意按本协议的条款和条件从乙方受让债权。
  1.2、经各方同意,本协议项下的债权转让是有偿的,丙方同意在债权转让完成后向甲方偿还债务,该等债务包括本金(人民币${MONEY}元)和利息(利息率${FEE})。
      配置文件:
  fileSrc=F:\\word.docx
  fileDest=F:\\new.docx
  ${PARTY_A}=andy
  ${MONEY}=100
  ${FEE}=1%

代码

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;

/**
 *
 * @author andy
 * @date 2016年8月5日
 */
public class Test2 {

    public static void main(String[] args) {
        Test2 test = new Test2();
        Map<String, Object> param = new HashMap<String, Object>();
        List<String> keyList = new ArrayList<String>();
        List<Object> valueList = new ArrayList<Object>();

        // 获取配置文件所有键值对
        Properties p = test.readP();// 配置文件读取的参数
        Iterator<Object> iterator = p.keySet().iterator();
        while (iterator.hasNext()) {
            keyList.add(iterator.next().toString());
        }
        Iterator<Object> iterator2 = p.keySet().iterator();
        while (iterator2.hasNext()) {
            valueList.add(p.getProperty(iterator2.next().toString()));
        }
        for (int i = 0; i < keyList.size(); i++) {
            System.out.println(keyList.get(i) + ":" + valueList.get(i));
            param.put(keyList.get(i), valueList.get(i));
        }
        // 替换文档关键字
        WordUtil.generateWord(param, param.get("fileSrc").toString(), param.get("fileDest").toString());
    }

    /**
     * 读取配置文件
     * 
     * @return
     */
    private Properties readP() {
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("config.properties");
        Properties p = new Properties();
        try {
            p.load(inputStream);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        return p;
    }
}
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.poi.POIXMLDocument;
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;

/**
 *
 * @author andy
 * @date 2016年8月5日
 */
public class WordUtil {

    public static void generateWord(Map<String, Object> param, String fileSrc, String fileDest) {
        XWPFDocument doc = null;
        OPCPackage pack = null;
        try {
            pack = POIXMLDocument.openPackage(fileSrc);
            doc = new XWPFDocument(pack);
            if (param != null && param.size() > 0) {
                // 处理段落
                List<XWPFParagraph> paragraphList = doc.getParagraphs();
                processParagraphs(paragraphList, param, doc);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        FileOutputStream fopts = null;
        try {
            fopts = new FileOutputStream(fileDest);
            doc.write(fopts);
            pack.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            closeStream(fopts);
        }
    }

    public static void closeStream(FileOutputStream fopts) {
        try {
            fopts.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 处理段落,替换关键字
     * 
     * @param paragraphList
     * @throws FileNotFoundException
     * @throws InvalidFormatException
     */
    public static void processParagraphs(List<XWPFParagraph> paragraphList, Map<String, Object> param, XWPFDocument doc)
            throws InvalidFormatException, FileNotFoundException {
        if (paragraphList != null && paragraphList.size() > 0) {
            // 遍历所有段落
            for (XWPFParagraph paragraph : paragraphList) {
                List<XWPFRun> runs = paragraph.getRuns();
                for (XWPFRun run : runs) {
                    String text = run.getText(0);
                    // System.out.println("text==" + text);
                    if (text != null) {
                        boolean isSetText = false;
                        for (Entry<String, Object> entry : param.entrySet()) {
                            String key = entry.getKey();
                            if (text.indexOf(key) != -1) {// 在配置文件中有这个关键字对应的键
                                isSetText = true;
                                Object value = entry.getValue();
                                if (value instanceof String) {// 文本替换
                                    // System.out.println("key==" + key);
                                    if (text.contains(key)) {
                                        text = text.replace(key, value.toString());
                                    }
                                }
                            }
                        }
                        if (isSetText) {
                            run.setText(text, 0);
                        }
                    }
                }
            }
        }
    }
}

替换后的文档

                                            协议书
  甲方(受让人):andy
  乙方(转让人):________
  丙方(债务人):________
  为妥善解决甲、乙、丙三方的债权债务问题,甲、乙、丙三方在平等自愿、协商一致的基础上,依据合同法等有关法律、法规,就债权转让事宜达成如下协议:
  第一、债权转让
  1.1、乙方同意按本协议的条款和条件向甲方转让债权,甲方同意按本协议的条款和条件从乙方受让债权。
  1.2、经各方同意,本协议项下的债权转让是有偿的,丙方同意在债权转让完成后向甲方偿还债务,该等债务包括本金(人民币100元)和利息(利息率1%)。
  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值