欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-25 21:39:21
...

    博主最近工作需要获取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表格里面插入行!是插入行,不是往末尾创建行。之前实现了把后面的移除然后保存在集合里,但是创建行之后再恢复行,然后再次写的时候报异常了。凉凉。