Java 替换word文档文字并指定位置插入图片

作者:紫薇帝星的故事 时间:2023-08-12 22:02:25 

先说下 需要的依赖包


<dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi-excelant</artifactId>
     <version>3.12</version>
   </dependency>
   <dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi-scratchpad</artifactId>
     <version>3.12</version>
   </dependency>
   <dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi-ooxml</artifactId>
     <version>3.8</version>
   </dependency>
   <dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi-ooxml-schemas</artifactId>
     <version>3.8</version>
   </dependency>
<!-- 生成图片-->
<dependency>
   <groupId>org.jfree</groupId>
   <artifactId>jfreechart</artifactId>
   <version>1.0.19</version>
 </dependency>
 <dependency>
<!--支持插入图片-->
   <groupId>org.docx4j</groupId>
   <artifactId>docx4j</artifactId>
   <version>3.3.1</version>
 </dependency>

示例,下图

Java 替换word文档文字并指定位置插入图片

如上图,需要替换的字符串地方“$1”为“1231”,在指定位置插入书签,并命名“test”    ,插入的图片如下

Java 替换word文档文字并指定位置插入图片

本人也没太过多去研究,亲测通过有效,在这分享下

1.demo


import java.awt.Font;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.poi.POIXMLDocument;
import org.apache.poi.openxml4j.opc.O * ackage;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
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.Body;
import org.docx4j.wml.BooleanDefaultTrue;
import org.docx4j.wml.CTBookmark;
import org.docx4j.wml.Color;
import org.docx4j.wml.Document;
import org.docx4j.wml.Drawing;
import org.docx4j.wml.HpsMeasure;
import org.docx4j.wml.ObjectFactory;
import org.docx4j.wml.P;
import org.docx4j.wml.R;
import org.docx4j.wml.RPr;
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.chart.title.TextTitle;
import org.jfree.data.general.DefaultPieDataset;import com.aisino.qysds.common.constant.ERRORConstants;
import com.aisino.qysds.common.exception.SysException;
import com.aisino.qysds.service.IExportBgService;
import com.google.common.collect.Maps;
public class ExportBgServiceImpl {
public static void main(String[] args) throws Exception {
   Map<String, String> map = Maps.newHashMap();
   map.put("$1", "1231");
   XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage("D:\\tp\\test.docx"));
   Iterator<XWPFParagraph> itPara = document.getParagraphsIterator();
   while (itPara.hasNext()) {
     XWPFParagraph paragraph = (XWPFParagraph) itPara.next();
     List<XWPFRun> runs = paragraph.getRuns();
     for (int i = 0; i < runs.size(); i++) {
       String oneparaString = runs.get(i).getText(runs.get(i).getTextPosition());
       for (Map.Entry<String, String> 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("D:\\tp\\test1.docx");
   document.write(outStream);
   outStream.close();
//-----------------------------------这块为生成图片 和 插入图片
   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);// 设置不显示负值或零值
   String fName = "pie.png";
   File file = new File("D:\\tp", fName);
   if (file.exists()) {
     file.delete();
   }
   try {
     ChartUtilities.saveChartAsPNG(file, chart, 800, 500);
     File file2 = new File("D:\\tp\\test1.docx");
     WordprocessingMLPackage wPackage = WordprocessingMLPackage.load(new FileInputStream(file2));
     MainDocumentPart mainDocumentPart = wPackage.getMainDocumentPart();
     Document wmlDoc = (Document) mainDocumentPart.getJaxbElement();
     Body body = wmlDoc.getBody();
     // 提取正文中所有段落
     List<Object> paragraphs = body.getContent();
     // 提取书签并创建书签的游标
     RangeFinder rt = new RangeFinder("CTBookmark", "CTMarkupRange");
     new TraversalUtil(paragraphs, rt);
     for (CTBookmark bm : rt.getStarts()) {
       if (bm.getName().equals("test")) {// 这里的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("D:\\tp\\test1.docx")));
   } catch (IOException e) {
   }
 }
}

最后效果图如下:

Java 替换word文档文字并指定位置插入图片

总结

以上所述是小编给大家介绍的Java 替换word文档文字并指定位置插入图片网站的支持!

来源:http://www.cnblogs.com/zwdx/p/8403946.html

标签:java,word,文档文字
0
投稿

猜你喜欢

  • Java多线程的临界资源问题解决方案

    2021-12-29 07:44:35
  • Java继承方法重写实现原理及解析

    2021-12-31 16:35:54
  • C#中面向对象编程机制之多态学习笔记

    2023-12-06 20:16:33
  • java图形界面之加法计算器

    2023-08-31 02:27:43
  • Spring Boot 读取静态资源文件的方法

    2023-08-25 02:53:07
  • Android 自定义View实现单击和双击事件的方法

    2022-03-23 19:21:18
  • 基于Spring中各个jar包的作用及依赖(详解)

    2023-05-06 04:08:47
  • MyBatis Log 插件无法显示SQL语句的原因解析

    2023-11-24 23:42:55
  • Springboot如何通过yml配置文件为静态成员变量赋值

    2021-08-03 12:03:17
  • ES结合java代码聚合查询详细示例

    2022-08-31 01:23:29
  • 简单说说Java SE、Java EE、Java ME三者之间的区别

    2022-01-20 06:05:10
  • Android自定义图片选择器简单版

    2022-05-11 02:38:59
  • C#实现文件与字符串互转的方法详解

    2023-04-26 03:18:12
  • C#实现创建标签PDF文件的示例代码

    2023-09-15 07:04:58
  • Java如何基于command调用openssl生成私钥证书

    2023-08-09 11:55:39
  • Android编程实现应用自动更新、下载、安装的方法

    2021-11-15 11:21:39
  • SpringBoot项目修改访问端口和访问路径的方法

    2023-07-13 11:23:35
  • Android实现文字上下滚动效果

    2023-02-02 07:40:00
  • C# 中const,readonly,static的使用小结

    2022-05-16 20:39:58
  • java开发Dubbo注解Adaptive实现原理

    2022-02-06 11:40:31
  • asp之家 软件编程 m.aspxhome.com