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

时间:2008-08-13 22:07:45

标签: c# .net ms-word openxml

我有一个项目,我希望以MS Word格式生成报告导出。该报告将包括图像/图形,表格和文本。做这个的最好方式是什么?第三方工具?你有什么经历?

17 个答案:

答案 0 :(得分:49)

答案将取决于应用程序是在服务器上运行还是在客户端计算机上运行。如果您在服务器上运行,那么您将需要使用一种基于XML的办公室生成格式,因为using Office Automation on a server时会出现问题。

但是,如果您正在使用客户端计算机,那么您可以选择using Office Automation或使用Office Open XML格式(请参阅下面的链接),Microsoft Office 2000支持本地或通过服务包。但是,回过头来看,您可能无法嵌入您想要显示的某些图形或图像。

实现目标的最佳方式将取决于您需要投入多少时间进行开发。如果您选择Office Automation的路线,可以通过Google找到相当多的优秀教程,并且相当简单易学。但是,Open Office XML格式是相当新的,因此您可能会发现学习曲线要​​高一些。

Office Open XML信息

答案 1 :(得分:17)

DocX free library用于创建DocX文档,积极开发,使用起来非常简单直观。由于CodePlex即将死亡,项目已移至github

答案 2 :(得分:14)

我花了大约一个星期左右才开始Office Open XML。我们有一个数据库应用程序,用于存储我们要在Microsoft Word中报告的调查数据。您实际上可以在C#中从头开始创建Word 2007(docx)文件。 Open XML SDK版本2包含一个名为Document Reflector的酷应用程序,它实际上将提供C#代码以完全重新创建Word文档。您可以使用部分或全部代码,并替换您想要动态更改的位。 SDK附带的帮助文件也有一些很好的代码示例。

服务器上不需要Office Interop或任何其他Office软件 - 新格式是100%XML。

答案 3 :(得分:10)

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

它支持嵌入图像和表格以及文本,默认情况下使用Microsoft Word打开,虽然它的功能集更受限制(计算任何高级格式化),看起来和感觉和打开的东西像Word文档一样不远。

您的最终用户可能不会注意到。

答案 4 :(得分:10)

我发现Aspose Words是最好的,因为不是每个人都可以打开Office Open XML / *。docx格式文件,Word互操作和​​Word自动化可能有问题。 Aspose Words支持Word 97以上的大多数文档文件类型。

这是一个付费组件,但有很大的支持。另外一个已经建议的替代方案是RTF。

答案 5 :(得分:7)

在.NET中使用Office Automation生成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

答案 6 :(得分:4)

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

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

如果您符合许可要求,我认为您需要使用COM Interop - 具体而言,Office XP Primary Interop Assemblies

答案 7 :(得分:3)

我使用支持doc和docx格式的Syncfusion Backoffice DocIO取得了很大的成功。

在之前的版本中,它并不支持所有内容,但根据您的列表,我们使用表格和文本作为邮件合并方法对其进行了测试,并且工作正常。

不确定导入图像。在他们的模糊页面上http://www.syncfusion.com/products/DocIO/Backoffice/features/default.aspx,它说

  

块引用   Essential DocIO支持以几乎所有格式将Scalar和Vector图像插入到文档中。 Bitmap,gif,png和tiff是支持的一些常见图像类型。

所以值得考虑。

正如其他人提到的那样你可以建立一个RTF文档,有一些很好的RTF库可以用于.net,如http://www.codeproject.com/KB/string/nrtftree.aspx

答案 8 :(得分:3)

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

答案 9 :(得分:3)

查看VSTO(适用于Office的Visual Studio工具)。创建Word模板,将xml数据岛注入其中,然后将其发送到客户端非常简单。当用户在Word中打开文档时,Word将读取xml并将其转换为WordML并呈现它。您将需要查看VSTO库的ServerDocument类。根据我的经验,不需要额外的许可。

答案 10 :(得分:3)

我遇到了这个问题并为此创建了一个小型库。它被用于几个项目,然后我决定发布它。它是免费的,非常简单,但我相信它会帮助您完成任务。调用Office Open XML库http://invoke.co.nz/products/docx.aspx

答案 11 :(得分:2)

我目前正在做这件事。

如果文档不是很大,不包含图像等,那么我将其存储为带有#MergeFields#的RTF,只需将其替换为内容,将结果作为RTF发送给用户

对于较大的文档,包括图像和动态插入的图像,我将初始Word文档保存为包含#MergeFields#的单个网页* .mht文件。然后我就像上面那样做。使用它,我可以轻松地使用一些基本的Html表标记呈现DataTable,并用整个表替换#MergeFields#中的一个。

图像可以存储在您的服务器上,并且网址也会嵌入到文档中。

有趣的是,新的Office 2007文件格式实际上是zip文件 - 如果您将扩展名重命名为.zip,则可以打开它们并查看其内容。这意味着您应该能够使用简单的C#zip库来切换图像等内容。

答案 12 :(得分:1)

LibreOffice还支持通过API进行无头交互。不幸的是,目前关于这个功能的信息还不多.. :(

答案 13 :(得分:1)

您还可以使用Word文档生成器。它可用于客户端或服务器端部署。从项目描述:

  

WordDocumentGenerator是一个从中生成Word文档的实用程序   使用Visual Studio 2010和Open XML 2.0 SDK的模板。   WordDocumentGenerator有助于生成Word文档   不可刷新以及基于预定义模板的可刷新功能   使用最少的代码更改。内容控件用作占位符   用于文档生成。它支持Word 2007和Word 2010。

抓住它:http://worddocgenerator.codeplex.com/

下载SDK:http://www.microsoft.com/en-us/download/details.aspx?id=5124

答案 14 :(得分:1)

@Dale Ragan:这适用于Office 2003 XML格式,但这不是可移植的(例如,.doc或.docx文件)。

要读取/写入这些内容,您需要使用Word对象库ActiveX控件:

http://www.codeproject.com/KB/aspnet/wordapplication.aspx

答案 15 :(得分:1)

@Danny Smurf:实际上这篇文章描述了Rob回答的Office Open XML格式。我会更加关注我现在发布的链接,以确保不会过时。我实际上搜索过WordML,这就是当时的调用。

我相信Office Open XML格式是最好的方式。

答案 16 :(得分:0)

另一种选择是Windward Docgen(免责声明 - 我是创始人)。使用Windward,您可以在Word中设计模板,包括图像,表格,图形,仪表以及您想要的任何其他内容。您可以设置插入XML或SQL数据源的数据的标记(包括forEach循环,导入等功能)。然后生成DOCX,PDF,HTML等报告