【问题标题】:How to insert a shape in a powerpoint slide using OpenXML如何使用 OpenXML 在 powerpoint 幻灯片中插入形状
【发布时间】:2013-09-15 07:31:12
【问题描述】:

这个问题看起来很基础,但是如何在 c# 中使用 OpenXML 在幻灯片中插入形状(即矩形)?

我四处搜索,我看到的只是“创建一个带有形状的幻灯片并使用 SDK Productivity Tool 来反映代码。这并没有真正的帮助:(

【问题讨论】:

    标签: c# openxml openxml-sdk


    【解决方案1】:

    在我的头撞墙一段时间后,最后我接受了建议,创建了一个带有形状的幻灯片并使用该工具来反映代码。因此,对于下一代,这里简要说明如何手工操作。

    首先你必须知道一个形状被插入到一个 ShapeTree 中,它是 CommonSlideData 的一部分:

    Slide s = GetDesiredSlide(); // Get the slide where you want to insert the shape.
    s.CommonSlideData.ShapeTree.Append(GenerateShape());
    

    第二个你应该知道的是,一个形状必须包含至少 4 个描述其行为的孩子:

    • ShapeStyle 对象
    • ShapeProperties 对象
    • TextBody 对象
    • 一个 NonVisualShapeProperties

    在下面的示例代码中,我使用了以下命名空间和变量:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using DocumentFormat.OpenXml;
    using DocumentFormat.OpenXml.Packaging;
    using DocumentFormat.OpenXml.Presentation;
    using D = DocumentFormat.OpenXml.Drawing;
    
    D.ShapeTypeValues shapeType; // Any of the built-in shapes (ellipse, rectangle, etc)
    string rgbColorHex; // Hexadecimal RGB color code to fill the shape.
    long x; // Represents the shape x position in 1/36000 cm.
    long y; // Represents the shape y position in 1/36000 cm.
    long width; // Shapw width in in 1/36000 cm.
    long heigth;// Shapw heigth in in 1/36000 cm.
    

    ShapeStyle 对象

    形状样式对象描述一般形状样式属性,如边框、填充样式、文本字体和视觉效果(阴影等)

    ShapeStyle shapeStyle1 = new ShapeStyle();
    
    D.LineReference lineReference1 = new D.LineReference() { Index = (UInt32Value)2U };
    
    D.SchemeColor schemeColor2 = new D.SchemeColor() { Val = D.SchemeColorValues.Accent1 };
    D.Shade shade1 = new D.Shade() { Val = 50000 };
    
    schemeColor2.Append(shade1);
    
    lineReference1.Append(schemeColor2);
    
    D.FillReference fillReference1 = new D.FillReference() { Index = (UInt32Value)1U };
    D.SchemeColor schemeColor3 = new D.SchemeColor() { Val = D.SchemeColorValues.Accent1 };
    
    fillReference1.Append(schemeColor3);
    
    D.EffectReference effectReference1 = new D.EffectReference() { Index = (UInt32Value)0U };
    D.SchemeColor schemeColor4 = new D.SchemeColor() { Val = D.SchemeColorValues.Accent1 };
    
    effectReference1.Append(schemeColor4);
    
    D.FontReference fontReference1 = new D.FontReference() { Index = D.FontCollectionIndexValues.Minor };
    D.SchemeColor schemeColor5 = new D.SchemeColor() { Val = D.SchemeColorValues.Light1 };
    
    fontReference1.Append(schemeColor5);
    
    shapeStyle1.Append(lineReference1);
    shapeStyle1.Append(fillReference1);
    shapeStyle1.Append(effectReference1);
    shapeStyle1.Append(fontReference1);
    

    形状属性

    定义形状的视觉属性,如填充方法(实体、渐变等)几何形状(大小、位置、翻转、旋转)填充和轮廓。

    ShapeProperties shapeProperties1 = new ShapeProperties();
    
    D.Transform2D transform2D1 = new D.Transform2D();
    D.Offset offset1 = new D.Offset() { X = x, Y = y };
    D.Extents extents1 = new D.Extents() { Cx = width, Cy = heigth };
    
    transform2D1.Append(offset1);
    transform2D1.Append(extents1);
    
    D.PresetGeometry presetGeometry1 = new D.PresetGeometry() { Preset = shapeType };
    D.AdjustValueList adjustValueList1 = new D.AdjustValueList();
    
    presetGeometry1.Append(adjustValueList1);
    
    D.SolidFill solidFill1 = new D.SolidFill();
    D.RgbColorModelHex rgbColorModelHex1 = new D.RgbColorModelHex() { Val = rgbColorHex };
    
    solidFill1.Append(rgbColorModelHex1);
    
    D.Outline outline1 = new D.Outline() { Width = 12700 };
    
    D.SolidFill solidFill2 = new D.SolidFill();
    D.SchemeColor schemeColor1 = new D.SchemeColor() { Val = D.SchemeColorValues.Text1 };
    
    solidFill2.Append(schemeColor1);
    
    outline1.Append(solidFill2);
    
    shapeProperties1.Append(transform2D1);
    shapeProperties1.Append(presetGeometry1);
    shapeProperties1.Append(solidFill1);
    shapeProperties1.Append(outline1);
    

    文本正文

    定义文本框属性,如列数、对齐方式、锚定等。

    TextBody textBody1 = new TextBody();
    D.BodyProperties bodyProperties1 = new D.BodyProperties() { RightToLeftColumns = false, Anchor = D.TextAnchoringTypeValues.Center };
    D.ListStyle listStyle1 = new D.ListStyle();
    
    D.Paragraph paragraph1 = new D.Paragraph();
    D.ParagraphProperties paragraphProperties1 = new D.ParagraphProperties() { Alignment = D.TextAlignmentTypeValues.Center };
    D.EndParagraphRunProperties endParagraphRunProperties1 = new D.EndParagraphRunProperties() { Language = "es-ES" };
    
    paragraph1.Append(paragraphProperties1);
    paragraph1.Append(endParagraphRunProperties1);
    
    textBody1.Append(bodyProperties1);
    textBody1.Append(listStyle1);
    textBody1.Append(paragraph1);
    

    NonVisualShapeProperties

    定义非可视属性,例如名称和 ID。

    NonVisualShapeProperties nonVisualShapeProperties1 = new NonVisualShapeProperties();
    NonVisualDrawingProperties nonVisualDrawingProperties1 = new NonVisualDrawingProperties() { Id = (UInt32Value)4U, Name = "1 Shape Name" };
    NonVisualShapeDrawingProperties nonVisualShapeDrawingProperties1 = new NonVisualShapeDrawingProperties();
    ApplicationNonVisualDrawingProperties applicationNonVisualDrawingProperties1 = new ApplicationNonVisualDrawingProperties();
    
    nonVisualShapeProperties1.Append(nonVisualDrawingProperties1);
    nonVisualShapeProperties1.Append(nonVisualShapeDrawingProperties1);
    nonVisualShapeProperties1.Append(applicationNonVisualDrawingProperties1);
    

    综合起来

    最后你必须创建形状对象并将这些属性附加到它:

    Shape shape1 = new Shape();
    shape1.Append(nonVisualShapeProperties1);
    shape1.Append(shapeProperties1);
    shape1.Append(shapeStyle1);
    shape1.Append(textBody1);
    

    然后,将形状添加到幻灯片的形状树中:

    s.CommonSlideData.ShapeTree.Append(shape1);
    

    【讨论】:

    • 干得好,伙计!这似乎是一个好的开始。 msdn 方面的例子和解释很少,我有上千个关于机制的问题。但我认为每个人都需要以自己的方式找到它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2017-05-08
    • 1970-01-01
    • 2018-12-15
    相关资源
    最近更新 更多