0

TLDR;请确认第二个代码片段是创建CustomXmlPart的公认方法,或者向我展示另一种不那么乏味的方法。


所以我试图在我正在使用OpenXmlSDK修改的 .pptx 中的一些元素中嵌入一些应用程序数据。

简单解释一下,我需要在加载到演示文稿中的每个图像中嵌入一个图表代码。这样可以重新上传演示文稿并再次生成图表,然后使用最新数据进行替换。

最初我在OpenXmlElement本身上使用扩展属性:

//OpenXmlDrawing = DocumentFormat.OpenXml.Drawing

// there's only one image per slide for now, so I just grab the blip which contains the image
OpenXmlDrawing.Blip blip = slidePart.Slide.Descendants<OpenXmlDrawing.Blip>().FirstOrDefault(); 

//then apply the attribute
blip.SetAttribute(new OpenXmlAttribute("customAttribute", null, customAttributeValue));

问题在于,在 PowerPoint 2013 中编辑 .pptx 时,它会删除所有扩展属性。

所以。 我现在在多个地方读到解决方案是使用 CustomXmlPart。所以我试图找到如何做到这一点.. 看起来它需要我为每个 CustomXmlPart 提供一个单独的文件才能输入到部件中。前任/

var customXmlPart = slidePart.AddCustomXmlPart(CustomXmlPartType.CustomXml);

using (FileStream stream = new FileStream(fileName, FileMode.Open))
{
    customXmlPart.FeedData(stream);
}

^ 并且需要为每个 CustomXmlPart 使用不同的文件重复此操作。这意味着我可能只需要一个包含骨架自定义 XML 部件的模板文件,然后在将其输入自定义 xml 部件之前为每张幻灯片动态填充其内容。

仅仅添加一个小自定义属性似乎需要做很多工作。但是我还没有找到任何替代方法。

任何人都可以确认这确实是我应该这样做的方式,还是将我指向另一个方向?非常感激。

4

2 回答 2

1

答案是肯定的!:)

public class CustomXMLPropertyClass
{
    public string PropertyName { get; set; }
    public string PropertyValue { get; set; }
}

private static void AddCustomXmlPartCustomPropertyToSlidePart(string propertyName, string propertyValue, SlidePart part)
{
    var customXmlPart = part.AddCustomXmlPart(CustomXmlPartType.CustomXml);

    var customProperty = new CustomXMLPropertyClass{ PropertyName = propertyName, PropertyValue = propertyValue };


    var serializer = new System.Xml.Serialization.XmlSerializer(customProperty.GetType());
    var stream = new MemoryStream();

    serializer.Serialize(stream, customProperty);

    var customXml = System.Text.Encoding.UTF8.GetString(stream.ToArray());

    using ( var streamWriter = new StreamWriter(customXmlPart.GetStream()))
    {
        streamWriter.Write(customXml);
        streamWriter.Flush();
    }
}

然后把它拿回来:

private static string GetCustomXmlPropertyFromCustomXmlPart(CustomXmlPart customXmlPart)
{
    var customXmlProperty = new CustomXMLPropertyClass();
    string xml = "";

    using (var stream = customXmlPart.GetStream())
    {
        var streamReader = new StreamReader(stream);
        xml = streamReader.ReadToEnd();
    }

    using (TextReader reader = new StringReader(xml))
    {
        var serializer = new System.Xml.Serialization.XmlSerializer(typeof(customXmlProperty));
        customXmlProperty = (CustomXMLPropertyClass)serializer.Deserialize(reader);
    }

    var customPropertyValue = customXmlProperty.PropertyValue;

    return customPropertyValue;
}
于 2018-06-13T22:03:55.023 回答
0

您也可以尝试自定义属性。自定义 XML 文件适用于复杂的对象,听起来您只需要存储简单的信息。

于 2018-08-08T19:27:55.173 回答