1.本来有其他方法可以实现的,但是由于jar包一直有问题所以换了种,要是还有其他的更好的方法,希望可以讨论

2.废话不说直接上代码;

3.我自己加了个生成图片的方法,也可以不需要直接用已经存在的图片替换即可  ,注意jar包的引入,import的时候看清楚是什么包!!!先给出MAVEN中pom.xml需要导入的包

org.apache.poi

poi-excelant

3.12

org.apache.poi

poi-scratchpad

3.12

org.apache.poi

poi-ooxml

3.8

org.apache.poi

poi-ooxml-schemas

3.8

org.jfree

jfreechart

1.0.19

org.docx4j

docx4j

3.3.1

package com.example.demo;

import java.awt.*;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.text.DecimalFormat;

import java.text.NumberFormat;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import org.apache.commons.io.IOUtils;

import org.apache.poi.POIXMLDocument;

import org.docx4j.wml.Document;

import org.apache.poi.xwpf.usermodel.XWPFDocument;

import org.apache.poi.xwpf.usermodel.XWPFParagraph;

import org.apache.poi.xwpf.usermodel.XWPFRun;

import org.assertj.core.util.Maps;

import org.docx4j.TraversalUtil;

import org.docx4j.dml.wordprocessingDrawing.Inline;

import org.docx4j.finders.RangeFinder;

import org.docx4j.openpackaging.packages.WordprocessingMLPackage;

import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage;

import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;

import org.docx4j.wml.*;

import org.jfree.chart.ChartFactory;

import org.jfree.chart.ChartUtilities;

import org.jfree.chart.JFreeChart;

import org.jfree.chart.labels.StandardPieSectionLabelGenerator;

import org.jfree.chart.plot.PiePlot;

import org.jfree.data.general.DefaultPieDataset;

public class ReplaceWordUtils {

//模板路径

public static final String DOC_PATH = "D:\\report\\test.docx";

//图片路径

public static final String IMAGE_PATH = "D:\\report\\test.png";

//替换文字图片后的路径

public static final String DOC_PATH2 = "D:\\report\\test1.docx";

//word文档中替换文字方法

public static void replaceContent(Map map,String wordPath){

XWPFDocument document = null;

try

{

document = new XWPFDocument(POIXMLDocument.openPackage(wordPath));

Iterator itPara = document.getParagraphsIterator();

while (itPara.hasNext()) {

XWPFParagraph paragraph = (XWPFParagraph) itPara.next();

List runs = paragraph.getRuns();

for (int i = 0; i < runs.size(); i++) {

String oneparaString = runs.get(i).getText(runs.get(i).getTextPosition());

for (Map.Entry entry : map.entrySet()) {

if (oneparaString.equals(entry.getKey())) {

oneparaString = oneparaString.replace(entry.getKey(), entry.getValue());

}

}

runs.get(i).setText(oneparaString, 0);

}

}

FileOutputStream outStream = null;

outStream = new FileOutputStream(DOC_PATH2);

document.write(outStream);

outStream.close();

}

catch (Exception e)

{

e.printStackTrace();

}

}

public static void replaceImage(){

//-----------------------------------插入图片---------------------------------------

File file = new File(IMAGE_PATH);

try {

File file2 = new File(DOC_PATH2);

WordprocessingMLPackage wPackage = WordprocessingMLPackage.load(new FileInputStream(file2));

MainDocumentPart mainDocumentPart = wPackage.getMainDocumentPart();

Document wmlDoc = (Document) mainDocumentPart.getJaxbElement();

Body body = wmlDoc.getBody();

// 提取正文中所有段落

List paragraphs = body.getContent();

// 提取书签并创建书签的游标

RangeFinder rt = new RangeFinder("CTBookmark", "CTMarkupRange");

new TraversalUtil(paragraphs, rt);

for (CTBookmark bm : rt.getStarts()) {

if (bm.getName().equals("images")) {// 这里的test为 word文档中预设的 书签名

InputStream inputStream = new FileInputStream(file);

byte[] bytes = IOUtils.toByteArray(inputStream);

BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wPackage, bytes);

Inline inline = imagePart.createImageInline(null, null, 0, 1, false, 10000);//这里的100000不是正常屏幕大小,用于设置插入图片的大小

P p = (P) (bm.getParent());

ObjectFactory factory = new ObjectFactory();

// R对象是匿名的复杂类型,然而我并不知道具体啥意思,估计这个要好好去看看ooxml才知道

R run = factory.createR();

// drawing理解为画布?

Drawing drawing = factory.createDrawing();

drawing.getAnchorOrInline().add(inline);

run.getContent().add(drawing);

p.getContent().add(run);

}

}

wPackage.save(new FileOutputStream(new File(DOC_PATH2)));

} catch (Exception e) {

e.printStackTrace();

}

}

