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