栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

先说下 需要的依赖包


      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
  

示例,下图

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

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

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.OPCPackage;
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 map = Maps.newHashMap();
    map.put("$1", "1231");
    XWPFdocument document = new XWPFdocument(POIXMLdocument.openPackage("D:\tp\test.docx"));
    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("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 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文档文字并指定位置插入图片,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对考高分网网站的支持!

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号