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

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

第一步,导入jar

  <dependency>
            <groupId>org.apache.poigroupId>
            <artifactId>poiartifactId>
            <version>3.15version>
    dependency>
        <dependency>
            <groupId>org.apache.poigroupId>
            <artifactId>poi-ooxmlartifactId>
            <version>3.15version>
        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 = ""    
                + ""    
                + "   "    
                + "      "    
                + "         " + "                
                + id    
                + "\" name=\"Generated\"/>"    
                + "            "    
                + "         "    
                + "         "    
                + "                
                + blipId    
                + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"    
                + "            "    
                + "               "    
                + "            "    
                + "         "    
                + "         "    
                + "            "    
                + "               "    
                + "                   
                + width    
                + "\" cy=\""    
                + height    
                + "\"/>"    
                + "            "    
                + "            "    
                + "               "    
                + "            "    
                + "         "    
                + "      "    
                + "   " + "";    

        // 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);

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

你可能感兴趣的:(bug解决)