使用ApachePOI将任何形状插入word文档

使用ApachePOI将任何形状插入word文档,apache,ms-word,apache-poi,xwpf,Apache,Ms Word,Apache Poi,Xwpf,是否有可能使用ApachePOI在word文档中插入任何形状。据我所知,有几种方法可以在文档中插入图片。但是,是否可以使用POI绘制我自己的长方体、圆形或矩形。如果可能的话,请帮助我这样做。 多谢各位 下面是一个使用docx4j以编程方式创建文本框、椭圆和矩形的示例 POI将相当类似(它使用XMLBean,而不是JAXB) 您可以使用一块XML,而不是用代码来完成这一切;XML方法显示了这种方法 import javax.xml.bind.JAXBElement; import javax.xm

是否有可能使用ApachePOI在word文档中插入任何形状。据我所知,有几种方法可以在文档中插入图片。但是,是否可以使用POI绘制我自己的长方体、圆形或矩形。如果可能的话,请帮助我这样做。
多谢各位

下面是一个使用docx4j以编程方式创建文本框、椭圆和矩形的示例

POI将相当类似(它使用XMLBean,而不是JAXB)

您可以使用一块XML,而不是用代码来完成这一切;XML方法显示了这种方法

import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;

import org.docx4j.XmlUtils;
import org.docx4j.jaxb.Context;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.vml.CTOval;
import org.docx4j.vml.CTPath;
import org.docx4j.vml.CTRect;
import org.docx4j.vml.CTShape;
import org.docx4j.vml.CTShapetype;
import org.docx4j.vml.CTStroke;
import org.docx4j.vml.CTTextbox;
import org.docx4j.wml.BooleanDefaultTrue;
import org.docx4j.wml.CTLanguage;
import org.docx4j.wml.CTTxbxContent;
import org.docx4j.wml.P;
import org.docx4j.wml.PPr;
import org.docx4j.wml.ParaRPr;
import org.docx4j.wml.Pict;
import org.docx4j.wml.R;
import org.docx4j.wml.RPr;
import org.docx4j.wml.Text;

public class PictDemo  {

    static org.docx4j.wml.ObjectFactory wmlObjectFactory = Context.getWmlObjectFactory();

    public static void main(String[] args) throws Exception {

        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
        MainDocumentPart mdp = wordMLPackage.getMainDocumentPart();

        mdp.getContent().add(pTextBox());
        mdp.getContent().add(pOval());
//      mdp.getContent().add(pRectangle());
        mdp.getContent().add(pRectangleViaXML());

        // Pretty print the main document part
        System.out.println(
                XmlUtils.marshaltoString(mdp.getJaxbElement(), true, true) );

        String filename = System.getProperty("user.dir") + "/OUT_PictDemo.docx";
        wordMLPackage.save(new java.io.File(filename) );

    }

