【问题标题】:Using MemoryStream to write .docx file on remote location c#使用 MemoryStream 在远程位置 c# 上写入 .docx 文件
【发布时间】:2019-04-01 12:35:10
【问题描述】:

我正在从字符串生成 MemoryStream 并将其传递给另一个方法,该方法将以 .docx 文件的形式将该 Stream 保存在远程位置。

public static MemoryStream GenerateStreamFromString(string s)
{
    MemoryStream stream = new MemoryStream();
    StreamWriter writer = new StreamWriter(stream);
    writer.Write(s);
    writer.Flush();
    stream.Position = 0;
    return stream;
}

以上代码用于将字符串转换为 MemoryStream。我传递给上述方法的字符串是通过Globals.ThisAddIn.Application.ActiveDocument.WordOpenXML 行获得的XML。

文件已成功上传到远程位置,但当我下载该文件时,MS Word 会抛出 File is corrupted. Either part of file is missing or invalid 的错误(如下图所示)

我无法确定我生成的流是否错误/损坏,或者我需要执行更多操作以使此.docx 文件有效?

抱歉这个问题,有很多这样的问题,但没有一个比这更有帮助。

【问题讨论】:

  • 之后你检查过文件的内容吗?您确定将该字符串保存为 docx 文件并期望它能够正常工作是有效的吗?
  • @JonSkeet 我认为这将是保存 docx 文件的方法。纠正我如果我错了,还有其他方法可以执行此任务吗?
  • "我认为这将是保存 docx 文件的方法。"我会检查这个假设。 (当然,docx 文件通常不仅仅是纯文本 XML 文件。)
  • @JonSkeet 那么,我是否必须临时保存文件并读取该文件并将其传递给流,这是我可以解决此问题的最佳方法吗?
  • 读这个,和你做的差不多:blogs.msdn.microsoft.com/mcsuksoldev/2010/04/09/…

标签: c# interop memorystream word-addins


【解决方案1】:

以这种方式传递的 XML 不是有效的 DOCX 文件。实际的 DOCX 格式使用带有文件夹的压缩内容。您需要将插件中的文档保存到临时位置(最好使用GetTempPath,然后将文件从磁盘读取到内存流中并上传到您需要的任何位置。

【讨论】:

  • 通过这种方式,它完全可以工作。但是有没有办法直接访问该内容并将其传递给 MemoryStream 并将其保存为普通的 word 文件?
  • 据我所知 - 这是不可能的,因为正如我所说,内容在保存在 DOCX 中时是结构化和压缩的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 2022-01-19
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
相关资源
最近更新 更多