POI 往Word2007 中书签位置添加图片,以及修复图片不显示的问题

时间:2021-09-28 12:46:02

    博主最近工作需要获取docx格式的模板,然后再往模板书签处填充数据以及在表格中添加图片等操作。用过XWPFDocunt的都知道这个特别坑人。哭。。。

    博主研究了好久,在网上看到如何修复bug不显示的问题。http://www.it165.net/pro/html/201108/451.html  这个是原文的链接。但是这个链接只是解决了在word里面不显示的问题。不能满足我往指定位置(书签处)添加图片的需求。于是博主在原有的基础下钻研封装了自己的方法。

    思路是这样子的,1:遍历所有单元格的段落

                              2:获取段落里面所有的书签

                              3:遍历书签,如果书签名是我们所要的,就往段落里面添加一个run

                              4:往这个run里面添加图片

以下是往Run里面插入图片的方法

	/**
	 * 往Run中插入图片(解决在word中不显示的问题)
	 * @param run
	 * @param blipId      图片的id
	 * @param id	      图片的类型
	 * @param width       图片的宽
	 * @param height      图片的高
	 * @author lgj
	 */
	public static void addPictureToRun(XWPFRun run,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 =run.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");
	}
 

    对了,以上的那个图片id是通过 document对象的方法获取的,String picid = doc.addPictureData(is, doc.PICTURE_TYPE_PNG);  参数1是你图片对应的流,参数2是图片的类型。


        求助如何在word表格里面插入行!是插入行,不是往末尾创建行。之前实现了把后面的移除然后保存在集合里,但是创建行之后再恢复行,然后再次写的时候报异常了。凉凉。