【问题标题】:How to open Word document from memory stream如何从内存流中打开Word文档
【发布时间】:2015-11-25 20:02:29
【问题描述】:

在我们的 WPF 应用程序中,我们必须创建一个 Word 文档并自动打开它。

今天我们要求用户在创建文档之前指定文件名和位置,然后他们使用 Process.Start 方法打开文件。

现在,我想在内存流中创建 Word 文档,打开它,最终,当用户决定将文档保存在 Microsoft Word 中时,他必须指定位置和名称。所以我不会在我的应用程序中使用 SaveFileDialog。

这与启动 Microsoft Word 时类似。创建一个默认文档,当您点击保存时,您将被引导至“另存为”功能。

我该怎么做?

【问题讨论】:

标签: c# ms-word ms-office


【解决方案1】:

我认为您不能仅在内存流上执行此操作。但是,我会将内存流保存到临时文件中,方法是保存到 Temp 文件夹或 AppData\temp 或类似名称的随机生成的名称,然后将该文件标记为只读。然后在该文件上打开 word(使用 System.Diagnostics.Process 或您正在执行的操作),由于它是只读的,因此它将要求用户在退出时保存更改。

【讨论】:

  • 您是说如果我将文件标记为只读,它将强制 Microsoft Word 要求用户使用另一个名称“另存为...”,而不是直接保存到我创建的临时路径?
  • 是的。如果我没记错的话,我认为这类似于网络浏览器的操作方式。
  • 以 sovemp 的内容为基础:无法将内容“流式传输”到 Word 应用程序中。最接近您可以获得的需要某种“互操作”交互,或者从剪贴板粘贴,使用 InsertFile 或 Range.XML 以便将内容放入已经打开的 Word 文档中。无法从流中创建文档 - Word 根本不是为此而构建的。
【解决方案2】:

只需使用标准 Microsoft.Interop.Word .Net 命名空间以编程方式创建一个新的 Word 文档:

请注意,您可能需要安装 MS-Office 才能执行此操作。

还要注意,您的应用程序可以显示它自己的“另存为”对话框(或者,就此而言,可以只使用硬编码路径)独立 Word。您的程序选择路径 - 如果/当它准备好时,您的程序会写入 Word 文档对象。

最后,这是一个替代的开源库,DocX

附录:

感谢您的澄清:

  1. 您正在使用 OpenXML SDK(作为我上面提到的 .Net Interop 或 DocX 库的替代方案)。您已经创建了一个内存中的文档对象。

  2. 现在您希望用户能够在 Word 中打开文档对象(可能是为了查看它),然后再保存(以他/她自己选择的文件名)。

  3. 你不能(轻易地)这样做:)

  4. 上面的 sovemp 建议的一个选项:

    一个。 OpenXML 写入临时文件(因此可以在 Word 中打开)

    b.将临时文件设为只读(强制用户执行明确的“另存为”)

    c。使用 .Net Process.Start() 调用 MSWord(在命令行中指定临时文件)。

  5. 另一种选择可能是使用“预览处理程序”:

  6. 还有一种选择可能是在 Web 浏览器中提供内存流,使用 HTTP ContentType "application/msword"(例如)

  7. 最后,如果您只想让用户指定文件名(如果“预览”不是必需的),您可以随时弹出您自己的“另存为”对话框并直接从OpenXML。

【讨论】:

  • 我没有使用互操作。我想获取我的内存流创建的文档并在 Word 中打开它,如果用户单击保存(在 Microsoft Word 中),Word 文件将显示为另存为。
  • 你是如何使用这个“内存流”的? 您不需要内存流来创建 doc 文件 - 您只需要一个“对象”。内存中的对象。例如,由 Interop 或 DocX 创建。问:那它有什么用?它是如何创建的?您需要内存流的“用例”是什么?请澄清。
  • 我的应用程序使用 OpenXML 创建了一个 Word 文档。文件内容不是我的问题。这很好用。我想在 Microsoft Word 中启动这个文件。当用户在 Microsoft Word 上单击“保存”时,我希望该词询问将文件保存在何处。所以我怀疑我无法从文件流中打开这个文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
相关资源
最近更新 更多