    public static P pTextBox() {


        P p = wmlObjectFactory.createP(); 

            // Create object for r
            R r = wmlObjectFactory.createR(); 
            p.getContent().add( r); 
                // Create object for rPr
                RPr rpr = wmlObjectFactory.createRPr(); 
                r.setRPr(rpr); 
                    // Create object for noProof
                    BooleanDefaultTrue booleandefaulttrue = wmlObjectFactory.createBooleanDefaultTrue(); 
                    rpr.setNoProof(booleandefaulttrue); 
                // Create object for pict (wrapped in JAXBElement) 
                Pict pict = wmlObjectFactory.createPict(); 
                JAXBElement<org.docx4j.wml.Pict> pictWrapped = wmlObjectFactory.createRPict(pict); 
                r.getContent().add( pictWrapped); 
        org.docx4j.vml.ObjectFactory vmlObjectFactory = new org.docx4j.vml.ObjectFactory();
                    // Create object for shapetype (wrapped in JAXBElement) 
                    CTShapetype shapetype = vmlObjectFactory.createCTShapetype(); 
                    JAXBElement<org.docx4j.vml.CTShapetype> shapetypeWrapped = vmlObjectFactory.createShapetype(shapetype); 
                    pict.getAnyAndAny().add( shapetypeWrapped); 
                        // Create object for stroke (wrapped in JAXBElement) 
                        CTStroke stroke = vmlObjectFactory.createCTStroke(); 
                        JAXBElement<org.docx4j.vml.CTStroke> strokeWrapped = vmlObjectFactory.createStroke(stroke); 
                        shapetype.getEGShapeElements().add( strokeWrapped); 
                            stroke.setJoinstyle(org.docx4j.vml.STStrokeJoinStyle.MITER);
                        // Create object for path (wrapped in JAXBElement) 
                        CTPath path = vmlObjectFactory.createCTPath(); 
                        JAXBElement<org.docx4j.vml.CTPath> pathWrapped = vmlObjectFactory.createPath(path); 
                        shapetype.getEGShapeElements().add( pathWrapped); 
                            path.setGradientshapeok(org.docx4j.vml.STTrueFalse.T);
                            path.setConnecttype(org.docx4j.vml.officedrawing.STConnectType.RECT);
                        shapetype.setCoordsize( "21600,21600"); 
                        shapetype.setSpt( new Float(202.0) );
                        shapetype.setConnectortype(org.docx4j.vml.officedrawing.STConnectorType.STRAIGHT);
                        shapetype.setVmlId( "_x0000_t202"); 
                        shapetype.setInsetmode(org.docx4j.vml.officedrawing.STInsetMode.CUSTOM);
                        shapetype.setHralign(org.docx4j.vml.officedrawing.STHrAlign.LEFT);
                        shapetype.setPath( "m,l,21600r21600,l21600,xe"); 
                    // Create object for shape (wrapped in JAXBElement) 
                    CTShape shape = vmlObjectFactory.createCTShape(); 
                    JAXBElement<org.docx4j.vml.CTShape> shapeWrapped = vmlObjectFactory.createShape(shape); 
                    pict.getAnyAndAny().add( shapeWrapped); 
                        // Create object for textbox (wrapped in JAXBElement) 
                        CTTextbox textbox = vmlObjectFactory.createCTTextbox(); 
                        JAXBElement<org.docx4j.vml.CTTextbox> textboxWrapped = vmlObjectFactory.createTextbox(textbox); 
                        shape.getEGShapeElements().add( textboxWrapped); 
                            // Create object for txbxContent
                            CTTxbxContent txbxcontent = wmlObjectFactory.createCTTxbxContent(); 
                            textbox.setTxbxContent(txbxcontent); 
                                // Create object for p
                                P p2 = wmlObjectFactory.createP(); 
                                txbxcontent.getContent().add( p2); 
                                    // Create object for pPr
                                    PPr ppr2 = wmlObjectFactory.createPPr(); 
                                    p2.setPPr(ppr2); 
                                        // Create object for rPr
                                        ParaRPr pararpr2 = wmlObjectFactory.createParaRPr(); 
                                        ppr2.setRPr(pararpr2); 
                                            // Create object for lang
                                            CTLanguage language2 = wmlObjectFactory.createCTLanguage(); 
                                            pararpr2.setLang(language2); 
                                                language2.setVal( "en-AU"); 
                                    // Create object for r
                                    R r2 = wmlObjectFactory.createR(); 
                                    p2.getContent().add( r2); 
                                        // Create object for rPr
                                        RPr rpr2 = wmlObjectFactory.createRPr(); 
                                        r2.setRPr(rpr2); 
                                            // Create object for lang
                                            CTLanguage language3 = wmlObjectFactory.createCTLanguage(); 
                                            rpr2.setLang(language3); 
                                                language3.setVal( "en-AU"); 
                                        // Create object for t (wrapped in JAXBElement) 
                                        Text text = wmlObjectFactory.createText(); 
                                        JAXBElement<org.docx4j.wml.Text> textWrapped = wmlObjectFactory.createRT(text); 
                                        r2.getContent().add( textWrapped); 
                                            text.setValue( "my text box"); 
                            textbox.setInsetmode(org.docx4j.vml.officedrawing.STInsetMode.CUSTOM);
                        shape.setStrokeweight( ".5pt"); 
                        shape.setFillcolor( "white [3201]"); 
                        shape.setConnectortype(org.docx4j.vml.officedrawing.STConnectorType.STRAIGHT);
                        shape.setVmlId( "Text Box 5"); 
                        shape.setStyle( "position:absolute;margin-left:39pt;margin-top:17.25pt;width:1in;height:1in;z-index:251659264;visibility:visible;mso-wrap-style:none;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;mso-position-horizontal:absolute;mso-position-horizontal-relative:text;mso-position-vertical:absolute;mso-position-vertical-relative:text;v-text-anchor:top"); 
                        shape.setSpid( "_x0000_s1026"); 
                        shape.setInsetmode(org.docx4j.vml.officedrawing.STInsetMode.CUSTOM);
                        shape.setHralign(org.docx4j.vml.officedrawing.STHrAlign.LEFT);
                        shape.setType( "#_x0000_t202"); 

        return p;
        }   

