我可以将 CustomXmlPart 添加到我的演示文稿而不将其 XML 存储在文件中吗?
Can I add a CustomXmlPart to my presentation without storing the XML for it in a file?
TLDR; 请确认第二个代码片段是创建 CustomXmlPart 的公认方法,或者告诉我另一种不那么乏味的方法.
所以我尝试将一些应用程序数据嵌入到我正在使用 OpenXmlSDK.
修改的 .pptx 中的某些元素中
为了简要说明,我需要将图表代码嵌入到演示文稿中加载的每个图像中。这样可以重新上传演示文稿并再次生成图表,然后使用最新数据替换。
最初我在 OpenXmlElement 本身上使用 Extended Attributes:
//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 部分之前动态填充每张幻灯片的内容。
似乎只是为了添加一个小的自定义属性而做了大量的工作。但是我还没有找到任何替代方法。
任何人都可以确认这确实是我应该做的方式,或者指出另一个方向吗?非常感谢。
答案是肯定的! :)
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;
}
您也可以尝试 custom properties。自定义 XML 文件适用于复杂的对象,听起来您只需要存储简单的信息。
TLDR; 请确认第二个代码片段是创建 CustomXmlPart 的公认方法,或者告诉我另一种不那么乏味的方法.
所以我尝试将一些应用程序数据嵌入到我正在使用 OpenXmlSDK.
修改的 .pptx 中的某些元素中为了简要说明,我需要将图表代码嵌入到演示文稿中加载的每个图像中。这样可以重新上传演示文稿并再次生成图表,然后使用最新数据替换。
最初我在 OpenXmlElement 本身上使用 Extended Attributes:
//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 部分之前动态填充每张幻灯片的内容。
似乎只是为了添加一个小的自定义属性而做了大量的工作。但是我还没有找到任何替代方法。
任何人都可以确认这确实是我应该做的方式,或者指出另一个方向吗?非常感谢。
答案是肯定的! :)
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;
}
您也可以尝试 custom properties。自定义 XML 文件适用于复杂的对象,听起来您只需要存储简单的信息。