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