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

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

1f8f3b4585db9f085f45a8f5630b50f7.png

4365f2dc0563b5ca748257db6c316323.png

5.最后的结果是这样的

bf53e6e3734af080714c247cf3614dfa.png

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

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

解说柯基

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值