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);//字体大小

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

JAVA使用POI对Word docx模板文件替换数据工具类_常雪恨的博客-CSDN博客

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值