    public static P pOval() {

        P p = wmlObjectFactory.createP(); 

            // Create object for r
            R r = wmlObjectFactory.createR(); 
            p.getContent().add( r); 
                // Create object for rPr
                RPr rpr = wmlObjectFactory.createRPr(); 
                r.setRPr(rpr); 
                    // Create object for noProof
                    BooleanDefaultTrue booleandefaulttrue = wmlObjectFactory.createBooleanDefaultTrue(); 
                    rpr.setNoProof(booleandefaulttrue); 
                // Create object for pict (wrapped in JAXBElement) 
                Pict pict = wmlObjectFactory.createPict(); 
                JAXBElement<org.docx4j.wml.Pict> pictWrapped = wmlObjectFactory.createRPict(pict); 
                r.getContent().add( pictWrapped); 
        org.docx4j.vml.ObjectFactory vmlObjectFactory = new org.docx4j.vml.ObjectFactory();
                    // Create object for oval (wrapped in JAXBElement) 
                    CTOval oval = vmlObjectFactory.createCTOval(); 
                    JAXBElement<org.docx4j.vml.CTOval> ovalWrapped = vmlObjectFactory.createOval(oval); 
                    pict.getAnyAndAny().add( ovalWrapped); 
                        oval.setStrokecolor( "#243f60 [1604]"); 
                        oval.setStrokeweight( "2pt"); 
                        oval.setFillcolor( "#4f81bd [3204]"); 
                        oval.setConnectortype(org.docx4j.vml.officedrawing.STConnectorType.STRAIGHT);
                        oval.setVmlId( "Oval 6"); 
                        oval.setStyle( "position:absolute;margin-left:183.75pt;margin-top:19.75pt;width:103.5pt;height:105.75pt;z-index:251660288;visibility:visible;mso-wrap-style:square;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;mso-position-horizontal:absolute;mso-position-horizontal-relative:text;mso-position-vertical:absolute;mso-position-vertical-relative:text;v-text-anchor:middle"); 
                        oval.setSpid( "_x0000_s1026"); 
                        oval.setInsetmode(org.docx4j.vml.officedrawing.STInsetMode.CUSTOM);
                        oval.setHralign(org.docx4j.vml.officedrawing.STHrAlign.LEFT);

        return p;
        }

