poi针对word模板内容替换
最近多了⼀个需求,需要对word模板内容进⾏替换,⼀开始⽤的是word03版的,替换起来⽐较简单,主要是range对像替换⾮常⽅便,⽽且可以保留替换前的字体样式。
1 InputStream is = new FileInputStream(srcFath);
2 OutputStream os = new FileOutputStream(tempFile);
3 XWPFDocument doc = new XWPFDocument(is);
4 Range range = Range();
5 placeText("${name}","aaa");
6 doc.write(os);
7 is.close();
8 os.flush();
9 os.close();
最后看到word⾥包含了图⽚,需要同时保存⼀张png图⽚,对于jpg的图⽚是可以的,但是png的显⽰不出来,改为操作2007的⽂档,07版的没有了Range,使⽤XWPFParagraph和XWPFRun来操作。XWPFParagraph表⽰段落,有的word⾥有表格内容,需要使⽤XWPFTable 来处理,与段落区分开来处理。
private void replaceText(XWPFDocument doc, Map<String, Object> params) {
Iterator<XWPFParagraph> iterator = ParagraphsIterator();
XWPFParagraph para;
while (iterator.hasNext()) {
para = ();
}
}
private void replaceText(XWPFParagraph para, Map<String, Object> params) {
List<XWPFRun> runs;
Matcher matcher;
if (ParagraphText()).find()) {
runs = Runs();
for (int i=0; i<runs.size(); i++) {
XWPFRun run = (i);
String runText = String();
matcher = matcher(runText);
if (matcher.find()) {
while ((matcher = matcher(runText)).find()) {
runText = placeFirst(String.(up(1))));
}
//重新插⼊run⾥内容格式可能与原来模板的格式不⼀致
para.insertNewRun(i).setText(runText);
}
}
}
}
private Matcher matcher(String str) {
Pattern pattern = Patternpile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
return matcher;
}
再次处理替换内容的格式问题,通过⼀个临时⽂件先保存替换模板变量后的⽂件,在与之前模板⽂档⼀起通过正则匹配出变量位置,由于替换变量时先删除再插⼊,所以位置是⼀致的。
private void setStyle(XWPFDocument doc,XWPFDocument tempdoc, Map<String, Object> params) {
Iterator<XWPFParagraph> iterator = ParagraphsIterator();
Iterator<XWPFParagraph> iterator2 = ParagraphsIterator();
XWPFParagraph para ;
XWPFParagraph para2;
while (iterator.hasNext()) {
para = ();
para2 = ();
this.styleInPara(para,para2, params);
}
}
private void setStyle(XWPFParagraph para, XWPFParagraph para2,Map<String, Object> params) {
List<XWPFRun> runs;
List<XWPFRun> runs2;正则匹配一张图片
Matcher matcher;
if (ParagraphText()).find()) {
runs = Runs();
runs2 = Runs();
for (int i=0; i<runs.size(); i++) {
XWPFRun run = (i);
XWPFRun run2 = (i);
String runText = String();
matcher = matcher(runText);
if (matcher.find()) {
//按模板⽂件格式设置格式
}
}
}
}
按照原模板格式设置好替换后格式后显⽰正常。
ps:XWPFRun表⽰有相同属性的⼀段⽂本,所以模板⾥变量内容需要从左到右的顺序写,${userName},如果先写${},再添加内容,会拆分成⼏部分,不能正常使⽤
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论