您的位置:首页 > 编程语言 > Java开发

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

2016-09-01 17:36 543 查看
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>
<
4000
span class="hljs-tag"><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%)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java docx poi 文档