需求描述

如下图,我需要在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 pixels

is.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 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

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 pixels

is.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图片_Java Poi 根据文字内容 插入 word 图片-Go语言中文社区相关推荐

  1. java web添加背景图片_java web项目中如何插入背景图片

    对于java可视化界面插入背景图片这个倒是轻而易举,只需要background-inage:url(图片路径就行),而对于与web项目中,我开始时也是采用这种方法,但是不尽然,代码如下: 效果如下: ...

  2. java mysql查询界面_Java GUI小程序 实现数据库查询界面-Go语言中文社区

    源代码如下:package 数据库图形化界面3; import java.awt.*; import javax.swing.*; import java.awt.event.*; public cl ...

  3. java设置窗体焦点_JAVA之关于swing窗体设置默认焦点-Go语言中文社区

    画了个简单的dialog, 但是焦点总是停在User Name的text field上. 想把焦点放在OK button上, 按回车的时候就能执行Ok button的功能. 加了dialog.getR ...

  4. java蓝桥杯dfs_第七届 蓝桥杯决赛 Java B组 打靶 解题报告(DFS,回溯,全排列)-Go语言中文社区...

    题目: 打靶 小明参加X星球的打靶比赛. 比赛使用电子感应计分系统.其中有一局,小明得了96分. 这局小明共打了6发子弹,没有脱靶. 但望远镜看过去,只有3个弹孔. 显然,有些子弹准确地穿过了前边的弹 ...

  5. java freemarker 图片_java通过freemarker导出包含富文本图片的word文档

    废话不多说,进入正题! 本文重点在于:对富文本图片的导出(基础的freemarker+word模板导出这里不做详细解说哈) (ps:大神的东西太深奥~~懵逼了 一周才搞定,为了方便后来在更加简单,清晰 ...

  6. 【Latex】【插入图片】如何在latex中插入并列图片

    [Latex][插入图片]如何在latex中插入并列图片 实验分析部分需要将多个图片并列展示,今天看了网友的一些提示,写出了两种并列展示图片的方法: 每个图片都有一个标题 多个图片共用一个标题,每个图 ...

  7. 显示自定义表情图片(replace将文字表情替换为图片)

    显示自定义表情图片(replace将文字表情替换为图片) <div id="moment"></div>var face = { '[哎呀]': '< ...

  8. html 文字在背景图片上,如何让文字作为CSS背景图片显示

    在实际开发中,有时候希望文字内容可以作为背景图片显示,一方面是希望利用背景图片的优势,例如可以平铺,另外一方面是常见的替换元素不能使用伪元素创建文字,此时只能寄希望与背景图. 关键如何把文字变成背景图 ...

  9. ​图片上怎么添加文字内容?这两个方法请收好

    相信很多小伙伴们在工作中经常需要处理图片吧,有时候需要在图片上添加注释等文字,也就是编辑图片上的文字.那么小伙伴们平时都是使用什么方法来处理呢?最近就有一个小伙伴咨询图片上怎么添加文字内容,其实很简单 ...

最新文章

  1. 系统部署文档_惊喜!Alibaba架构师终于发布“微服务架构与实践”文档
  2. WEB Service 下实现大数据量的传输
  3. 蒙特卡罗模拟法 —— python
  4. 55种数据可视化开源工具_6种用于撰写书籍的开源工具
  5. 关于 MySQL 8.0 新特性“隐藏索引”的一点思考
  6. 安卓运行时监听配置更改:sim卡、本地语言、键盘显示或隐藏、字体大小、UI模式、屏幕方向、屏幕布局(另一个屏幕)、可用屏幕大小(横纵向)、无屏幕大小(外接屏幕)。
  7. python aiml_Python:用aiml构建英语聊天机器人
  8. 从定性遥感到定量遥感——大数据时代的空间数据科学
  9. 在LR字符串中交换相邻字符
  10. 解决safari里面淘宝京东页面无法打开以及打开后乱码的问题!
  11. 神马不是浮云,有未来就能改变世界
  12. 小澳的葫芦(最短路)
  13. ShowType=0,● 交换机命令show interfaces type 0/port_# switchport|trunk用于显示中继连接的配置情况,下面 - 赏学吧...
  14. 二叉平衡树的基本操作(完整代码)
  15. 插入排序、希尔排序(Shell)、选择排序、堆排序、冒泡排序、快速排序、归并排序和基数排序(桶排)的 时间复杂度和空间复杂度
  16. 在线图片处理工具大全!ps可以下岗了。
  17. 现代人的困扰,“高刺激”的诱惑
  18. Java虚拟机jvm和Java内存模型jmm浅尝
  19. 微信小程序实现首行缩进、取消首行缩进
  20. Nginx对代理HTTP资源的限制访问

热门文章

  1. 如何写好状态机?跑马灯/流水灯Verilog HDL实现
  2. 世界历史50大著名统治者
  3. 水货iPad 2价格骤降数千元
  4. 广大程序员不要做外包
  5. 用千千静听练听力的小工具:Mp3字慕助手(带下载慢速Voa)
  6. MEM/MBA数学基础(07)几何
  7. 【微信小程序】图片上传组件“mp-uploader“(weui)
  8. 想清楚干点什么,比怎么干更重要--Leo读 不是孙振耀写的职场感言 2
  9. display: flex属性介绍
  10. java实现给MultipartFile添加水印