Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从数据库加载二进制文件并将其作为openxml处理_C#_.net_Stream_Openxml_Memorystream - Fatal编程技术网

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

C# 从数据库加载二进制文件并将其作为openxml处理,c#,.net,stream,openxml,memorystream,C#,.net,Stream,Openxml,Memorystream,我有这样一种方法,可以从存储为二进制的数据库加载文档文件,然后用参数替换customxml部分 不知何故,当我将字节转换为MemoryStream然后处理它时,它不起作用,我的自定义xml部分并没有被替换。但若我使用FileStream并从磁盘读取相同的文件,那个么它将被完美地替换 MemoryStream有什么问题?我也不能将MemoryStream强制转换为FileStream或创建instrance of Stream等。。 有什么建议吗 private static Stream L

我有这样一种方法,可以从存储为二进制的数据库加载文档文件,然后用参数替换customxml部分

不知何故,当我将字节转换为MemoryStream然后处理它时,它不起作用,我的自定义xml部分并没有被替换。但若我使用FileStream并从磁盘读取相同的文件,那个么它将被完美地替换

MemoryStream有什么问题?我也不能将MemoryStream强制转换为FileStream或创建instrance of 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;
    }

在向memorystream写入数据之后,在再次读取之前,您可能希望尝试将memorystream的“Position”属性设置为0

另外,您还可以将字节数组传递给memorystream的构造函数,而不是调用writer

编辑

根据MSDN,我看到“Document.Save”方法将刷新流以允许propper保存。( ). 然而,MemoryStream在flush()上不会做任何事情


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

我已经尝试了这两个建议,位置没有帮助,还有一件事,如果我使用filestream从磁盘获取文件,然后复制到MemoryStream,则无法再次使用!是-需要调用Document.Save(),然后调用Flush(),然后将位置设置为0。