【问题标题】:Loading binary file from db and process it as openxml从 db 加载二进制文件并将其作为 openxml 处理
【发布时间】:2011-05-22 22:14:19
【问题描述】:

我有这样的方法来从存储为二进制的 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;
    }

【问题讨论】:

    标签: c# .net stream openxml memorystream


    【解决方案1】:

    在向内存流写入数据之后,再次读取之前,您可能想尝试将内存流的“位置”属性设置为 0。

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

    编辑

    根据 MSDN,我看到“Doc​​ument.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”方法。

    【讨论】:

    • 我已经尝试了这两个建议,位置没有帮助,如果我使用文件流并从磁盘获取文件然后复制到内存流又不能工作了!
    • 是的 - 你需要调用 Document.Save(),然后 Flush(),然后将位置设置为 0。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多