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

时间:2022-04-30 17:14:43

先说下 需要的依赖包

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<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

  1. import java.awt.font; 
  2. import java.io.file; 
  3. import java.io.fileinputstream; 
  4. import java.io.fileoutputstream; 
  5. import java.io.ioexception; 
  6. import java.io.inputstream; 
  7. import java.math.biginteger; 
  8. import java.text.decimalformat; 
  9. import java.text.numberformat; 
  10. import java.util.iterator; 
  11. import java.util.list; 
  12. import java.util.map; 
  13. import java.util.set; 
  14. import org.apache.poi.poixmldocument; 
  15. import org.apache.poi.openxml4j.opc.opcpackage; 
  16. import org.apache.poi.util.ioutils; 
  17. import org.apache.poi.xwpf.usermodel.xwpfdocument; 
  18. import org.apache.poi.xwpf.usermodel.xwpfparagraph; 
  19. import org.apache.poi.xwpf.usermodel.xwpfrun; 
  20. import org.docx4j.traversalutil; 
  21. import org.docx4j.dml.wordprocessingdrawing.inline; 
  22. import org.docx4j.finders.rangefinder; 
  23. import org.docx4j.openpackaging.packages.wordprocessingmlpackage; 
  24. import org.docx4j.openpackaging.parts.wordprocessingml.binarypartabstractimage; 
  25. import org.docx4j.openpackaging.parts.wordprocessingml.maindocumentpart; 
  26. import org.docx4j.wml.body; 
  27. import org.docx4j.wml.booleandefaulttrue; 
  28. import org.docx4j.wml.ctbookmark; 
  29. import org.docx4j.wml.color; 
  30. import org.docx4j.wml.document; 
  31. import org.docx4j.wml.drawing; 
  32. import org.docx4j.wml.hpsmeasure; 
  33. import org.docx4j.wml.objectfactory; 
  34. import org.docx4j.wml.p; 
  35. import org.docx4j.wml.r; 
  36. import org.docx4j.wml.rpr; 
  37. import org.jfree.chart.chartfactory; 
  38. import org.jfree.chart.chartutilities; 
  39. import org.jfree.chart.jfreechart; 
  40. import org.jfree.chart.labels.standardpiesectionlabelgenerator; 
  41. import org.jfree.chart.plot.pieplot; 
  42. import org.jfree.chart.title.texttitle; 
  43. import org.jfree.data.general.defaultpiedataset;import com.aisino.qysds.common.constant.errorconstants; 
  44. import com.aisino.qysds.common.exception.sysexception; 
  45. import com.aisino.qysds.service.iexportbgservice; 
  46. import com.google.common.collect.maps; 
  47. public class exportbgserviceimpl { 
  48. public static void main(string[] args) throws exception { 
  49.     map<string, string> map = maps.newhashmap(); 
  50.     map.put("$1""1231"); 
  51.     xwpfdocument document = new xwpfdocument(poixmldocument.openpackage("d:\tp\test.docx")); 
  52.     iterator<xwpfparagraph> itpara = document.getparagraphsiterator(); 
  53.     while (itpara.hasnext()) { 
  54.       xwpfparagraph paragraph = (xwpfparagraph) itpara.next(); 
  55.       list<xwpfrun> runs = paragraph.getruns(); 
  56.       for (int i = 0; i < runs.size(); i++) { 
  57.         string oneparastring = runs.get(i).gettext(runs.get(i).gettextposition()); 
  58.         for (map.entry<string, string> entry : map.entryset()) { 
  59.           if (oneparastring.equals(entry.getkey())) { 
  60.             oneparastring = oneparastring.replace(entry.getkey(), entry.getvalue()); 
  61.           } 
  62.         } 
  63.         runs.get(i).settext(oneparastring, 0); 
  64.       } 
  65.     } 
  66.     fileoutputstream outstream = null
  67.     outstream = new fileoutputstream("d:\tp\test1.docx"); 
  68.     document.write(outstream); 
  69.     outstream.close(); 
  70. //-----------------------------------这块为生成图片 和 插入图片 
  71.     defaultpiedataset dataset = new defaultpiedataset(); 
  72.     dataset.setvalue("修改类", 1); 
  73.     dataset.setvalue("提示类", 1); 
  74.     dataset.setvalue("校验不通过", 3); 
  75.     dataset.setvalue("正常类", 3); 
  76.     jfreechart chart = chartfactory.createpiechart3d(null, dataset, truefalsefalse); 
  77.     chart.getlegend().setitemfont(new font("黑体", font.bold, 15)); // 设置图例类别字体 
  78.     // texttitle title = new texttitle(titlestring); 
  79.     // title.setfont(new font("黑体", font.italic, 20));//设置标题字体 
  80.     // chart.settitle(title); 
  81.     pieplot pieplot = (pieplot) chart.getplot(); 
  82.     decimalformat df = new decimalformat("0.00%"); 
  83.     numberformat nf = numberformat.getinstance(); 
  84.     standardpiesectionlabelgenerator generator = new standardpiesectionlabelgenerator("{0} {2}", nf, df);// 获得standardpiesectionlabelgenerator对象,生成的格式, 
  85.     // {0}表示section名,{1}表示section的值,{2}表示百分比。可以自定义 
  86.     pieplot.setlabelgenerator(generator);// 设置百分比 
  87.     pieplot.setlabelfont(new font("黑体", font.italic, 15));// 设置饼图中类别字体 
  88.     pieplot.setnodatamessage("此时并没有任何数据可用"); 
  89.     pieplot.setcircular(false); 
  90.     pieplot.setlabelgap(0.02d); 
  91.     pieplot.setignorenullvalues(true);// 设置不显示空位 
  92.     pieplot.setignorezerovalues(true);// 设置不显示负值或零值 
  93.     string fname = "pie.png"
  94.     file file = new file("d:\tp", fname); 
  95.     if (file.exists()) { 
  96.       file.delete(); 
  97.     } 
  98.     try { 
  99.       chartutilities.savechartaspng(file, chart, 800, 500); 
  100.       file file2 = new file("d:\tp\test1.docx"); 
  101.       wordprocessingmlpackage wpackage = wordprocessingmlpackage.load(new fileinputstream(file2)); 
  102.       maindocumentpart maindocumentpart = wpackage.getmaindocumentpart(); 
  103.       document wmldoc = (document) maindocumentpart.getjaxbelement(); 
  104.       body body = wmldoc.getbody(); 
  105.       // 提取正文中所有段落 
  106.       list<object> paragraphs = body.getcontent(); 
  107.       // 提取书签并创建书签的游标 
  108.       rangefinder rt = new rangefinder("ctbookmark""ctmarkuprange"); 
  109.       new traversalutil(paragraphs, rt); 
  110.       for (ctbookmark bm : rt.getstarts()) { 
  111.         if (bm.getname().equals("test")) {// 这里的test为 word文档中预设的 书签名 
  112.           inputstream inputstream = new fileinputstream(file); 
  113.           byte[] bytes = ioutils.tobytearray(inputstream); 
  114.           binarypartabstractimage imagepart = binarypartabstractimage.createimagepart(wpackage, bytes); 
  115.           inline inline = imagepart.createimageinline(nullnull, 0, 1, false, 10000);//这里的100000不是正常屏幕大小,用于设置插入图片的大小 
  116.           p p = (p) (bm.getparent()); 
  117.           objectfactory factory = new objectfactory(); 
  118.           // r对象是匿名的复杂类型,然而我并不知道具体啥意思,估计这个要好好去看看ooxml才知道 
  119.           r run = factory.creater(); 
  120.           // drawing理解为画布? 
  121.           drawing drawing = factory.createdrawing(); 
  122.           drawing.getanchororinline().add(inline); 
  123.           run.getcontent().add(drawing); 
  124.           p.getcontent().add(run); 
  125.         } 
  126.       } 
  127.       wpackage.save(new fileoutputstream(new file("d:\tp\test1.docx"))); 
  128.     } catch (ioexception e) { 
  129.     } 
  130.   } 

最后效果图如下:

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

总结

以上所述是小编给大家介绍的java 替换word文档文字并指定位置插入图片,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:http://www.cnblogs.com/zwdx/p/8403946.html