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"));
}
}