需求描述

如下图,我需要在word里根据一个图片的名字,将名字替换成该图片(公章)

思路:

用POI遍历每一个表格里的每一行的每一个单元格,如果遇到我自己定义的"&章",则获取后面的图片的名字,然后利用POI的XWPFRun.addPicture(url,像素…)方法将图片添加到word里,然后将原有的文字清除掉。
注意:图片要放在表格的单元格里,最后单元格里的文本会被清除掉,只留下图片

简单生成图片和文字的代码:

注: 我的代码比较复杂,因为需求很复杂,如果你只需要简单生成下图片,可以参考这个
参考:https://stackoverflow.com/questions/26764889/how-to-insert-a-image-in-word-document-with-apache-poi

XWPFDocument doc = new XWPFDocument();XWPFParagraph title = doc.createParagraph();    XWPFRun run = title.createRun();run.setText("Fig.1 A Natural Scene");run.setBold(true);title.setAlignment(ParagraphAlignment.CENTER);String imgFile = "encabezado.jpg"FileInputStream is = new FileInputStream(imgFile);run.addBreak();run.addPicture(is, XWPFDocument.PICTURE_TYPE_JPEG, imgFile, Units.toEMU(200), Units.toEMU(200)); // 200x200 pixelsis.close();FileOutputStream fos = new FileOutputStream("test4.docx");doc.write(fos);fos.close();

