当前版本 5.2.2 ,版本不同,写法略有差异
- poi-5.2.2 操作word 【段落】
- poi-5.2.2 操作word 【表格】
- poi-5.2.2 操作word【单元格、行、列】
- poi 5.2.2 操作word【页眉页脚】
- poi 5.2.2 操作word【纸张、边距】
- poi-5.2.2 操作word【图片操作相关】
- poi 5.2.2 操作word【目录】
本文所需依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-full</artifactId>
<version>5.2.2</version>
</dependency>
- 添加图片(内嵌)
/**
* 添加图片【内嵌图片】
* @param width 单位 磅
* @param height 单位 磅
* @Return
*/
public static void addPicture_Inline(XWPFRun run ,InputStream pictureData, int pictureType, String filename,
float width, float height ) throws Exception {
run.addPicture(pictureData , pictureType , filename , ptToEMUs(width) , ptToEMUs(height));
}
- 添加图片(内嵌、图片染色)
/**
* 添加图片【内嵌图片】
* @Auther lu zhifeng
* @Date 2020/11/14 12:27 上午
* @param width 单位 磅
* @param height 单位 磅
* @param backGColor 图片染色 如:ffffff
* @Return
*/
public static void addPicture_Inline(XWPFRun run ,InputStream pictureData, int pictureType, String filename,
float width, float height , String backGColor) throws Exception {
run.addPicture(pictureData , pictureType , filename , ptToEMUs(width) , ptToEMUs(height));
CTDrawing drawing = run.getCTR().getDrawingArray(0);
CTInline inline = drawing.getInlineArray(0);
//给图片添加颜色
if(!StringUtil.empty(backGColor)){
String xmlColor = "<a:duotone>\n" +
"<a:prstClr val=\"black\"/>\n" +
"<a:srgbClr val=\"" + backGColor + "\">\n" +
// "<a:tint val=\"45000\"/>\n" +
// "<a:satMod val=\"400000\"/>\n" +
"</a:srgbClr>\n" +
"</a:duotone>\n" +
"</a:blip>";
String string = inline.getGraphic().getGraphicData().xmlText();
String toReplaceStr = string.replaceAll(".*(<a:blip.*?/>).*", "$1");
String targetReplace = toReplaceStr.replaceAll("/>", ">") + xmlColor;
String result = string.replaceAll(toReplaceStr, targetReplace);
XmlObject parse = XmlObject.Factory.parse(result);
inline.getGraphic().getGraphicData().set(parse);
}
}
- 添加图片(浮动)
/**
* 添加图片[环绕模式:文字上方/下方]
* @param pictureData 图片数据
* @param pictureType 图片类型,参考 ({@link XWPFDocument#PICTURE_TYPE_PNG})
* @param filename 图片名
* @param width 图片宽 单位 磅
* @param height 图片高 单位 磅
* @param wrapType 环绕模式:{@link WordBaseConstants#AROUND_BEHIND_OVER}
* @param positionH 水平方向的移动数值 单位 磅
* @param relFromH 水平方向的位置相对于谁进行调整
* @param positionV 垂直方向的移动数值 单位 磅
* @param relFromV 垂直方向的位置相对于谁进行调整
* @param backGColor 图片染色
*/
public static void addPicture_Anchor(XWPFRun run ,InputStream pictureData, int pictureType, String filename,
float width, float height ,float positionH , STRelFromH.Enum relFromH,
float positionV , STRelFromV.Enum relFromV , int wrapType , String backGColor) throws IOException {
try {
run.addPicture(pictureData , pictureType , filename , ptToEMUs(width) , ptToEMUs(height));
//获取刚才添加的图片数据
CTDrawing drawing = run.getCTR().getDrawingArray(0);
CTGraphicalObject graphicalobject = drawing.getInlineArray(0).getGraphic();
long id = drawing.getInlineArray(0).getDocPr().getId(); //使用原来的id
//设置一个浮动模式,替换掉默认的行内模式
CTAnchor ctAnchor = drawing.addNewAnchor();
String xml = "<a:graphic xmlns:a=\"" + CTGraphicalObject.type.getName().getNamespaceURI() + "\">" + "<a:graphicData uri=\"" + org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture.type.getName().getNamespaceURI() + "\">" + "<pic:pic xmlns:pic=\"" + org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture.type.getName().getNamespaceURI() + "\" />" + "</a:graphicData>" + "</a:graphic>";
InputSource is = new InputSource(new StringReader(xml));
org.w3c.dom.Document doc = DocumentHelper.readDocument(is);
ctAnchor.set(org.apache.xmlbeans.XmlToken.Factory.parse(doc.getDocumentElement(), POIXMLTypeLoader.DEFAULT_XML_OPTIONS));
ctAnchor.setDistT(0L); //位置
ctAnchor.setDistR(0L);
ctAnchor.setDistB(0L);
ctAnchor.setDistL(0L);
ctAnchor.setLocked(false);
ctAnchor.setLayoutInCell(true);
ctAnchor.setSimplePos2(false);
ctAnchor.setAllowOverlap(true);
ctAnchor.setRelativeHeight(0);
if(wrapType == WordBaseConstants.AROUND_BEHIND_OVER){
ctAnchor.setBehindDoc(false);
ctAnchor.addNewWrapNone(); //浮动模式,无文字环绕
}else if(wrapType == WordBaseConstants.AROUND_BEHIND_UNDER){
ctAnchor.setBehindDoc(true);
ctAnchor.addNewWrapNone(); //浮动模式,无文字环绕
}else if(wrapType == WordBaseConstants.AROUND_SQUARE){
ctAnchor.addNewWrapSquare();
}else if(wrapType == WordBaseConstants.AROUND_TIGHT){
ctAnchor.addNewWrapTight();
}else if(wrapType == WordBaseConstants.AROUND_THROUGH){
ctAnchor.addNewWrapThrough();
}else if(wrapType == WordBaseConstants.AROUND_TOP_BOTTOM){
ctAnchor.addNewWrapTopAndBottom();
}
CTPosH ctPosH = ctAnchor.addNewPositionH();
ctPosH.setRelativeFrom(relFromH == null ? STRelFromH.CHARACTER : relFromH);
ctPosH.setPosOffset(ptToEMUs(positionH));
CTPosV ctPosV = ctAnchor.addNewPositionV();
ctPosV.setRelativeFrom(relFromV == null ? STRelFromV.PARAGRAPH : relFromV);
ctPosV.setPosOffset(ptToEMUs(positionV));
CTPoint2D ctPoint2D = ctAnchor.addNewSimplePos();
ctPoint2D.setX(0);
ctPoint2D.setY(0);
ctAnchor.addNewCNvGraphicFramePr();
CTNonVisualDrawingProps docPr = ctAnchor.addNewDocPr();
docPr.setId(id);
docPr.setName("Drawing " + id);
docPr.setDescr(filename);
CTPositiveSize2D extent = ctAnchor.addNewExtent();
extent.setCx(ptToEMUs(width));
extent.setCy(ptToEMUs(height));
ctAnchor.setGraphic(graphicalobject);
drawing.setAnchorArray(new CTAnchor[]{ctAnchor});//添加浮动属性
drawing.removeInline(0);//删除行内属性
//给图片添加颜色
if(!StringUtil.empty(backGColor)){
String xmlColor = "<a:duotone>\n" +
"<a:prstClr val=\"black\"/>\n" +
"<a:srgbClr val=\"" + backGColor + "\">\n" +
// "<a:tint val=\"45000\"/>\n" +
// "<a:satMod val=\"400000\"/>\n" +
"</a:srgbClr>\n" +
"</a:duotone>\n" +
"</a:blip>";
String string = ctAnchor.getGraphic().getGraphicData().xmlText();
String toReplaceStr = string.replaceAll(".*(<a:blip.*?/>).*", "$1");
String targetReplace = toReplaceStr.replaceAll("/>", ">") + xmlColor;
String result = string.replaceAll(toReplaceStr, targetReplace);
XmlObject parse = XmlObject.Factory.parse(result);
ctAnchor.getGraphic().getGraphicData().set(parse);
}
} catch (XmlException | SAXException | InvalidFormatException var31) {
throw new IllegalStateException(var31);
}
}
- 涉及常量
public class WordBaseConstants {
//环绕模式选项
/** 内嵌 */
public static final int AROUND_INLINE = 0;
/** 浮于文字上方 */
public static final int AROUND_BEHIND_OVER = 1;
/** 衬于文字下方 */
public static final int AROUND_BEHIND_UNDER = 2;
/** 四周型 */
public static final int AROUND_SQUARE = 3;
/** 紧密型 */
public static final int AROUND_TIGHT = 4;
/** 穿越型 */
public static final int AROUND_THROUGH = 5;
/** 上下型 */
public static final int AROUND_TOP_BOTTOM = 6;
}