您好,欢迎来到图艺博知识网。
搜索
您的当前位置:首页JAVA实现替换WORD模板中的文字和图片

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\\\est.docx\"; //图⽚路径

public static final String IMAGE_PATH = \"D:\\\\report\\\est.png\"; //替换⽂字图⽚后的路径

public static final String DOC_PATH2 = \"D:\\\\report\\\est1.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\ 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(\"修改类\ dataset.setValue(\"提⽰类\ dataset.setValue(\"校验不通过\ dataset.setValue(\"正常类\

JFreeChart chart = ChartFactory.createPieChart3D(null, dataset, true, false, false); chart.getLegend().setItemFont(new Font(\"⿊体\设置图例类别字体 // TextTitle title = new TextTitle(titleString);

// title.setFont(new Font(\"⿊体\设置标题字体 // chart.setTitle(title);

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

DecimalFormat df = new DecimalFormat(\"0.00%\"); NumberFormat nf = NumberFormat.getInstance();

StandardPieSectionLabelGenerator generator = new StandardPieSectionLabelGenerator(\"{0} {2}\获得StandardPieSectionLabelGenerator对象,⽣成的格式, // {0}表⽰section名,{1}表⽰section的值,{2}表⽰百分⽐。可以⾃定义 piePlot.setLabelGenerator(generator);// 设置百分⽐

piePlot.setLabelFont(new Font(\"⿊体\设置饼图中类别字体 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\

map.put(\"startValue\ map.put(\"controlRod10\ map.put(\"plan\计划\");

map.put(\"position\总经理处\"); //替换⽂字

replaceContent(map,DOC_PATH); //⽣成图⽚ initImg(); //替换图⽚

replaceImage(); }}

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

5.最后的结果是这样的

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

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuoyibo.net 版权所有 湘ICP备2023021910号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务