先说下 需要的依赖包
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> |
示例,下图
如上图,需要替换的字符串地方“$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<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文档文字并指定位置插入图片,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:http://www.cnblogs.com/zwdx/p/8403946.html