从数据库加载二进制文件并将其处理为 openxml
本文关键字:处理 openxml 数据库 加载 二进制文件 | 更新日期: 2023-09-27 17:57:10
我有这样的方法可以从存储为二进制的数据库加载文档文件,然后用参数替换自定义xml部分。
不知何故,当我将字节转换为 MemoryStream 然后处理它不起作用时,我的自定义 xml 部分不会被替换。但是,如果我使用 FileStream 并从磁盘读取相同的文件,那么它就会完美地替换!
MemoryStream有什么问题? 我也不能将MemoryStream转换为FileStream或创建Stream等。有什么建议吗?
private static Stream LoadContent(byte[] content, XmlDocument parameters)
{
//FileStream works perfectly
//Stream fileStream = new FileStream(@"C:'temp'test.docx", FileMode.Open);
Stream documentStream = new MemoryStream();
documentStream.Write(content, 0, content.Length);
//Processes word file, replace custom xml parts with parameters
using (WordprocessingDocument document = WordprocessingDocument.Open(documentStream, true))
{
MainDocumentPart mainPart = document.MainDocumentPart;
Stream partStream = mainPart.CustomXmlParts.First().GetStream();
using (XmlWriter xmlWriter = XmlWriter.Create(partStream, new XmlWriterSettings { CloseOutput = false }))
{
parameters.WriteTo(xmlWriter);
xmlWriter.Flush();
}
mainPart.Document.Save();
}
return documentStream;
}
您可能希望在将数据写入内存流后和再次读取之前尝试将内存流的"位置"属性设置为 0。
通常,您也可以将字节数组传递给内存流的构造函数,而不是调用编写器。
编辑
根据MSDN,我看到"Document.Save"方法将刷新流以允许保存。(http://msdn.microsoft.com/en-us/library/cc840441.aspx)。但是,MemoryStream 不会在刷新时执行任何操作 (http://msdn.microsoft.com/en-us/library/system.io.memorystream.flush.aspx )。
您可以尝试创建一个新的 MemoryStream,然后将其作为参数传递给"Document.Save"方法。