2019独角兽企业重金招聘Python工程师标准>>>
先说为什么是docx office2007,因为poi操作2003 doc有局限性,主要是对word中表格的操作几近空白,在报表模板中无法追加行,(详见Table )而2007则很完整。(详见XWPFTable ) 所以只能弃用改2007。
但改用2007版,又发现没有了2003替换文档内容中关键的Range对象,查找后找到部分可用的代码,但只能用于表格内容替换,XWPFTable 相关类。因为替换用到了table中cell单元格的方法来完成替换的。
对于一般内容的替换,查阅国内外大量资料,始终没有找到完整的正确的解决方案。但统一主要用
XWPFParagraph 类完成操作。
直接去查Apache api。发现问题于XWPFParagraph 类本身方法就不足,有get()方法获取值,
却没有set()方法,在也没有range中类似replace()的方法,而且和table中操作类似,需要先remove()原内容,
再setText()添加内容完成替换,原理是set方法是用append的方式追加的,所以必须先删,而删除添加又需要
调用XWPFRun 对象来完成。自己综合上面内容和网上内容终于完成poi docx文档内容替换的操作。测试通过。
注:range对象替换会保存样式,而2007中需要通过操作XWPFRun来传递样式保存。很简单, 这里代码未写出。
珍惜他人劳动果实,转载请注明出处。
code:
------------------------------------------------------------------------------------------------
doc 2003版 替换内容关键代码:
HWPFDocument document = new HWPFDocument(new FileInputStream(srcPath));
Range range = document.getRange();
//读取word文本内容
System.out.println(range.text());
HashMap map=new HashMap();
map.put("${test}","这是标题");
//替换文本内容
for (Map.Entry entry:map.entrySet()) {
range.replaceText(entry.getKey(),entry.getValue());
}
------------------------------------------------------------------------------------------------
docx 2007版 替换内容关键代码:
HashMap content=new HashMap();
HashMap label=new HashMap();
label.put("${title}","这是标题");
content.put("${name}","姓名");
content.put("${tel}", "123456789");
String srcPath = "c:\\1.docx";
String destPath = "c:\\2.doc";
try {
XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(srcPath));
List list=document.getParagraphs() ;
//基本内容替换
for (int i = 0; i < list.size(); i++) {
for(Entry e : label.entrySet()){
if (list.get(i).getParagraphText().equals(e.getKey())){
List runs=list.get(i).getRuns();
//删除原来内容
for (int j = runs.size()-1; j >=0; j--) {
list.get(i).removeRun(j);
}
//创建新内容
XWPFRun paragraphRun = list.get(i).createRun();
paragraphRun.setText(e.getValue());
System.out.println(list.get(i).getParagraphText());
}
}
}
Iterator it = document.getTablesIterator();
//表格内容替换添加
while(it.hasNext()){
XWPFTable table = (XWPFTable)it.next();
int rcount = table.getNumberOfRows();
for(int i =0 ;i < rcount;i++){
XWPFTableRow row = table.getRow(i);
List cells = row.getTableCells();
for (XWPFTableCell cell : cells){
for(Entry e : content.entrySet()){
if (cell.getText().equals(e.getKey())){
//删除原来内容
cell.removeParagraph(0);
//写入新内容
cell.setText(e.getValue());
}
}
}
}
}
FileOutputStream outStream = null;
outStream = new FileOutputStream(destPath);
document.write(outStream);
outStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
------------------------------------------------------------------------------------------------
截图:1.docx