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"));
}
}
相关推荐
搜索文档中是否包含指定词汇,批量替换 暂只支持docx文本替换,若文档中包含表格图片等信息会自动跳过 添加支持表格功能,并可读取csv文件形成关键字
java 代码替换docx文档中的指定文字(文章主题,时间等),生成新的docx文档,再把文档转换成pdf。目的是在pdf中签名使用。不好意思需要点分。亲测可以用(本人不喜骗分)
linux下perl,sed,shell批量替换文件内容.docx
可以批量替换指定的字符串、文字、数字、英文等文本信息的工具,支持多目录同时替换,同时支持大部分文本类型...2023年5月10日 更新v1.1.0版本,修复xls、xlsx、doc、docx兼容性问题,支持这四种文件的多形式内容替换。
有些时候需要替换zip内的文件。 网上的办法大多是——先解压,然后对解压目录替换文件,最后再重新压缩。该办法需要比较繁琐,且需要一个临时目录。 于是想找无需解压的方案。 后来找到利用 ZipInputStream、...
linux下批量替换文件内容的方法.docx
android使用Apache POI 3.10操作docx替换指定标识符${...}内容并替换图片,解决POI 3.10本身替换后图片无法显示的问题 有问题及时留言,看到会及时回复
linux下批量替换文件中的内容.docx
涉及知识点:word转xml、xml转字符串、doc转docx 此处主要试讲word文件转换,之前的替换只能替换正文,此处可进行全部替换,像脚注等,都可进行
一次更改多个窗体域内容及属性 ,模板生成docx文件 适用网页按模版生成doc文件,网页合同生成,等等。
linux从指定ID批量替换sql文件中记录的方法.docx
使用poi将word读取后替换指定内容后再次生成新word,本人经过测试,拿来即用!
以上是开头,安装完后需要导入转载的代码读取所有docx文件中的内容发现没有读取到表格数据: from docx import Document def readDocx(docName): fullText = [] doc = docx.Document(docName) paras = doc....
基本操作
java语言使用POI实现对Word(.docx)文件中文字的替换
一些常用快捷键: ctrl + 鼠标左键 跳转到相应的类 ctrl + Alt +鼠标左键 ...ctrl+shift+R 查找并替换整个项目下文件的内容(谨慎使用) sout + 回车 快速输出System.out.println(); main + 回车 快速输出 main方法
Mac系统文件图标制作以及替换教程.docx
NULL 博文链接:https://chong0660.iteye.com/blog/1923735
检查与本文件同目录下的document.docx文件中是否含有同目录下的‘中国地名.csv’中的地名信息,如果存在,则替换为默认标注格式,并输出到同路径下的document(after).docx 由于本函数同路径下的‘中国地名.csv’文件...
docx4j支持操作后缀.docx得word文档,替换书签,获取文档内容,稳定资源