java利用poi添加多张图片到word

来源:互联网 发布:淘宝店铺简介怎么写? 编辑:程序博客网 时间:2024/05/01 13:45

poi提供的方法是有添加图片到word的,但是并不是兼容所有word。所以需要重写他的方法

第一步,导入jar

  <dependency>            <groupId>org.apache.poi</groupId>            <artifactId>poi</artifactId>            <version>3.15</version>    </dependency>        <dependency>            <groupId>org.apache.poi</groupId>            <artifactId>poi-ooxml</artifactId>            <version>3.15</version>        </dependency>

第二步,写了一个工具类,重写poi里面的方法的

import java.io.IOException;  import java.io.InputStream;  import org.apache.poi.openxml4j.opc.OPCPackage;  import org.apache.poi.xwpf.usermodel.XWPFDocument;  import org.apache.poi.xwpf.usermodel.XWPFParagraph;  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;  /**   * @author POI 导出图片bug修复  *    */    public class CustomXWPFDocument extends XWPFDocument {        public CustomXWPFDocument(InputStream in) throws IOException {            super(in);        }        /**       *        */        public CustomXWPFDocument() {            super();            // TODO Auto-generated constructor stub         }        /**       * @param pkg       * @throws IOException       */        public CustomXWPFDocument(OPCPackage pkg) throws IOException {            super(pkg);            // TODO Auto-generated constructor stub         }  // picAttch 图片后面追加的字符串 可以是空格      public void createPicture(XWPFParagraph paragraph,int id, int width, int height,String picAttch) {            final int EMU = 9525;            width *= EMU;            height *= EMU;            String blipId = getAllPictures().get(id).getPackageRelationship()                    .getId();            CTInline inline = paragraph.createRun().getCTR()                    .addNewDrawing().addNewInline();            paragraph.createRun().setText(picAttch);          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("图片" + id);            docPr.setDescr("");        }    }    

第三步,上核心代码

//新建word文档CustomXWPFDocument document=new CustomXWPFDocument();document.addPictureData(inputStream, XWPFDocument.PICTURE_TYPE_JPEG);   document.createPicture(document.createParagraph(),document.getAllPictures().size()-1, 400, 400,"    ");

说明:inputStream代表你要放入word的流

最后

//把word文档写到文件中File newfile=new File("newfile.docx");FileOutputStream fos = new FileOutputStream(newfile); document.write(fos);

虽然写出来了,但是感觉自己还停留在会用,不了解其中为什么要这么用的含义,研究的不深

0 0