//生成图片

public static void initImg(){

DefaultPieDataset dataset = new DefaultPieDataset();

dataset.setValue("修改类", 1);

dataset.setValue("提示类", 1);

dataset.setValue("校验不通过", 3);

dataset.setValue("正常类", 3);

JFreeChart chart = ChartFactory.createPieChart3D(null, dataset, true, false, false);

chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 15)); // 设置图例类别字体

// TextTitle title = new TextTitle(titleString);

// title.setFont(new Font("黑体", Font.ITALIC, 20));//设置标题字体

// chart.setTitle(title);

PiePlot piePlot = (PiePlot) chart.getPlot();

DecimalFormat df = new DecimalFormat("0.00%");

NumberFormat nf = NumberFormat.getInstance();

StandardPieSectionLabelGenerator generator = new StandardPieSectionLabelGenerator("{0} {2}", nf, df);// 获得StandardPieSectionLabelGenerator对象,生成的格式,

// {0}表示section名,{1}表示section的值,{2}表示百分比。可以自定义

piePlot.setLabelGenerator(generator);// 设置百分比

piePlot.setLabelFont(new Font("黑体", Font.ITALIC, 15));// 设置饼图中类别字体

piePlot.setNoDataMessage("此时并没有任何数据可用");

piePlot.setCircular(false);

piePlot.setLabelGap(0.02D);

piePlot.setIgnoreNullValues(true);// 设置不显示空位

piePlot.setIgnoreZeroValues(true);// 设置不显示负值或零值

try

{

ChartUtilities.saveChartAsPNG(new File(IMAGE_PATH), chart, 800, 500);

}

catch (IOException e)

{

e.printStackTrace();

}

}

public static void main(String[] args) throws Exception {

Map map = new HashMap<>();

map.put("unit","4");

map.put("startValue","85");

map.put("controlRod10","90");

map.put("plan","35计划");

map.put("position","总经理处");

//替换文字

replaceContent(map,DOC_PATH);

//生成图片

initImg();

//替换图片

replaceImage();

}

}

4.以上是所有代码,其中模板截图如下:箭头是要替换的文字以及图片需要插入标签,替换的时候需要用到

5.最后的结果是这样的

以上就是整个逻辑代码了,可以自己在尝试下,有的逻辑可以自己改改,有什么问题可以留言。