详细代码(原创):

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;public class blog {public static void main(String[] args) throws Exception {  //测试添加图片String sourceFile="D:/测试模板.docx";String targetFile="D:/test.docx";addStampImage(sourceFile, targetFile);}public static void addStampImage(String sourceFile, String targetFile) {XWPFDocument doc;try {doc = new XWPFDocument(new FileInputStream(sourceFile));for(XWPFTable table : doc.getTables()) {for(XWPFTableRow row : table.getRows()) {for(XWPFTableCell cell : row.getTableCells()) {//遍历每一个单元格if(cell.getText().contains("&章")) {//如果遇到"&章"则进行替换try {insertCellStamp(cell);//给带有要盖章字样的单元格 加上章的图片} catch (Exception e) {e.printStackTrace();}}}}}FileOutputStream fos = new FileOutputStream(targetFile);doc.write(fos);fos.close();     doc.write(new FileOutputStream(targetFile));} catch (Exception e) {e.printStackTrace();}}private static void insertCellStamp(XWPFTableCell cell) throws InvalidFormatException, IOException {//给带有要盖章字样的单元格 加上章的图片List<String> stamps = new ArrayList<>();//存放要加入的图片int stampOrder = 0;//图片的序号,从0开始//获取需要的图片,for(XWPFParagraph para :cell.getParagraphs()) {String paraText = para.getText();//从段落中获取要盖的章的名称
//          System.out.println("para.getText():" + paraText);if(paraText != null) {String[] split = para.getText().split(" ");for(String s : split) {s = s.trim();if(!s.isEmpty() ) {stamps.add(s.replace("&章", ""));//如:&章公章01.png,去掉标识符&章,只留下章的名字}}}}String basedir = "E:";for(XWPFParagraph para :cell.getParagraphs()) {for (XWPFRun run : para.getRuns()) {run.setText("", 0);//清空所有文字}
//          for (int i =para.getRuns().size()-1 ; i>=0; i--) {
//              XWPFRun run = para.getRuns().get(i);
//              System.out.println("清空所有文字后:run.getText(0): " + run.getText(0));
//          }//插入图片for(int i = 0; i<stamps.size() && i<para.getRuns().size(); i++) {try {XWPFRun run = para.getRuns().get(i);String imgFile = basedir + "/公章管理/" + stamps.get(stampOrder++);System.out.println("插入盖章图片:" + imgFile);FileInputStream is = new FileInputStream(imgFile);run.addPicture(is, XWPFDocument.PICTURE_TYPE_JPEG, imgFile, Units.toEMU(100), Units.toEMU(100)); // 100x100 pixelsis.close();run.setText("  ",0);} catch (Exception e) {System.out.println("Error: ========  插入单个公章图片时出错了:可能是图片路径不存在。不影响主流程");e.printStackTrace();}}}}
}

最后样子:涉及保密就加了马赛克~

备注:有位朋友说他运行到doc = new XWPFDocument(new FileInputStream(sourceFile));这行时就直接报错:No valid entries or contents found, this is not a valid OOXML (Office Open XML) file报这个错,我和他一起尝试找了下原因,最后也是没找到原因不了了之了。
这段代码已经上线使用了,我这边需求比较复杂,坑也很多,所以建议大家如果需求简单的话就直接参考stackoverflow的代码。

Java Poi 根据文字内容 插入 word 图片相关推荐

  1. java poi 读取 word图片_Java Poi 根据文字内容 插入 word 图片-Go语言中文社区

    需求描述 如下图,我需要在word里根据一个图片的名字,将名字替换成该图片(公章) 思路: 用POI遍历每一个表格里的每一行的每一个单元格,如果遇到我自己定义的"&章",则 ...

  2. java poi doc转docx_Java 插入Word分页符、分节符

    在Word文档中,插入分页符或分节符是一种规范文档内容布局的有效方式.特别是对于一些文档格式要求严格,排版布局严谨的文档,如论文.书籍.期刊等等,通过插入的分页符或分节符可以将每部分内容加以合理区分, ...

  3. Java POI WORD动态插入/替换文字、插入/替换图片

    注意事项 word需.docx格式,.doc格式不适用此方案. 书签 书签是word里的一种标记元素,poi能很好的读出标签并进行文字替换.图片替换等.此方案利用书签进行操作,同时也更推荐用书签进行w ...

  4. java POI在excel中插入等比例缩放的图片

    这个缩放的比例不是很准确,但还凑合能用,目前本人找不到其它方法,就先用这个. 先看一个关键的API方法:void org.apache.poi.ss.usermodel.Picture.resize( ...

  5. java poi 在excel中插入图片

    java web中导出excel数据是常见的功能,最近遇到一个需求是在excel中插入图片.处理excel及其他微软办公系列软件常用的就是apache poi,它也是支持图片插入的.插入图片最主要的用 ...

  6. npoi插入word图片(终于解决插入图片后打不开word)

    npoi向word插入图片总结 npoi插入word,一把辛酸一把泪呀,开始总是不能插入图片,一插入就word就打不开了,网上百度,好多人都有这个问题,后来看到一篇poi博客poi博客介绍到这个是一个 ...

  7. Java 读取excel文件内容插入到数据库

    Java读写Excel的包是Apache POI. JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel ...

  8. 一、后端:针对用JAVA POI解决已知路径WORD文件增加自定义页眉,灵活设置页眉字体部分样式@2019

    一.获取添加页眉doc文件 我的项目文件路径: String reportSavePath= "****************"; DOCX文件一: changer.setAcc ...

  9. Java识别PDF文字内容的方法

    方法一:PDFBox (一个BSD许可下的源码开放项目)是一个为开发人员读取和创建PDF文档而准备的纯Java类库.它提供如下特性: 提取文本,包括Unicode字符.和Jakarta Lucene等 ...

  10. Java Poi 向excel中插入图片

    博客 package com.unicom.yangjiabin.utils;import java.awt.image.BufferedImage; import java.io.ByteArray ...

最新文章

  1. 王炸!无需额外数据,Transformers超越CNN问鼎ImageNet
  2. ida 中segment中的extern是什么
  3. 解决maven项目jdbc报错:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
  4. 总结:ADO.NET在开发中的部分使用方法和技巧
  5. 鲁大师2014 v3.75.14.1058 官方版
  6. 绿色数据中心基础设施建维服务认证
  7. java中long=后面为什么还要加个L
  8. CSS | width、height中auto与100%与固定值有什么不同
  9. 华为智慧屏和鸿蒙系统对比,华为s55和v55i对比_华为智慧屏s55和v55i哪个好
  10. 人工智能-阿尔法狗背后的简单原理:贝叶斯公式
  11. 女神节-女性程序员有哪些好的职业发展路线
  12. 电子信息科学与技术与计算机专业相近吗,电子信息科学与技术专业简介
  13. 第二章 定义和构建索引(二)
  14. win10如何设置或取消屏保密码
  15. 笨方法学Python 练习16
  16. VS2017创建MFC ActiveX工程制作IE OCX插件
  17. Html5 JumpStart学习笔记3:Advanced Layout and Animation
  18. [Google] 看雪论坛: 安卓碎片化的情况
  19. 做一个合格的前端,gulp资源大集合
  20. 15. python数据类型转换

热门文章

  1. c++ Win x64 注册表操作
  2. c语言中数组strcat什么意思,c语言中的strcat是什么意思?
  3. activiti踩坑2-camunda-modeler设计器与activiti7不兼容
  4. 怎样理解封装,继承,多态!三者的区别?
  5. dismiss和remove_你真的了解iOS中控制器的present和dismiss吗?
  6. 解决前端做excel下载的文件打不开
  7. 【转】中专生的C++之路!
  8. P02014132 魏思奇 对信息论几个问题的一些看法
  9. ubuntu19.04下VirtualBox与虚拟机win7共享文件夹
  10. sleep、yield、join方法简介与用法 sleep与wait区别 多线程中篇(十五)