POI对Word docx文件进行替换数据后字体样式改变问题记录

最近新增一个需求,需要对word模板内容进行替换,一开始用的是word03版的doc,替换起来比较简单,主要是range对像替换非常方便,而且可以保留替换前的字体样式,但是word里包含了图片,需要同时保存一张png图片,对于jpg的图片是可以的,但是png的显示不出来,改为操作2007的文档,07版的没有了Range,使用XWPFParagraph和XWPFRun来操作。XWPFParagraph表示段落,有的word里有表格内容,需要使用XWPFTable来处理,与段落区分开来处理。

接下来就是创建了一个word模板,然后根据这个模板循环写入数据,这里就会涉及到占位符的替换操作,替换的基本思想就是:

1、调用XWPFParagraph.removeRun删除原有数据

2、使用XWPFParagraph.insertNewRun插入数据遇到的问题是替换后的文字并没有按照word模板中设计的文字样式来输出,导致产生这个问题的原因在于XWPFRun是有格式的,我们删除了XWPFRun,但是没有按照删除钱的XWPFRun的样式设置XWPFRun,这样就会导致输出到word中出现了样式问题,由于仅仅是文字替换,这里的样式就涉及到字体大小以及字体集,通过下面的代码就可以实现:

XWPFRun newRun = para.insertNewRun(i);
newRun.setFontFamily(fontFamily);  //删除的XWPFRun 对应的字体集,比如宋体、仿宋等
newRun.setFontSize(fontSize);       //删除的XWPFRun 对应的字体大小
newRun.setText(runText);

上面是参考了一个博主的记录,但是实际没有替换成功。

最后解决办法:

//直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun,把文本附加在当前文本后面,
//所以我们不能直接设值,需要先删除当前run,然后再自己手动插入一个新的run。
//para.insertNewRun(0).setText(runText);//新增的没有样式
XWPFRun run = para.createRun();
run.setText(runText,0);
run.setFontSize(fontSize);
run.setUnderline(underlinePatterns);
run.setFontFamily("仿宋");//字体
run.setFontSize(16);//字体大小

最后附上已经测试好的工具类,方便大家使用

https://blog.csdn.net/qmwxw/article/details/105195570

你可能感兴趣的:(经验技巧记录,poi)