首页 > 解决方案 > 为什么添加 w:drawing 会导致文件损坏

问题描述

我正在尝试使用 docx4j 将图表添加到 docx 文件中。我在 Word 中生成了我想要的内容,并且在 docx4j webapp 的帮助下,我能够获得相应的 java 代码。不幸的是,据说生成的 docx 文件已被 Word 损坏。在尝试调试时,我意识到如果我注释掉将绘图添加到运行中的行,文件就会变得可读。我不知道出了什么问题。下面是我的代码和我试图重现http://www.filedropper.com/graphique的链接。我正在使用 docx4j 8.2 和 office 2016

            Chart chartPart = new Chart();
            Relationship chartRelationship = wordMLPackage.getMainDocumentPart().addTargetPart(chartPart);
            chartPart.setJaxbElement(ChartSpace.createChartSpace());                
            
            
            DefaultXmlPart colorPart = new DefaultXmlPart(new PartName("/word/charts/colors1.xml"));            
            colorPart.setContentType(new ContentType("application/vnd.ms-office.chartcolorstyle+xml"));
            colorPart.setRelationshipType("http://schemas.microsoft.com/office/2011/relationships/chartColorStyle");
            chartPart.addTargetPart(colorPart);
            colorPart.setDocument(new FileInputStream(new File("colors1.xml")));
            
            
            DefaultXmlPart stylePart = new DefaultXmlPart(new PartName("/word/charts/style1.xml"));         
            stylePart.setContentType(new ContentType("application/vnd.ms-office.chartstyle+xml"));
            stylePart.setRelationshipType("http://schemas.microsoft.com/office/2011/relationships/chartStyle");
            chartPart.addTargetPart(stylePart);         
            stylePart.setDocument(new FileInputStream(new File("style1.xml")));
             

            EmbeddedPackagePart embeddedPackagePart = new EmbeddedPackagePart(
                    new PartName("/word/embeddings/Microsoft_Excel_Worksheet.xlsx"));
            
            embeddedPackagePart.setContentType(
                    new ContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"));
            chartPart.addTargetPart(embeddedPackagePart);
            embeddedPackagePart.setBinaryData(new java.io.FileInputStream(new File("data.xlsx")));
            

            mainDocumentPart.getContent().add(addGraphic(factory, chartRelationship.getId()));

            
public static P addGraphic(ObjectFactory factory, String chartId) throws JAXBException {
        P p = factory.createP();
        // Create object for r
        R r = factory.createR();
        p.getContent().add(r);
        // Create object for drawing (wrapped in JAXBElement)
        Drawing drawing = factory.createDrawing();
        JAXBElement<org.docx4j.wml.Drawing> drawingWrapped = factory.createRDrawing(drawing);
        r.getContent().add(drawingWrapped);
        org.docx4j.dml.wordprocessingDrawing.ObjectFactory dmlwordprocessingDrawingObjectFactory = new org.docx4j.dml.wordprocessingDrawing.ObjectFactory();
        // Create object for inline
        Inline inline = dmlwordprocessingDrawingObjectFactory.createInline();
        drawing.getAnchorOrInline().add(inline);
        org.docx4j.dml.ObjectFactory dmlObjectFactory = new org.docx4j.dml.ObjectFactory();
        // Create object for graphic
        Graphic graphic = dmlObjectFactory.createGraphic();
        inline.setGraphic(graphic);
        // Create object for graphicData
        GraphicData graphicdata = dmlObjectFactory.createGraphicData();
        graphic.setGraphicData(graphicdata);
        graphicdata.setUri("http://schemas.openxmlformats.org/drawingml/2006/chart");       
        org.docx4j.dml.chart.ObjectFactory dmlchartObjectFactory = new org.docx4j.dml.chart.ObjectFactory();
        // Create object for chart (wrapped in JAXBElement)
        CTRelId relid = dmlchartObjectFactory.createCTRelId();
        JAXBElement<org.docx4j.dml.chart.CTRelId> relidWrapped = dmlchartObjectFactory.createChart(relid);
        graphicdata.getAny().add(relidWrapped);
        relid.setId(chartId);
        // Create object for cNvGraphicFramePr
        CTNonVisualGraphicFrameProperties nonvisualgraphicframeproperties = dmlObjectFactory
                .createCTNonVisualGraphicFrameProperties();
        inline.setCNvGraphicFramePr(nonvisualgraphicframeproperties);
        // Create object for extent
        CTPositiveSize2D positivesize2d = dmlObjectFactory.createCTPositiveSize2D();
        inline.setExtent(positivesize2d);
        positivesize2d.setCx(5486400);
        positivesize2d.setCy(3200400);
        // Create object for effectExtent
        CTEffectExtent effectextent = dmlwordprocessingDrawingObjectFactory.createCTEffectExtent();
        inline.setEffectExtent(effectextent);
        effectextent.setB(0);
        effectextent.setL(0);
        effectextent.setT(0);
        effectextent.setR(0);
        // Create object for docPr
        CTNonVisualDrawingProps nonvisualdrawingprops = dmlObjectFactory.createCTNonVisualDrawingProps();
        inline.setDocPr(nonvisualdrawingprops);
        nonvisualdrawingprops.setDescr("");
        nonvisualdrawingprops.setName("Graphique 1");
        nonvisualdrawingprops.setId(1);
        inline.setDistT(Long.valueOf(0));
        inline.setDistB(Long.valueOf(0));
        inline.setDistL(Long.valueOf(0));
        inline.setDistR(Long.valueOf(0));
        // Create object for rPr
        RPr rpr = factory.createRPr();
        r.setRPr(rpr);
        // Create object for noProof
        BooleanDefaultTrue booleandefaulttrue = factory.createBooleanDefaultTrue();
        rpr.setNoProof(booleandefaulttrue);
        return p;
    }

标签: docx4j

解决方案


推荐阅读