我想要用java,通过poi实现word文档中插入文字和图片来发送邮箱附件.但是发现在对word操作中,图片是白的,size如果设置小了直接没有图片. 经过百度 参考解决 Java poi 3.8 等版本 操作 word 插入 图片 不成功的问题_繁星-CSDN博客_apache poi word插入图片 解决 Java poi 3.8等版本操作word插入图片不成功的问题问题:最近有一个需求是将Excel中的数据转换到word中,其中包括了文字和图片,在使用poi 3.8向word中写入图片的时候发现怎么都不成功,具体过程如下:使用poi写入图片到word,我用户鼠标点击文档中插入图片的表格发现里面是有内容的,是一个图片的框,但是框里面看不见任何东西...https://blog.csdn.net/qq_36623327/article/details/90762982
通过继承XWPFDocument类,修改了源码中的问题,最后解决了问题.
XWPFDocument继承类可以参考POI向word2007文件插入图片时的Bug问题 | 学步园
下面是调用方法
集成类
public class POIBug extends XWPFDocument { public POIBug() { super(); } public POIBug(OPCPackage opcPackage) throws IOException { super(opcPackage); } public POIBug(InputStream in) throws IOException { super(in); } public void createPicture(String blipId,int id, int width, int height) { final int EMU = 9525; width *= EMU; height *= EMU; //String blipId = getAllPictures().get(id).getPackageRelationship().getId(); CTInline inline = createParagraph().createRun().getCTR().addNewDrawing().addNewInline(); String picXml = "" + "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">" + " <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" + " <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" + " <pic:nvPicPr>" + " <pic:cNvPr id=\"" + id + "\" name=\"Generated\"/>" + " <pic:cNvPicPr/>" + " </pic:nvPicPr>" + " <pic:blipFill>" + " <a:blip r:embed=\"" + blipId + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>" + " <a:stretch>" + " <a:fillRect/>" + " </a:stretch>" + " </pic:blipFill>" + " <pic:spPr>" + " <a:xfrm>" + " <a:off x=\"0\" y=\"0\"/>" + " <a:ext cx=\"" + width + "\" cy=\"" + height + "\"/>" + " </a:xfrm>" + " <a:prstGeom prst=\"rect\">" + " <a:avLst/>" + " </a:prstGeom>" + " </pic:spPr>" + " </pic:pic>" + " </a:graphicData>" + "</a:graphic>"; //CTGraphicalObjectData graphicData = inline.addNewGraphic().addNewGraphicData(); XmlToken xmlToken = null; try { xmlToken = XmlToken.Factory.parse(picXml); } catch(XmlException xe) { xe.printStackTrace(); } inline.set(xmlToken); //graphicData.set(xmlToken); inline.setDistT(0); inline.setDistB(0); inline.setDistL(0); inline.setDistR(0); CTPositiveSize2D extent = inline.addNewExtent(); extent.setCx(width); extent.setCy(height); CTNonVisualDrawingProps docPr = inline.addNewDocPr(); docPr.setId(id); docPr.setName("Picture " + id); docPr.setDescr("Generated"); } }
调用时: POIBug doc=new POIBug();//集成XWPFDocument的类
String picId = doc.addPictureData(savePhoto(), XWPFDocument.PICTURE_TYPE_PNG); //在word文档需要放图片的地方调用,savePhoto()是返回的input流,我是用的jfreechart方法生成的饼状图片,方法在最后 doc.createPicture(picId, doc.getNextPicNameNumber(XWPFDocument.PICTURE_TYPE_PNG), 200, 150);
//下面可以在图片下继续添加上段落
XWPFParagraph p3 = doc.createParagraph(); XWPFRun run = p3.createRun(); run.setText("test"); //output是要输出的文档流 ,write调用后写入文件 doc.write(bufferedOutputStream); bufferedOutputStream.close();
//生成饼图转成图片在生成inputstream
public InputStream savePhoto() throws IOException { StandardChartTheme standardChartTheme=new StandardChartTheme("CN"); //设置标题字体 standardChartTheme.setExtraLargeFont(new Font("隶书", Font.BOLD,20)); //设置图例的字体 standardChartTheme.setRegularFont(new Font("宋书",Font.PLAIN,15)); //设置轴向的字体 standardChartTheme.setLargeFont(new Font("宋书",Font.PLAIN,15)); //应用主题样式 ChartFactory.setChartTheme(standardChartTheme); DefaultPieDataset dataset = new DefaultPieDataset( ); dataset.setValue("红色性格", new Double( 10 ) ); dataset.setValue("绿色性格", new Double( 2 ) ); dataset.setValue("蓝色性格", new Double( 15 ) ); dataset.setValue("黄色性格", new Double( 3 ) ); JFreeChart chart = ChartFactory.createPieChart( "Mobile Sales", // chart title dataset, // data true, // include legend true, false); int width = 480; /* Width of the image */ int height = 360; /* Height of the image */ ByteArrayOutputStream outputStream=new ByteArrayOutputStream(); ChartUtils.writeChartAsJPEG( outputStream,chart,width,height ); byte[] bytes = outputStream.toByteArray(); InputStream inputStream=new ByteArrayInputStream(bytes); return inputStream; }
jar包依赖
//操作word等的包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.0</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>4.1.0</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.0</version> </dependency> //绘制饼图的包 <!-- https://mvnrepository.com/artifact/org.jfree/jfreechart --> <dependency> <groupId>org.jfree</groupId> <artifactId>jfreechart</artifactId> <version>1.5.3</version> </dependency>