如何从PresentationDocument对象获取字节数组或流

罗伯特·哈维

我有将Office文件切片和切块的Open Office XML代码。

由于Open XML SDK的性质,此代码中的许多代码可以读写文件系统上的文件。目的是完全消除这些临时文件,并用字节数组和/或内存中的流替换它们。

其中一些代码将来自不同幻灯片源的PowerPoint合并在一起。此代码的示例如下。想象一个包含PowerPoint演示文稿的数据库。PmlDocument是Open XML Power Tools中的类:

foreach (var item in database)
{
    var openXmlDocument = new OpenXmlPowerToolsDocument(item.data);
    var document = new PmlDocument(openXmlDocument);
    sources.Add(new SlideSource(document, false));
}

PmlDocument newDocument = PresentationBuilder.BuildPresentation(sources);
byte[] data = newDocument.DocumentByteArray;

其中byte[] data代表一个新的PowerPoint PPTX,然后可以将其保存回数据库。

这段代码工作得很好,因为在此示例中我已经在使用字节数组。当我必须处理PresentationDocument对象时,就会出现问题我们的程序中已经使用这些对象进行了大量处理,而从此类对象获取字节数组的当前方法是执行以下操作:

presentationDocument.SaveAs(fileName);
byte[] array = File.ReadAllBytes(fileName);

这不是我想要的。

不幸的是,似乎没有更好的方法从中提取字节PresentationDocument有谁知道如何在内存中执行此操作,也许是使用MemoryStream对象?

注意:我已阅读《OfficeTalk:使用内存中打开XML文档》,但它似乎假定您已经具有正确文档格式的字节数组。

一般

这里查看源代码PresentationDocument继承自OpenXmlPackage哪个SaveAs方法实现的方法,并在随后执行时最终调用:

/// <summary>
/// Creates a clone of this OpenXml package, opened on the given stream.
/// The cloned OpenXml package is opened with the same settings, i.e.,
/// FileOpenAccess and OpenSettings, as this OpenXml package.
/// </summary>
/// <param name="stream">The IO stream on which to open the OpenXml package.</param>
/// <returns>The cloned OpenXml package.</returns>
public OpenXmlPackage Clone(Stream stream)`

最后,这只是将复制OpenXmlPartstream

using (OpenXmlPackage clone = CreateClone(stream))
{
     foreach (var part in Parts)
     {
         clone.AddPart(part.OpenXmlPart, part.RelationshipId);
     }
}

当您知道它的存在时,您最终可以在文档中找到它

总之,这使您无需直接归档就可以直接保存到字节中

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章