替换效果:


1. 引入maven依赖

   <dependencies><!-- springboot --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>RELEASE</version></dependency><!-- poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.7</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.7</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.7</version></dependency></dependencies>

2. WordUtil.java

package com.java.util;import org.apache.poi.POIXMLDocument;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.*;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;/*** 适用于word 2007* poi 版本 3.7*/
public class WordUtil {/*** 根据指定的参数值、模板,生成 word 文档* @param param 需要替换的变量* @param template 模板*/public static CustomXWPFDocument generateWord(Map<String, Object> param, String template) {CustomXWPFDocument doc = null;try {OPCPackage pack = POIXMLDocument.openPackage(template);doc = new CustomXWPFDocument(pack);if (param != null && param.size() > 0) {//处理段落List<XWPFParagraph> paragraphList = doc.getParagraphs();processParagraphs(paragraphList, param, doc);//处理表格Iterator<XWPFTable> it = doc.getTablesIterator();while (it.hasNext()) {XWPFTable table = it.next();List<XWPFTableRow> rows = table.getRows();for (XWPFTableRow row : rows) {List<XWPFTableCell> cells = row.getTableCells();for (XWPFTableCell cell : cells) {List<XWPFParagraph> paragraphListTable =  cell.getParagraphs();processParagraphs(paragraphListTable, param, doc);}}}}} catch (Exception e) {e.printStackTrace();}return doc;}/*** 处理段落* @param paragraphList*/public static void processParagraphs(List<XWPFParagraph> paragraphList,Map<String, Object> param,CustomXWPFDocument doc){if(paragraphList != null && paragraphList.size() > 0){for(XWPFParagraph paragraph:paragraphList){List<XWPFRun> runs = paragraph.getRuns();for (XWPFRun run : runs) {String text = run.getText(0);if(text != null){boolean isSetText = false;for (Entry<String, Object> entry : param.entrySet()) {String key = entry.getKey();if(text.indexOf(key) != -1){isSetText = true;Object value = entry.getValue();if (value instanceof String) {//文本替换text = text.replace(key, value.toString());} else if (value instanceof Map) {//图片替换text = text.replace(key, "");Map pic = (Map)value;int width = Integer.parseInt(pic.get("width").toString());int height = Integer.parseInt(pic.get("height").toString());int picType = getPictureType(pic.get("type").toString());byte[] byteArray = (byte[]) pic.get("content");ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteArray);try {int ind = doc.addPicture(byteInputStream,picType);doc.createPicture(ind, width , height,paragraph);} catch (Exception e) {e.printStackTrace();}}}}if(isSetText){run.setText(text,0);}}}}}}/*** 根据图片类型,取得对应的图片类型代码* @param picType* @return int*/private static int getPictureType(String picType){int res = CustomXWPFDocument.PICTURE_TYPE_PICT;if(picType != null){if(picType.equalsIgnoreCase("png")){res = CustomXWPFDocument.PICTURE_TYPE_PNG;}else if(picType.equalsIgnoreCase("dib")){res = CustomXWPFDocument.PICTURE_TYPE_DIB;}else if(picType.equalsIgnoreCase("emf")){res = CustomXWPFDocument.PICTURE_TYPE_EMF;}else if(picType.equalsIgnoreCase("jpg") || picType.equalsIgnoreCase("jpeg")){res = CustomXWPFDocument.PICTURE_TYPE_JPEG;}else if(picType.equalsIgnoreCase("wmf")){res = CustomXWPFDocument.PICTURE_TYPE_WMF;}}return res;}/*** 将输入流中的数据写入字节数组* @param in* @return*/public static byte[] inputStream2ByteArray(InputStream in,boolean isClose){byte[] byteArray = null;try {int total = in.available();byteArray = new byte[total];in.read(byteArray);} catch (IOException e) {e.printStackTrace();}finally{if(isClose){try {in.close();} catch (Exception e2) {System.out.println("关闭流失败");}}}return byteArray;}
}

2. CustomXWPFDocument.java

package com.java.util;import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlToken;
import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;import java.io.IOException;
import java.io.InputStream;/*** Created by 周壮*/
public class CustomXWPFDocument extends XWPFDocument {public CustomXWPFDocument(InputStream in) throws IOException {super(in);}public CustomXWPFDocument() {super();}public CustomXWPFDocument(OPCPackage pkg) throws IOException {super(pkg);}/*** @param id* @param width 宽* @param height 高* @param paragraph  段落*/public void createPicture(int id, int width, int height,XWPFParagraph paragraph) {final int EMU = 9525;width *= EMU;height *= EMU;String blipId = getAllPictures().get(id).getPackageRelationship().getId();CTInline inline = paragraph.createRun().getCTR().addNewDrawing().addNewInline();String picXml = ""+ "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">"+ "   <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"+ "      <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"+ "         <pic:nvPicPr>" + "            <pic:cNvPr id=\""+ id+ "\" name=\"Generated\"/>"+ "            <pic:cNvPicPr/>"+ "         </pic:nvPicPr>"+ "         <pic:blipFill>"+ "            <a:blip r:embed=\""+ blipId+ "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"+ "            <a:stretch>"+ "               <a:fillRect/>"+ "            </a:stretch>"+ "         </pic:blipFill>"+ "         <pic:spPr>"+ "            <a:xfrm>"+ "               <a:off x=\"0\" y=\"0\"/>"+ "               <a:ext cx=\""+ width+ "\" cy=\""+ height+ "\"/>"+ "            </a:xfrm>"+ "            <a:prstGeom prst=\"rect\">"+ "               <a:avLst/>"+ "            </a:prstGeom>"+ "         </pic:spPr>"+ "      </pic:pic>"+ "   </a:graphicData>" + "</a:graphic>";inline.addNewGraphic().addNewGraphicData();XmlToken xmlToken = null;try {xmlToken = XmlToken.Factory.parse(picXml);} catch (XmlException xe) {xe.printStackTrace();}inline.set(xmlToken);inline.setDistT(0);inline.setDistB(0);inline.setDistL(0);inline.setDistR(0);CTPositiveSize2D extent = inline.addNewExtent();extent.setCx(width);extent.setCy(height);CTNonVisualDrawingProps docPr = inline.addNewDocPr();docPr.setId(id);docPr.setName("图片" + id);docPr.setDescr("测试");}
}

3. 测试