java word标签替换_JAVA实现替换WORD模板中的文字和图片相关推荐

  1. Java替换Word模板中的文字、图片、表格、水印

    前言 由于业务需求,要求开发一个工具类,需要对Word模板中的内容进行替换,并且支持插入图片.根据业务生成自定义表格,以及对处理后的文件增加水印,处理完的文件支持保存doc.docx.pdf格式 1. ...

  2. java excel 模板 替换_JAVA POI替换EXCEL模板中自定义标签(XLSX版本)满足替换多个SHEET中自定义标签...

    个人说明:为了简单实现导出数据较少的EXCEL(根据自定义书签模板) 一.替换Excel表格标签方法 ``` /** * 替换Excel模板文件内容 * @param map * 需要替换的标签建筑队 ...

  3. java读取word文档中的文字和图片,doc和docx兼容版

    也是我东抄抄,西抄抄拿来测试改装的,话不多说,直接上代码 <dependency><groupId>commons-io</groupId><artifact ...

  4. java作品设计报告书_java实验报告书格式模板.doc

    java实验报告书格式模板.doc 广东第二师范学院 计算机科学系 实验报告Java实验报告实验名称 实验分组号 实 验 人 班 级 学 号 实验指导教师 实验场地 实验时间 成 绩 a51ced6b ...

  5. java 单词出现次数_java 获取一段英文中每个单词出现的次数

    /** *获取一段英文中每个单词出现的次数 */ import java.util.HashMap; import java.util.Iterator; import java.util.Scann ...

  6. [matlab]用matlab建立word,并在word中写入文字和图片

    在matlab中建立word try%若word服务器已经打开,返回其句柄WordWord = actxGetRunningServer('Word.Application'); catch%创建一个 ...

  7. java pdf添加图片_java实现在pdf模板的指定位置插入图片

    本文实例为大家分享了java在pdf模板的指定位置插入图片的具体代码,供大家参考,具体内容如下 java操作pdf有个非常好用的库itextpdf,maven: com.itextpdf itextp ...

  8. java ldap操作实例_Java Spring Security示例教程中的2种设置LDAP Active Directory身份验证的方法...

    java ldap操作实例 LDAP身份验证是世界上最流行的企业应用程序身份验证机制之一,而Active Directory (Microsoft为Windows提供的LDAP实现)是另一种广泛使用的 ...

  9. velocity java 静态方法_java – 如何访问Velocity模板中的静态成员?

    我不知道在Velocity中是否有办法做到这一点: 我有一个用户POJO,一个名为Status的属性,它看起来像枚举(但不是,因为我被困在Java 1.4上),定义看起来像这样: public cla ...

最新文章

  1. JQuery .each()向后
  2. angular HttpClient post put patch del 方法(2)-Promise 服务
  3. how to become an expert in excel
  4. cf1561D Up the Strip(D1D2)
  5. 排序算法基本介绍及python实现(含详细注释)
  6. java封装省市区三级json格式,微信开发 使用picker封装省市区三级联动模板
  7. SpringMVC之数据传递三Ajax与Controller交互
  8. webpack Plugin常用 optimization splitChunks UglifyJsPlugin sourceMap
  9. java项目eclipse上tomcat部署后项目添加不进去
  10. windows平台下subversion服务器端配置
  11. cascade=CascadeType.ALL的深坑
  12. three.js 坐标系、camera位置属性、点、线、面
  13. html——name与value的使用
  14. 一系列JavaScript的基础工具
  15. 安装mysql 错误重新安装
  16. 前端数据修改的两种方式
  17. 基于jsp+java+ssm的大学生缴费系统-计算机毕业设计
  18. PS批量处理批量裁减不同尺寸图片教程(超详细教程 非常实用)-photoshop
  19. 用计算机求正有理数算术平方根的步骤,用计算器求算数平方根、用有理数估计算数平方根的大小 (2).ppt...
  20. java课程设计打字训练测试软件_Java版打字练习案例源码

热门文章

  1. 【php + MySQL + Android】本地实验环境搭建
  2. 深度学习(二十)基于Overfeat的图片分类、定位、检测
  3. 二分查找(整数二分)
  4. 数据结构-树与深度优先遍历
  5. 软件项目经理在面试的时候会问到哪些问题?
  6. 小人物解决四大数学问题:记传奇华人数学家李天岩
  7. 用淘礼金助手做0元购物软件这3点必须要知道
  8. ORA-01439: 要更改数据类型, 则要修改的列必须为空
  9. webrtc 之 sip trickle ice
  10. CMD打开IIS,重启iis等