如何从内存流中打开Word文档

5
在我们的WPF应用程序中,我们必须创建一个Word文档并自动打开它。
今天,我们要求用户在创建文档并使用Process.Start方法打开文件之前指定文件名和位置。
现在,我想在内存流中创建Word文档,然后打开它,最终当用户决定在Microsoft Word中保存文档时,他将不得不指定位置和名称。因此,我将不在我的应用程序中使用SaveFileDialog。
这类似于启动Microsoft Word时。默认文档被创建,当您单击保存时,您将被引导到“另存为”功能。
我该如何做到这一点?

1
有很多在线示例可以教你如何使用InterOp和HttpContext创建Word文档。我目前在我的Web应用程序中经常这样做,如果您不熟悉Microsoft.Interop,请考虑使用OpenXml。 - MethodMan
@MethodMan 我的问题不是关于如何创建Word文档的内容,而是如何获取一个内存流创建的文档并在Word中启动它,而不需要物理文件路径。顺便说一下,我没有使用Interop。 - Igor Kondrasovas
http://blogs.msdn.com/b/mcsuksoldev/archive/2010/04/09/creating-a-new-microsoft-word-document-from-a-template-using-openxml.aspx - MethodMan
https://dev59.com/R2Qo5IYBdhLWcg3wQdiu - MethodMan
2个回答

5

我认为你不能仅使用内存流来完成这个任务。然而,我会将内存流保存到一个临时文件中,可以将其保存到Temp文件夹或AppData\temp等随机生成的名称中,并标记该文件为只读。然后通过System.Diagnostics.Process或其他方式打开该文件的word,由于它是只读的,当用户退出时,它将提示用户是否保存更改。


你是说如果我将文件标记为只读,它会强制微软Word询问用户是否要“另存为...”另一个名称,而不是直接保存到我创建的临时路径? - Igor Kondrasovas
是的,完全正确。如果我没有弄错的话,我认为这类似于Web浏览器的工作方式。 - sovemp
1
在sovemp的内容基础上进行扩展:无法将内容“流式传输”到Word应用程序中。最接近的方法需要某种“interop”交互,可以通过从剪贴板粘贴、使用InsertFile或Range.XML来将内容放入已经打开的Word文档中。没有办法从流中创建文档-Word根本不是为此而构建的。 - Cindy Meister

2
只需使用标准的Microsoft.Interop.Word .Net命名空间以编程方式创建一个新的Word文档:请注意,您可能需要安装MS-Office才能执行此操作。同时,您的应用程序可以显示自己的“另存为”对话框(或者,您的程序可以使用硬编码路径),而与Word无关。您的程序选择路径 - 并在准备好时写入Word文档对象。最后,这是一个替代的开源库,DocX:附言:感谢您的澄清。
  1. 您正在使用OpenXML SDK(作为我之前提到的.Net Interop或DocX库的替代方案)。 您已经创建了一个内存中的文档对象。

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

  3. 但您不能(轻易地)做到这一点 :)

  4. 一个选项是由sovemp提出的:

    a. OpenXML写入一个临时文件(以便可以在Word中打开)

    b. 将临时文件设置为只读(强制用户执行显式的“另存为”操作)

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

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

  6. 还有一种选择是在Web浏览器中服务于内存流,使用HTTP ContentType“application/msword”(例如)

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


我没有使用Interop。我想以一种方式获取我的内存流创建的文档并在Word中打开它,以便如果用户单击保存(在Microsoft Word中),则会显示Word文件另存为。 - Igor Kondrasovas
你究竟是怎么使用这个“内存流”(Memory Stream)的? 创建一个doc文件并不需要使用内存流 - 你只需要一个“对象”。一个内存中的对象。例如,通过Interop或者DocX创建。问题:那么这个内存流有什么用呢?它是如何创建的?你使用内存流的场景是什么?请澄清一下。 - paulsm4
我的应用程序使用OpenXML创建了一个Word文档。文件内容不是我的问题所在。这部分已经可以很好地工作了。我想在Microsoft Word中打开此文件。当用户在Microsoft Word上单击“保存”时,我希望Word会询问要保存文件的位置。因此,我怀疑我不能从文件流中打开此文档。 - Igor Kondrasovas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接