    public static void main(String[] args) throws Exception{//替换文字Map<String, Object> param = new HashMap<String, Object>();param.put("${word}", "success");//替换图片Map<String,Object> one = new HashMap<String, Object>();one.put("width", 100);one.put("height", 150);one.put("type", "jpg");one.put("content", WordUtil.inputStream2ByteArray(new FileInputStream("c:\\success.jpg"), true));param.put("${img}",one);//输入和输出CustomXWPFDocument doc = WordUtil.generateWord(param, "c:\\input.docx");FileOutputStream fopts = new FileOutputStream("c:\\output.docx");doc.write(fopts);fopts.close();}

java word根据标识符替换图片,文字(亲测)相关推荐

  1. java word转pdf(完美转换,亲测可用)

    word转pdf,完美转换 引入依赖 (maven仓库是没有的,需要在项目中引用) jar包我给大家准备好了 提取码:m5hz 然后在pom里面引入下面这段,依赖我们就搭建好了 <depende ...

  2. python环绕文字_Java 设置 Word 文档中图片文字环绕方式

    Java 设置 Word 文档中图片文字环绕方式 在Word文档中插入图片时,选择合理的图片文字环绕方式可以使图片的展示效果更好,也能使页面的排版更加美观.本文就将介绍如何使用Free Spire.D ...

  3. 百度AI图片识别亲测成功详解

    百度AI图片识别亲测成功详解 1.浏览器输入网址http://ai.baidu.com/或者百度一下搜索'百度ai'点击第一个. 2.点击控制台,有百度账号的直接登录,没有的注册后登录. 3.点击左侧 ...

  4. PDF转word并去除水印以及处理的页数限制【pdf转word可编辑 百分百还原文件 亲测可用】

    提示:操作aspose-pdf-22.10-jdk16.jar 对其重编译修改校验权限 使用javassist 重编译(学习测试使用,aspose所有的包都可以用该教程.亲自测试过的) 文章目录 前言 ...

  5. Java使用PDFBox为PDF填加水印亲测

    Java使用PDFBox为PDF填加水印亲测 1.maven依赖 java代码部分 效果图片 中文 微软雅黑TTF 1.maven依赖 <dependency><groupId> ...

  6. WordPress彻底禁用上传媒体图片自动生成缩略图及多尺寸图片(亲测可用)

    WordPress默认上传图片的时候会自动生成缩略图及多尺寸的图片文件,大部分网站都用不到这些多余的图片,不仅仅占用空间,而且上传的时候还会消耗额外的性能. 下面仅需两段函数代码即可彻底禁用该功能. ...

  7. html转word 图片丢失 java_Java 设置 Word 文档中图片文字环绕方式

    在Word文档中插入图片时,选择合理的图片文字环绕方式可以使图片的展示效果更好,也能使页面的排版更加美观.本文就将介绍如何使用Free Spire.Doc for Java 添加图片到Word文档并设 ...

  8. dom4j将word转pdf详细介绍(亲测可用)

    背景:本文介绍的是已经存在一个word文件,将其转换成pdf文件,利用dom4j将word转换成pdf.跟着我的步骤一步一步,最后一定会成功!! 1.创建项目 2.pom,导包 <depende ...

  9. Microsoft Word 通过通配符替换图片下标文字

    2019独角兽企业重金招聘Python工程师标准>>> 今天在评审文档时,要求统一图片下标文字的格式,现举个例子说明使用通配符对文本进行替换的方法. 我的Windows版本是Win7 ...

最新文章

  1. ASSERT(IsOpen());
  2. 平安城市与智慧城市对接的关键要素
  3. python跨文件复制sheet_Python办公自动化-工作表复制(可跨文件)
  4. 方差分析中的“元”和“因素”是什么?
  5. 前端开发知识点解答-VUE-面试
  6. php怎麼开bcmath_php-如何启用BCMath CentOS 6
  7. 10.2.0.3.0 oracle导出,oracle 数据库从10.2.0.4升级到11.2.0.3
  8. 洛谷 题解 P1757 【通天之分组背包】
  9. gdb调试 -带有命令行参数
  10. 9102,用原生js造一个轮播组件
  11. weblogic部署微服务项目
  12. 从零开始的小白pr学习之旅--day2 数字后端流程(一)
  13. mysql client_multi_statements_MySQL中CLIENT_MULTI_STATEMENTS的用法
  14. 原生js实现拖拽效果,js拖拽原理
  15. vivo Y79的Usb调试模式在哪里,打开vivo Y79Usb调试模式的方法
  16. mysql五日均线_mysql – 如何在SQL中的某个日期范围内执行移动平均线?
  17. linux中nginx启动,重启,关闭命令
  18. 深入认识敏捷开发和面向对象
  19. Linux基础、命令及相关软件安装
  20. 第13期 《由量变到质变的过程》3月刊

热门文章

  1. Google需警惕苹果Apple TV的10大原因
  2. 【优化选址】基于人工蜂群算法求解无线网络传感覆盖优化问题含Matlab源码
  3. SSO(Single Sign On)系列(三)--CAS单点登录
  4. python正则匹配练习
  5. 北京建行个人信贷客户资信调查函.doc
  6. ubuntu20安装gcc_Ubuntu:软件常用安装方法(附WPS安装)
  7. powerquery分组_PowerQuery分组返回所有行之后还原列顺序
  8. 没有shell63号单元_如何在Ansys/lsdyna中给Shell 163 赋值变厚度(注:不是Ansys下的Shell63号单元)...
  9. Oracle11g新特性之Replay a captured workload 捕获工作负载新环境重放负载测试压力
  10. hdoj 4417 Super Mario 【树状数组 + 思维】