都是通过占位符实现的,test方法改成工具类,传入参数就可以直接用了
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
@Test
public void testInsertText() throws Exception {
//获取时间
Calendar cal = Calendar.getInstance();
int day = cal.get(Calendar.DATE);
int month = cal.get(Calendar.MONTH) + 1;
int year = cal.get(Calendar.YEAR);
int dow = cal.get(Calendar.DAY_OF_WEEK);
int dom = cal.get(Calendar.DAY_OF_MONTH);
int doy = cal.get(Calendar.DAY_OF_YEAR);
//要替换的map,key为占位符,value为要被替换的值
Map<String, Object> map = new HashMap<>();
map.put("${company}", "金马投资公司");
map.put("${name}", "陈玉");
map.put("${idNumber}", "642152152542151254");
map.put("${phone}", "13358445878");
map.put("${address}", "北京市顺义区张家巷14号");
map.put("${year}", year);
map.put("${month}", month);
map.put("${day}", day);
map.put("${agent}", "张律师");
//读取文件
OPCPackage opcPackage = POIXMLDocument.openPackage("D:\\期货委托合同.docx");
//加载文档
XWPFDocument doc = new XWPFDocument(opcPackage);
//获取所有段落
List<XWPFParagraph> paragraphList = doc.getParagraphs();
for (XWPFParagraph par : paragraphList) {
//获取段落的文本对象
List<XWPFRun> runs = par.getRuns();
for (XWPFRun run : runs) {
//获取文本的值
String text = run.getText(0);
//遍历map
for (Map.Entry<String, Object> entry : map.entrySet()) {
//获取map的key
String key = entry.getKey();
//判断文本的值和map的key,文本中是否有和key一样的占位符
if (text.indexOf(key) != -1) {
//获取对应key的value
Object value = entry.getValue();
//把文本的内容,key替换为value
text = text.replace(key, value.toString());
//把替换好的文本内容,保存到当前这个文本对象
run.setText(text, 0);
}
}
}
}
File file = new File("D:\\期货委托合同1.docx");
FileOutputStream fileOutputStream = new FileOutputStream(file);
doc.write(fileOutputStream);
}
${name}
没成功是因为我直接在word里面手动输入的,没有被识别为一个文本对象,在其它地方写好${name}
,然后复制到word中
@Test
public void testInserTable1() throws Exception {
//初始化一些数据
//表头
List<String> row1 = new ArrayList<>();
row1.add("时间");
row1.add("数量");
row1.add("类型");
//数据
List<String> row2 = new ArrayList<>();
row2.add("3-15");
row2.add("1");
row2.add("A");
List<String> row3 = new ArrayList<>();
row3.add("3-16");
row3.add("3");
row3.add("B");
//数据List<List<String>>存储,只存数据,不存表头
List<List<String>> rowData = new ArrayList<>();
rowData.add(row2);
rowData.add(row3);
//读取文件
OPCPackage opcPackage = POIXMLDocument.openPackage("D:\\test.docx");
//加载文档
XWPFDocument doc = new XWPFDocument(opcPackage);
//获取所有段落
List<XWPFParagraph> paragraphList = doc.getParagraphs();
//遍历段落
for (int p=0;p<paragraphList.size();p++) {
//获取当前段落的所有文本对象
List<XWPFRun> runs = paragraphList.get(p).getRuns();
//遍历文本对象
for (int r=0;r<runs.size();r++) {
//获取文本对象的值
String text = runs.get(r).getText(0);
if (text!=null){
//判断有没有和占位符相同的,如果有
if(text.indexOf("${table1}")>=0){
//获取光标
XmlCursor cursor = paragraphList.get(p).getCTP().newCursor();
//插入新表格
XWPFTable newTable = doc.insertNewTbl(cursor);
//设置格式
CTTblPr tblPr = newTable.getCTTbl().getTblPr();
tblPr.getTblW().setType(STTblWidth.DXA);
tblPr.getTblW().setW(new BigInteger("10000"));
//创建好的表格默认有一个单元格,直接赋值
newTable.getRow(0).getCell(0).setText(row1.get(0));
//设置第一行剩下的值
for (int i=1;i<row1.size();i++){
newTable.getRow(0).createCell().setText(row1.get(i));
}
//创建row,rowData.size()判断有几行
for (int i=0;i<rowData.size();i++){
//创建row
XWPFTableRow row = newTable.createRow();
//拿到第一行数据,判断有几列,然后逐列插入单元格的值
for (int j=0;j<rowData.get(0).size();j++){
row.getCell(j).setText(rowData.get(i).get(j));
}
}
//删除旧的文本对象,就是删除占位符
paragraphList.get(p).removeRun(0);
}
}
}
}
doc.write(new FileOutputStream("D:\\test1.docx"));
}
@Test
public void insertImage() throws Exception {
//读取文件
OPCPackage opcPackage = POIXMLDocument.openPackage("D:\\test.docx");
//加载文档
XWPFDocument doc = new XWPFDocument(opcPackage);
//获取所有段落
List<XWPFParagraph> paragraphList = doc.getParagraphs();
//遍历段落
for (int p = 0; p < paragraphList.size(); p++) {
//获取所有文本对象
List<XWPFRun> runs = paragraphList.get(p).getRuns();
//遍历所有文本对象
for (int r = 0; r < runs.size(); r++) {
String text = runs.get(r).getText(0);
if (text != null) {
//判断文本对象是否包含图片占位符
if (text.indexOf("${pic1}") >= 0) {
//换行
runs.get(r).addBreak();
String picPath="D:\\pic.png";
runs.get(r).addPicture(new FileInputStream(picPath),Document.PICTURE_TYPE_PNG,picPath, Units.toEMU(450),Units.toEMU(300));
runs.get(r).addBreak(BreakType.TEXT_WRAPPING);
//删除旧的文本对象,就是删除占位符
//paragraphList.get(p).removeRun(0);
//插入图片后,图片和占位符变成一个文本对象了,removeRun连图片一起删了,使用setText
runs.get(r).setText("",0);
}
}
}
}
doc.write(new FileOutputStream("D:\\test1.docx"));
}
使用${name}
占位替换文字,解析发现被分割成了如下
,导致无法替换,解决方法:在其它地方写好${name}
,然后复制到word中,再次查看
需要全代码示例和模板的私聊
原网址: 访问
创建于: 2023-05-08 17:34:29
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
最新评论