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