解决POI3.10 添加图片不成功的问题
来源:互联网 发布:淘宝如何删除好评 编辑:程序博客网 时间:2024/06/01 21:27
问题:
当我用poi3.10去生成word文件时,文字可以正常生成,而图片却加载不出来,并且用offic2007版本的无法打开word文件
问题:
POI3.10在添加图片的时候自身有一个BUG,自带的addpicture()方法无法使图片正常生成在word上显示
解决方式:
解决方式有几种,这里只介绍一种方式。
一、创建一个类,不用做任何修改,只需导入各种需要的包即可,
新建类:CustomXWPFDocument继承XWPFDocument
添加方法:createPic
package org.uz.dxt.common;import org.apache.poi.xwpf.usermodel.XWPFDocument;import org.apache.xmlbeans.XmlException;import org.apache.xmlbeans.XmlToken;import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;public class CustomXWPFDocument extends XWPFDocument {public void createPic(String blipId,int id, int width, int height,CTInline inline) {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"); }}二、修改你自定义的下载类的对象,改为上面新建的类,由于继承了XWPFDocument,所以不会产生影响
三、修改图片生成部分的接口:使用doc.addPictureData()方法
旧代码:
XWPFParagraph p9 = doc.createParagraph();p9.setAlignment(ParagraphAlignment.CENTER);p9.setVerticalAlignment(TextAlignment.CENTER);// 图片XWPFRun r8 = p9.createRun();for (Attachment attachment : fileList) {// 文件类型String type = attachment.getType(); int fileSize=Integer.parseInt(attachment.getFileSize());if ("01".equals(type)&&fileSize>0) {String fileName = attachment.getFileName()//获取图片流InputStream in = getImage(HOST_URL+attachment.getFileUrl()+"?userId="+userId);//获取图片流r8.addPicture(in, XWPFDocument.PICTURE_TYPE_JPEG,//此方法poi有缺陷fileName, Units.toEMU(300), Units.toEMU(400));r8.addBreak();fileName = StringUtils.substringBefore(fileName, ".");r8.setText(fileName);r8.addBreak();in.close();}
修改之后的代码:
for (Attachment attachment : fileList) {// 文件类型String type = attachment.getType(); if ("02".equals(type)) {String fileName = attachment.getFileName();//获取图片流InputStream in = getImage(ConfigParams.NEW_DOWNLOAD_URL+attachment.getFileUrl());CTInline ctinline=r8.getCTR().addNewDrawing().addNewInline();//设置段落行String id = doc.addPictureData(in, XWPFDocument.PICTURE_TYPE_JPEG);//添加图片数据int id2=doc.getAllPackagePictures().size()+1;doc.createPic(id,id2, 259, 259,ctinline);//添加图片fileName = StringUtils.substringBefore(fileName, ".");r8.setText(fileName);r8.addBreak(BreakType.PAGE);in.close(); }
做上述修改
运行可以在word中查看到图片。
0 0
- 解决POI3.10 添加图片不成功的问题
- 终于解决无线连接不成功的问题了
- 解决笔记本安装系统不成功的问题
- 解决android SDK升级不成功的问题
- POI3.2中同时多个sheet中插入多个图片的问题
- POI导出图片到Excel 用的Jar包是POI3.10 & JFreechart1.0.17
- windows phone7 添加Service Reference不成功的问题
- 解决opencv无法在图片上添加中文的问题。
- 如何解决Android sdk tool的下载不成功的问题
- 解决ORACLE启动不成功问题
- kindEditor上传图片错误,不成功的问题总结
- 解决从activitygrou的子activity相互跳转不成功问题
- 解决mysql卸载后重复安装不成功的问题
- android - 解决SDK Mananger更新慢或不成功的问题
- 解决Xcode 命令行打包时证书签名不成功的问题
- myeclipse创建svn资源库时连接不成功问题的解决
- 解决git pull到github不成功的问题
- 解决centos7 中 使用mariadb 安装mysql不成功的问题
- 树形结构过滤敏感词
- Dagger 2应用于Android的完美扩展库-dagger.android
- AspectJ 开发
- 上传漏洞小结
- 关于java Calendar的一些问题
- 解决POI3.10 添加图片不成功的问题
- PHPexcel导出数据(THINKPHP)
- TCP拥塞控制概念性总结
- ios
- 使用boost线程池(多线程使用opencv处理图片)
- 把自己制作的Python open package发布到PyPI
- HTML 子div在父div中居中显示
- 一个困扰已久的UIScrollView问题
- [SHOI2007]BZOJ1934 Vote善意的投票-最小割