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%)。