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.以上是所有代码,其中模板截图如下:箭头是要替换的文字以及图片需要插入标签,替换的时候需要用到
5.最后的结果是这样的
以上就是整个逻辑代码了,可以自己在尝试下,有的逻辑可以自己改改,有什么问题可以留言。
java word标签替换_JAVA实现替换WORD模板中的文字和图片相关推荐
- Java替换Word模板中的文字、图片、表格、水印
前言 由于业务需求,要求开发一个工具类,需要对Word模板中的内容进行替换,并且支持插入图片.根据业务生成自定义表格,以及对处理后的文件增加水印,处理完的文件支持保存doc.docx.pdf格式 1. ...
- java excel 模板 替换_JAVA POI替换EXCEL模板中自定义标签(XLSX版本)满足替换多个SHEET中自定义标签...
个人说明:为了简单实现导出数据较少的EXCEL(根据自定义书签模板) 一.替换Excel表格标签方法 ``` /** * 替换Excel模板文件内容 * @param map * 需要替换的标签建筑队 ...
- java读取word文档中的文字和图片,doc和docx兼容版
也是我东抄抄,西抄抄拿来测试改装的,话不多说,直接上代码 <dependency><groupId>commons-io</groupId><artifact ...
- java作品设计报告书_java实验报告书格式模板.doc
java实验报告书格式模板.doc 广东第二师范学院 计算机科学系 实验报告Java实验报告实验名称 实验分组号 实 验 人 班 级 学 号 实验指导教师 实验场地 实验时间 成 绩 a51ced6b ...
- java 单词出现次数_java 获取一段英文中每个单词出现的次数
/** *获取一段英文中每个单词出现的次数 */ import java.util.HashMap; import java.util.Iterator; import java.util.Scann ...
- [matlab]用matlab建立word,并在word中写入文字和图片
在matlab中建立word try%若word服务器已经打开,返回其句柄WordWord = actxGetRunningServer('Word.Application'); catch%创建一个 ...
- java pdf添加图片_java实现在pdf模板的指定位置插入图片
本文实例为大家分享了java在pdf模板的指定位置插入图片的具体代码,供大家参考,具体内容如下 java操作pdf有个非常好用的库itextpdf,maven: com.itextpdf itextp ...
- java ldap操作实例_Java Spring Security示例教程中的2种设置LDAP Active Directory身份验证的方法...
java ldap操作实例 LDAP身份验证是世界上最流行的企业应用程序身份验证机制之一,而Active Directory (Microsoft为Windows提供的LDAP实现)是另一种广泛使用的 ...
- velocity java 静态方法_java – 如何访问Velocity模板中的静态成员?
我不知道在Velocity中是否有办法做到这一点: 我有一个用户POJO,一个名为Status的属性,它看起来像枚举(但不是,因为我被困在Java 1.4上),定义看起来像这样: public cla ...
最新文章
- JQuery .each()向后
- angular HttpClient post put patch del 方法(2)-Promise 服务
- how to become an expert in excel
- cf1561D Up the Strip(D1D2)
- 排序算法基本介绍及python实现(含详细注释)
- java封装省市区三级json格式,微信开发 使用picker封装省市区三级联动模板
- SpringMVC之数据传递三Ajax与Controller交互
- webpack Plugin常用 optimization splitChunks UglifyJsPlugin sourceMap
- java项目eclipse上tomcat部署后项目添加不进去
- windows平台下subversion服务器端配置
- cascade=CascadeType.ALL的深坑
- three.js 坐标系、camera位置属性、点、线、面
- html——name与value的使用
- 一系列JavaScript的基础工具
- 安装mysql 错误重新安装
- 前端数据修改的两种方式
- 基于jsp+java+ssm的大学生缴费系统-计算机毕业设计
- PS批量处理批量裁减不同尺寸图片教程(超详细教程 非常实用)-photoshop
- 用计算机求正有理数算术平方根的步骤,用计算器求算数平方根、用有理数估计算数平方根的大小 (2).ppt...
- java课程设计打字训练测试软件_Java版打字练习案例源码