    public static P pRectangle() {


        P p = wmlObjectFactory.createP(); 
            // Create object for r
            R r = wmlObjectFactory.createR(); 
            p.getContent().add( r); 
                // Create object for rPr
                RPr rpr = wmlObjectFactory.createRPr(); 
                r.setRPr(rpr); 
                    // Create object for noProof
                    BooleanDefaultTrue booleandefaulttrue = wmlObjectFactory.createBooleanDefaultTrue(); 
                    rpr.setNoProof(booleandefaulttrue); 
                // Create object for pict (wrapped in JAXBElement) 
                Pict pict = wmlObjectFactory.createPict(); 
                JAXBElement<org.docx4j.wml.Pict> pictWrapped = wmlObjectFactory.createRPict(pict); 
                r.getContent().add( pictWrapped); 
        org.docx4j.vml.ObjectFactory vmlObjectFactory = new org.docx4j.vml.ObjectFactory();
                    // Create object for rect (wrapped in JAXBElement) 
                    CTRect rect = vmlObjectFactory.createCTRect(); 
                    JAXBElement<org.docx4j.vml.CTRect> rectWrapped = vmlObjectFactory.createRect(rect); 
                    pict.getAnyAndAny().add( rectWrapped); 
                        rect.setStrokecolor( "#243f60 [1604]"); 
                        rect.setStrokeweight( "2pt"); 
                        rect.setFillcolor( "#4f81bd [3204]"); 
                        rect.setConnectortype(org.docx4j.vml.officedrawing.STConnectorType.STRAIGHT);
                        rect.setVmlId( "Rectangle 8"); 
                        rect.setStyle( "position:absolute;margin-left:48.75pt;margin-top:13.85pt;width:115.5pt;height:54pt;z-index:251661312;visibility:visible;mso-wrap-style:square;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;mso-position-horizontal:absolute;mso-position-horizontal-relative:text;mso-position-vertical:absolute;mso-position-vertical-relative:text;v-text-anchor:middle"); 
                        rect.setSpid( "_x0000_s1026"); 
                        rect.setInsetmode(org.docx4j.vml.officedrawing.STInsetMode.CUSTOM);
                        rect.setHralign(org.docx4j.vml.officedrawing.STHrAlign.LEFT);

        return p;
        }   

