注意事项

word需.docx格式,.doc格式不适用此方案。

书签

书签是word里的一种标记元素,poi能很好的读出标签并进行文字替换、图片替换等。此方案利用书签进行操作,同时也更推荐用书签进行word操作,而不是使用${name}等语法进行替换。

准备工作

书签概念

书签只有一种,但书签可以指定空白区域,也可以指定一段文字,同样可以指定图片等,书签用于标记位置。

差别为,如书签未选择文字,则向书签输入文字时,文字会插入到光标位置。如书签选择了文字,则向书签输入文字时,文字会替换光标所选择的文字。(注意:书签不要放在空行,即如果想在文档末尾追加数据,请写打一个空格,再用书签标记该空格)。

插入书签

点击菜单栏->插入->书签->输入书签名->添加即可。此office版本为2019,其他版本请自行研究如何插入书签。插入书签后保存文件即可。

代码

maven依赖
     <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>4.0.0</version></dependency>
书签替换文字
public static void refreshBooks(XWPFDocument doc, Map<String, String> dataMap) {List<XWPFParagraph> paragraphs = doc.getParagraphs();for (XWPFParagraph xwpfParagraph : paragraphs) {CTP ctp = xwpfParagraph.getCTP();for (int dwI = 0; dwI < ctp.sizeOfBookmarkStartArray(); dwI++) {CTBookmark bookmark = ctp.getBookmarkStartArray(dwI);String data = dataMap.get(bookmark.getName());if (data != null) {XWPFRun run = xwpfParagraph.createRun();run.setText(data);Node firstNode = bookmark.getDomNode();Node nextNode = firstNode.getNextSibling();while (nextNode != null) {String nodeName = nextNode.getNodeName();if (nodeName.equals(BOOKMARK_END_TAG)) {break;}Node delNode = nextNode;nextNode = nextNode.getNextSibling();ctp.getDomNode().removeChild(delNode);}if (nextNode == null) {ctp.getDomNode().insertBefore(run.getCTR().getDomNode(), firstNode);} else {ctp.getDomNode().insertBefore(run.getCTR().getDomNode(), nextNode);}}}}}
演示代码
public static void main(String[] args) {try {FileInputStream is = new FileInputStream("e:/test.docx");XWPFDocument doc = new XWPFDocument(is);Map<String,String> dataMap = new HashMap<>();dataMap.put("name","大白");DocUtil.refreshBooks(doc,dataMap);doc.write(new FileOutputStream("e:/test01.docx"));}catch (Exception e){e.printStackTrace();}}
书签替换图片

