C# 我可以将CustomXmlPart添加到演示文稿中而不将其XML存储在文件中吗?

C# 我可以将CustomXmlPart添加到演示文稿中而不将其XML存储在文件中吗?,c#,.net,powerpoint,openxml,openxml-sdk,C#,.net,Powerpoint,Openxml,Openxml Sdk,TLDR请确认第二个代码snippit是创建CustomXmlPart的公认方法,或者向我展示另一个不那么繁琐的方法 因此,我试图在.pptx中的一些元素中嵌入一些应用程序数据,我正在使用OpenXmlSDK修改这些元素 为了简单地解释一下,我需要在加载到演示文稿中的每个图像中嵌入一个图表代码。这样,演示文稿可以重新上传,图表可以再次生成,然后使用最新数据替换 最初,我在OpenXmlElement本身上使用了扩展属性: //OpenXmlDrawing = DocumentFormat.Op

TLDR请确认第二个代码snippit是创建CustomXmlPart的公认方法,或者向我展示另一个不那么繁琐的方法


因此,我试图在.pptx中的一些元素中嵌入一些应用程序数据,我正在使用OpenXmlSDK修改这些元素

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

最初,我在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));
^对于每个CustomXmlPart,需要使用不同的文件重复这一过程。这意味着我可能只需要有一个包含框架自定义XML部分的模板文件,然后在将其输入自定义XML部分之前,为每个幻灯片动态填充其内容

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

谁能证实这确实是我应该做的事情,或者给我指出另一个方向?非常感谢。

答案是肯定的!:)

然后把它拿出来:

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;
}

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

注意:使用此方法,PowerPoint 2013仍会删除更改,因此,我正在努力让它们在编辑演示文稿时保持不变。这里是我打开的另一个问题,试图解决自定义数据被擦除的问题。
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;
}