从数据库加载二进制文件并将其处理为 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;
    }

从数据库加载二进制文件并将其处理为 openxml

您可能希望在将数据写入内存流后和再次读取之前尝试将内存流的"位置"属性设置为 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"方法。