替换图片和替换文字原理一致,均是搜索到书签,对书签进行操作。

  public static void refreshBooks(XWPFDocument doc, Map<String, InputStream> dataMap) throws IOException, InvalidFormatException {List<XWPFParagraph> paragraphs = doc.getParagraphs();for (XWPFParagraph xwpfParagraph : paragraphs) {CTP ctp = xwpfParagraph.getCTP();for (int dwI = 0; dwI < ctp.sizeOfBookmarkStartArray(); dwI++) {CTBookmark bookmark = ctp.getBookmarkStartArray(dwI);InputStream picIs = dataMap.get(bookmark.getName());if(picIs != null){XWPFRun run = xwpfParagraph.createRun();//bus.png为鼠标在word里选择图片时,图片显示的名字,400,400则为像素单元,根据实际需要的大小进行调整即可。run.addPicture(picIs,XWPFDocument.PICTURE_TYPE_PNG,"bus.png,", Units.toEMU(400), Units.toEMU(400));}}}}
演示代码
public static void main(String[] args) {try {FileInputStream is = new FileInputStream("e:/test.docx");XWPFDocument doc = new XWPFDocument(is);Map<String,InputStream> dataMap = new HashMap<>();dataMap.put("name",new FileInputStream("e:/test.png"));DocUtil.refreshBooks(doc,dataMap);doc.write(new FileOutputStream("e:/test01.docx"));}catch (Exception e){e.printStackTrace();}}

友情提示:图片最好使用替换模式,即原先的在原先的图片上设置书签,而不是在空白处设置书签,这样可以很好的保证图片替换后的显示效果。

Java POI WORD动态插入/替换文字、插入/替换图片相关推荐

  1. Java Poi Word 添加页眉文字和图片

    代码 public static void main( String[] args ) throws Exception {FileInputStream in = new FileInputStre ...

  2. Java Poi word 插入图片并添加边框

    Java Poi word 插入图片并添加边框 //得到Picture的Base64编码 Base64Picture p1; //打开Word文件 Resource resource = new Cl ...

  3. java poi word导出

    java poi word导出 (含有文字,图像) 导出word效果如下: 思路:建立预期导出word效果,设置为模板,然后填充对应信息,注意,加粗,居中等一些图片,文字格式预先设置好.然后进行文字或 ...

  4. Java poi word模板填充数据、复制行删除行

    Java poi word模板填充数据 1.明细表格式 ${list_xxxxx} 普通格式 ${xxxxxx} 2.replaceInTable方法中 table.removeRow(2); 第三行 ...

  5. JAVA POI Word转PDF convert方法 NullPointException

    JAVA POI Word转PDF convert方法 NullPointException 如果操作过通过POI操作过Word,请保证创建run之后run的值不为null,为null将在转换时报错. ...

  6. java操作word文档(文字,图片,表格添加以及替换操作)

    注:本文由于个人工作需要,有对多个他人博文进行借鉴,但是多数博文都只是讲到了小部分,例如图片/表格的操作,都只有根据书签进行替换,比较片面,本人有总结到根据文字进行图片/表格的替换,希望可以帮到更多有 ...

  7. java 实现word转pdf,并且实现内容替换,乱码处理,去水印

    1.引入依赖 aspose-words的包需要从官网下载 <dependency><groupId>fakepath</groupId><artifactId ...

  8. Java 获取Word批注所标记的文本和图片

    [环境配置] 本文将通过Java程序代码来展示如何来获取Word批注所标注的文本和图片.这里使用的Word Jar包工具是Free Spire.Doc for Java,在pom.xml中按如下步骤配 ...

  9. Java实现给PDF文件加文字水印和图片水印(可以自定义水印格式)

    使用Java代码给PDF文件加文字水印 直接上代码运行即可 依赖 有的可能用不上我直接复制全部了 <dependencies><!--word文件转PDF以及水印-->< ...

最新文章

  1. NET基础(3):is 和 as 操作符
  2. Java的类加载机制
  3. 终于!这个强大的「开源图像识别系统」上线了!
  4. python文件的编译
  5. web项目html页面过多,详解webpack4多入口、多页面项目构建案例
  6. Python实训day13am【Python网络爬虫综合大作业PPT】
  7. java常用23,JAVA基础(23)---数组的常用操作
  8. Jeewx-Api 1.3.2 版本发布,微信开发SDK
  9. Android OpenGLES2.0(十四)——Obj格式3D模型加载
  10. KDD Cup 2020多模态召回比赛亚军方案与搜索推荐业务的业务应用
  11. servlet-02-HTTP协议
  12. 【Solr原理】Leader Shard选举
  13. C# 通过DirectInput 实现手柄操控
  14. MATLABnbsp;std()nbsp;标准偏差函数
  15. SEO中的关键词密度该如何布局
  16. TypeError: Unicode-objects must be encoded before hashing
  17. 一位全加器 VHDL设计与实现
  18. 转:医院网络营销存在的弊端
  19. 广州市科学技术局关于开展2022年广州市科技计划项目验收工作的通知
  20. KBPC5010-ASEMI大功率整流桥、50A整流桥

热门文章

  1. 数据清洗之“堆叠”—多列数据合并处理的神器
  2. 转载 -- 关于音乐合成与TD相关联的知识点
  3. redis和数据库的一致性问题的解决方案
  4. Java反射机制与注解
  5. Python常见数据类型和方法
  6. Android 原生应用使用@hide api
  7. 基金取名门道之后的准投
  8. 最新未来码支付1.2开源版 免签约即时到账支付源码 不用挂监听!!
  9. base北京,智慧校园领域,招聘 运维工程师岗位
  10. Json转换利器Gson之实例四-Map处理(下)