从db加载二进制文件并将其作为openxml处理

时间:2011-05-22 22:14:20

标签: c# .net stream openxml memorystream

我有这样的方法从db加载文档文件,存储为二进制文件,然后用参数替换customxml部分。

不知何故,当我将字节转换为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;
    }

1 个答案:

答案 0 :(得分:0)

您可能想要在将数据写入数据库之后以及再次读取之前将内存流的“位置”属性设置为0。

您也可以将字节数组传递给内存流的构造函数,而不是调用writer。

修改

根据MSDN,我看到'Document.Save'方法将刷新流以允许propper save。 (http://msdn.microsoft.com/en-us/library/cc840441.aspx)。 但是MemoryStream在flush(http://msdn.microsoft.com/en-us/library/system.io.memorystream.flush.aspx)上不会做任何事情。

您可以尝试创建一个新的MemoryStream,然后将其作为参数传递给'Document.Save'方法。