    public static P pRectangleViaXML() throws JAXBException {

        String openXML = "<w:p xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:o=\"urn:schemas-microsoft-com:office:office\">"
                + "<w:pPr>"
                    + "<w:rPr>"
                        + "<w:lang w:val=\"en-AU\"/>"
                    +"</w:rPr>"
                +"</w:pPr>"
                + "<w:r>"
                    + "<w:rPr>"
                        + "<w:noProof/>"
                    +"</w:rPr>"
                    + "<w:pict>"
                        + "<v:rect fillcolor=\"#4f81bd [3204]\" id=\"Rectangle 8\"  o:spid=\"_x0000_s1026\" strokecolor=\"#243f60 [1604]\" strokeweight=\"2pt\" style=\"position:absolute;margin-left:48.75pt;margin-top:13.85pt;width:115.5pt;height:54pt;z-index:251661312;visibility:visible;mso-wrap-style:square;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;mso-position-horizontal:absolute;mso-position-horizontal-relative:text;mso-position-vertical:absolute;mso-position-vertical-relative:text;v-text-anchor:middle\"/>"
                    +"</w:pict>"
                +"</w:r>"
            +"</w:p>";

        return (P)XmlUtils.unmarshalString(openXML);    
    }
}
import javax.xml.bind.JAXBElement;
导入javax.xml.bind.JAXBException;
导入org.docx4j.XmlUtils;
导入org.docx4j.jaxb.Context;
导入org.docx4j.openpackaging.packages.WordprocessingMLPackage;
导入org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
导入org.docx4j.vml.CTOval;
导入org.docx4j.vml.CTPath;
导入org.docx4j.vml.CTRect;
导入org.docx4j.vml.CTShape;
导入org.docx4j.vml.CTShapetype;
导入org.docx4j.vml.CTStroke;
导入org.docx4j.vml.CTTextbox;
导入org.docx4j.wml.BooleanDefaultTrue;
导入org.docx4j.wml.CTLanguage;
导入org.docx4j.wml.CTTxbxContent;
导入org.docx4j.wml.P;
导入org.docx4j.wml.PPr;
导入org.docx4j.wml.ParaRPr;
导入org.docx4j.wml.Pict;
导入org.docx4j.wml.R;
导入org.docx4j.wml.RPr;
导入org.docx4j.wml.Text;
公共类图片演示{
静态org.docx4j.wml.ObjectFactory wmlObjectFactory=Context.getWmlObjectFactory();
公共静态void main(字符串[]args)引发异常{
WordprocessingMLPackage wordMLPackage=WordprocessingMLPackage.createPackage();
MainDocumentPart mdp=wordMLPackage.getMainDocumentPart();
mdp.getContent().add(pTextBox());
mdp.getContent().add(pOval());
//mdp.getContent().add(pRectangle());
mdp.getContent().add(xml());
//打印主文档部分
System.out.println(
marshaltoString(mdp.getJaxbElement(),true,true));
字符串文件名=System.getProperty(“user.dir”)+“/OUT_PictDemo.docx”;
保存(新的java.io.File(文件名));
}
公共静态pTextBox(){
P=wmlObjectFactory.createP();
//为r创建对象
R=wmlObjectFactory.createR();
p、 getContent().add(r);
//为rPr创建对象
RPr RPr=wmlObjectFactory.createRPr();
r、 setRPr(rpr);
//为屋顶创建对象
BooleanDefaultTrue BooleanDefaultTrue=wmlObjectFactory.createBooleanDefaultTrue();
rpr.setNoProof(booleandefaulttrue);
//为pict创建对象(包装在JAXBELENT中)
Pict Pict=wmlObjectFactory.createPict();
JAXBElement pictWrapped=wmlObjectFactory.createRPict(pict);
r、 getContent().add(pictWrapped);
org.docx4j.vml.ObjectFactory vmlObjectFactory=new org.docx4j.vml.ObjectFactory();
//为shapetype创建对象(包装在JAXBElement中)
CTShapetype shapetype=vmlObjectFactory.createCTShapetype();
JAXBElement shapetypeWrapped=vmlObjectFactory.createShapetype(shapetype);
pict.getAnyAndAny().add(shapetypeWrapped);
//为笔划创建对象(包装在JAXBELENT中)
CTStroke stroke=vmlObjectFactory.createCTStroke();
JAXBElement strokeWrapped=vmlObjectFactory.createStroke(stroke);
shapetype.getEGShapeElements().add(strokeWrapped);
setJoinstyle(org.docx4j.vml.STStrokeJoinStyle.MITER);
//为路径创建对象(包装在JAXBELENT中)
CTPath path=vmlObjectFactory.createCTPath();
JAXBElement-pathWrapped=vmlObjectFactory.createPath(路径);
shapetype.getEGShapeElements().add(路径包裹);
setGradientshapeok(org.docx4j.vml.STTrueFalse.T);
setConnecttype(org.docx4j.vml.officedrawing.STConnectType.RECT);
shapetype.setCoordsize(“2160021600”);
shapetype.setSpt(新浮点数(202.0));
setConnectortype(org.docx4j.vml.officedrawing.STConnectorType.STRAIGHT);
shapetype.setVmlId(“\ux0000\ut202”);
setInsetmode(org.docx4j.vml.officedrawing.STInsetMode.CUSTOM);
setHralign(org.docx4j.vml.officedrawing.STHrAlign.LEFT);
setPath(“m,l,21600r21600,l21600,xe”);
//为形状创建对象(用JAXBELENT包装)
CTShape=vmlObjectFactory.createCTShape();
JAXBElement shapeWrapped=vmlObjectFactory.createShape(shape);
pict.getAnyAndAny().add(shapeWrapped);
//为textbox创建对象(包装在JAXBElement中)
CTTextbox textbox=vmlObjectFactory.createCTTextbox();
JAXBElement textboxWrapped=vmlObjectFactory.createTextbox(textbox);
shape.getEGShapeElements().add(textboxWrapped);
//为txbxContent创建对象
CTTxbxContent txbxcontent=wmlObjectFactory.createctxbxcontent();
textbox.setTxbxContent(txbxcontent);
//为p创建对象
p2=wmlObjectFactory.createP();
txbxcontent.getContent().add(p2);
//创建对象