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

时间:2025-03-18 09:31:25

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

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

我上传的这些jar包的地址:/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 ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;

/**
 *
 * @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 = ();// 配置文件读取的参数
        Iterator<Object> iterator = ().iterator();
        while (()) {
            (().toString());
        }
        Iterator<Object> iterator2 = ().iterator();
        while (()) {
            ((().toString()));
        }
        for (int i = 0; i < (); i++) {
            ((i) + ":" + (i));
            ((i), (i));
        }
        // 替换文档关键字
        (param, ("fileSrc").toString(), ("fileDest").toString());
    }

    /**
     * 读取配置文件
     * 
     * @return
     */
    private Properties readP() {
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("");
        Properties p = new Properties();
        try {
            (inputStream);
        } catch (IOException e1) {
            ();
        }
        return p;
    }
}
import ;
import ;
import ;
import ;
import ;
import ;

import ;
import .;
import .;
import ;
import ;
import ;

/**
 *
 * @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 = (fileSrc);
            doc = new XWPFDocument(pack);
            if (param != null && () > 0) {
                // 处理段落
                List<XWPFParagraph> paragraphList = ();
                processParagraphs(paragraphList, param, doc);
            }
        } catch (Exception e) {
            ();
        }
        FileOutputStream fopts = null;
        try {
            fopts = new FileOutputStream(fileDest);
            (fopts);
            ();
        } catch (IOException e) {
            ();
        } finally {
            closeStream(fopts);
        }
    }

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

    /**
     * 处理段落,替换关键字
     * 
     * @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 && () > 0) {
            // 遍历所有段落
            for (XWPFParagraph paragraph : paragraphList) {
                List<XWPFRun> runs = ();
                for (XWPFRun run : runs) {
                    String text = (0);
                    // ("text==" + text);
                    if (text != null) {
                        boolean isSetText = false;
                        for (Entry<String, Object> entry : ()) {
                            String key = ();
                            if ((key) != -1) {// 在配置文件中有这个关键字对应的键
                                isSetText = true;
                                Object value = ();
                                if (value instanceof String) {// 文本替换
                                    // ("key==" + key);
                                    if ((key)) {
                                        text = (key, ());
                                    }
                                }
                            }
                        }
                        if (isSetText) {
                            (text, 0);
                        }
                    }
                }
            }
        }
    }
}

替换后的文档

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