如何在C#中创建Word文档?

74

我有一个项目,希望生成一个MS Word格式的报告导出。该报告将包括图片/图表、表格和文本。最好的方法是什么?需要使用第三方工具吗?你有什么经验?


5
这个应该重新开放。它不仅清晰有用,而且与其他被标记为重复的问题相互关联。 - DarenW
17个回答

49
答案会略有不同,取决于应用程序是在服务器上运行还是在客户机上运行。如果您在服务器上运行,则需要使用基于XML的办公室生成格式之一,因为在服务器上使用Office自动化存在已知问题。
但是,如果您正在客户端机器上工作,则可以选择使用Office自动化或使用Office Open XML格式(请参见以下链接),Microsoft Office 2000及以上版本原生支持该格式或通过服务包支持。但是,缺点是您可能无法嵌入希望显示的某些类型的图形或图像。
最好的方法将部分依赖于您投资开发所需的时间。如果您选择Office自动化路线,则有很多好的教程可以通过Google找到,并且学习起来相当简单。但是,Open Office XML格式相对较新,因此您可能会发现学习曲线稍高。
Office Open XML信息

6
截至2011年9月的更新... 我同时使用Interop和OpenXml,在任何情况下面对这个任务,我都会毫不犹豫地使用OpenXml。这是唯一一种可以绝对保证你对输出有绝对控制的解决方案。 - Chris B. Behrens

17

DocX免费库用于创建DocX文档,积极开发且非常易用和直观。由于CodePlex即将关闭,该项目已移动到GitHub


14
我花了最近一周的时间来学习Office Open XML。我们有一个数据库应用程序,存储着我们想要在Microsoft Word中报告的调查数据。实际上,你可以使用C#从头开始创建Word 2007(docx)文件。Open XML SDK版本2包括一个很酷的应用程序叫做文档反射器,它将提供完全重新创建Word文档的C#代码。你可以使用部分或全部代码,并在运行时替换你想要更改的部分。SDK附带的帮助文件也有一些很好的代码示例。
服务器上不需要Office Interop或任何其他Office软件-新格式是100%的XML。

10

您是否考虑过使用.RTF作为替代方案?

它支持嵌入图像、表格和文本,使用Microsoft Word 默认打开,虽然其功能集有限(不包括任何高级格式),但对于看起来和感觉像Word文档以及可以打开的东西来说,它并不差太多。您的最终用户可能不会注意到。


1
请不要使用RTF - 规范非常混乱,即使是微软也没有完全遵循它,并且其中存在许多歧义。 - David Thielen

10

我发现Aspose Words是最好的,因为不是每个人都能打开Office Open XML/*.docx格式文件,而Word互操作和Word自动化可能会出现故障。Aspose Words支持从Word 97开始的大多数文档文件类型。

这是一个付费组件,但有很好的支持。另一个已经提出的选择是RTF。


我发现在处理OpenXml文档时,Aspose Words有些不足。具体来说,它对内容控件的处理几乎没有用处,而且根本无法处理AltChunk节点。 - Collin K

8

使用.NET框架内的Office自动化功能生成Word文档,特别是在C#或VB.NET中:

  1. Microsoft.Office.Interop.Word程序集引用添加到您的项目中。路径为\Visual Studio Tools for Office\PIA\Office11\Microsoft.Office.Interop.Word.dll

  2. 按照Microsoft的示例代码进行操作,您可以在此处找到:http://support.microsoft.com/kb/316384/en-us


4

Schmidty,如果您想在Web服务器上生成Word文档,则需要为每个客户端(而不仅仅是Web服务器)购买许可证。请参阅Rob发布的第一个link中的此部分:

“除了技术问题外,您还必须考虑许可问题。当前的许可指南防止Office应用程序被用于服务器以服务客户端请求,除非这些客户端本身拥有经过许可的Office副本。使用服务器端自动化向未经许可的工作站提供Office功能不受最终用户许可协议(EULA)的覆盖。”

如果您符合许可要求,我认为您需要使用COM互操作性 - 具体来说,是Office XP Primary Interop Assemblies


3
我已经写了一系列关于Open XML WordprocessingML文档生成的博客文章。我的方法是创建一个包含内容控件的模板文档,在每个内容控件中编写XPath表达式,定义如何从包含驱动文档生成过程的数据的XML文档中检索内容。代码是免费的,并且根据Microsoft Reciprocal License (Ms-RL)许可。在同一系列博客文章中,我还探讨了一种通过在内容控件中编写C#代码的方法。然后,文档生成过程处理模板文档并生成一个生成所需文档的C#程序。这种方法的一个优点是您可以使用任何数据源作为文档生成过程的数据源。该代码也根据Microsoft Reciprocal License许可。

3

我曾经遇到过这个问题,并为此创建了一个小型库。它在几个项目中被使用,然后我决定发布它。它是免费的,非常简单,但我相信它一定会对你有帮助。调用Office Open XML库:http://invoke.co.nz/products/docx.aspx


3
我使用Syncfusion Backoffice DocIO取得了很好的成功,支持doc和docx格式。在之前的版本中,它并不支持Word中的所有内容,但根据您的列表进行测试,我们将其作为邮件合并方法使用表格和文本,它能够正常工作。不确定图像的导入情况。在他们的简介页面上http://www.syncfusion.com/products/DocIO/Backoffice/features/default.aspx上说:
Blockquote Essential DocIO支持将标量和矢量图像插入文档,几乎支持所有格式。位图、gif、png和tiff是一些常见的支持的图像类型。
所以值得考虑。正如其他人提到的,您可以构建一个RTF文档,在.NET中有一些好的RTF库,比如http://www.codeproject.com/KB/string/nrtftree.aspx

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