以编程方式从ASP.NET生成可编辑的Word文档?

问题描述:

其目的是生成提案文档,可以在事后将文档手动编辑,但在发送给客户之前。以编程方式从ASP.NET生成可编辑的Word文档?

许多提案内容将来自现有的HTML网站内容(支持CMS)以及针对特定场景的一些自定义(非HTML)注入。当然,条件逻辑可以进入服务器端ASP.NET以适当地改变内容。

我对第三方工具开放,如果原始的API操作是艰巨的。事实上,一个好的第三方工具可能就是答案。

使用.Net的Aspose Words组件。

Aspose Words Component Link

组件本身理解Microsoft Word文件格式,而无需对应用程序环境中安装任何Microsoft Office产品。然后,您可以从现有的单词模板开始或以编程方式从头开始构建整个Microsoft Word文档。然后,Word对象模型允许您导出到doc/docx等,并将其保存为本地Word文件,以便随时随地使用。

他们在他们的网站上设置了大量的演示。

+0

+1感谢您的链接,并提醒我必须在服务器上安装Word,才能直接使用API​​。 – 2010-06-25 17:54:03

+1

Adpose组件看起来很有趣。他们的网站指向Microsoft网站上的一个有趣页面,该页面讨论了服务器端Office自动化的问题:http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2 – Mike 2010-06-25 18:09:35

+0

@Mike,感谢您的链接,这非常有说服力。 – 2010-06-25 19:23:10

我以前没有使用过任何第三方工具,因为我只编写过已安装Office的PC的Office自动化应用程序。

从头开始创建文档,或将它们放在模板上,非常简单。借助模板,您可以定义书签和邮件合并字段,以便查找和替换文档元素。

这里有几件事情,你可能会发现有用:

命名和可选参数
Word对象模型是相当容易的工作。 VB.NET过去比C#更容易使用:由于Office自动化API最初是用VB编写的,因此可以利用可选参数。在早期版本的C#中,您必须在API调用中指定每个参数,这非常乏味。据我所知,这在Visual C#2010已经改变:

如何:使用命名和Office编程(C#编程指南) http://msdn.microsoft.com/en-us/library/dd264738.aspx

教程
我发现这些教程很方便可选参数:

自动化Office程序VB.NET
http://www.xtremevbtalk.com/showthread.php?t=160433

VB.NET办事处金tomation FAQ
http://www.xtremevbtalk.com/showthread.php?t=160459

了解Word中的Word对象模型。NET开发人员的角度
http://msdn.microsoft.com/en-us/library/aa192495%28office.11%29.aspx

早期和后期绑定
有一点值得一提:后期绑定一般建议反对,但它可以是非常有用的,如果你不知道什么版本的Office将被部署做在应用程序的主机上。早期绑定倾向于更快地运行,并具有智能感知的优势,在你的IDE:

使用早期绑定和自动化后期绑定
http://support.microsoft.com/kb/245115

早期与后期绑定
http://word.mvps.org/faqs/interdev/earlyvslatebinding.htm

搜索和替换
需要注意的一件事是findreplacement对象可能无法正常工作。它不是搜索整个文档,而是只搜索主文本。如果文档中有文本框架,这些将被忽略。相反,您必须遍历所有StoryRanges,并搜索每个StoryRanges的内容。这是我在VB.NET做正文故事和文本框搜索:

Private Sub FindReplaceAll(ByVal objDoc As Object, ByVal strFind As String, ByVal strReplacement As String) 
    Dim rngStory As Object 

    For Each rngStory In objDoc.StoryRanges 
     Do 
      If rngStory.StoryType = wdMainTextStory Or rngStory.StoryType = wdTextFrameStory Then 
       With rngStory.Find 
        .Text = strFind 
        .Replacement.Text = strReplacement 
        .Wrap = wdFindContinue 
        .Execute(Replace:=wdReplaceAll) 
       End With 
      End If 
      rngStory = rngStory.NextStoryRange 
     Loop Until rngStory Is Nothing 
    Next rngStory 
End Sub 

StoryRanges集合对象
http://msdn.microsoft.com/en-us/library/bb178940%28office.12%29.aspx

+0

+1非常彻底。谢谢。 – 2010-06-25 19:13:09

你可以考虑使用XSL to generate some WordML.

这项技术绝对令人费解但在布局中给你很大的力量。

+0

+1现在,这是一个有趣的东西,允许人类可读的来源创建一个Word文档,而不需要在服务器上安装MS Word。我将添加此链接http://msdn.microsoft.com/zh-cn/library/aa537167(office.11​​).aspx#officewordwordmltoxsl-fo_introductiontowordprocessingmlxslfoformatting – 2010-06-25 22:23:20

您不需要任何第三方控件来创建Word文档。从2007年起,Word可以将html作为word文档读取。您只需使用“.doc”扩展名保存任何网页,Word将对其进行排序。

只需创建您想要的任何格式的网页,然后用.doc扩展名保存。

我以前HttpWebRequest到URL(与parmaters)打电话到我的网页,然后使用WebResponseStream让我的网页到一个缓冲区,然后StreamReaderStreamWriter将其保存到一个实际的文档。然后我有自己的自定义函数来下载文件。

如果有人想我的代码,让我知道

我有一个关于文档的生成和邮件合并的悠久历史。在过去,我们甚至在服务器端(ASP)应用程序中广泛使用Office COM。多年来,我们已经了解到,这种方法导致了许多问题,今天我一直主张在几乎任何情况下都不要使用Office COM(Word自动化)。

随着微软推出的Open XML SDK,我们成功创建了一个可靠的邮件合并组件,其速度比Office COM解决方案快许多倍,并且更加强大。根据我的经验,Open XML SDK允许开发人员创建一个可靠的解决方案,但需要花费大量的精力和时间才能使其具有实用性和可靠性。

市场上有好几个很好的文档生成/处理库。我们后来最终购买了一个,而在我看来,创建您自己的解决方案(基于Open XML SDK或Office COM)完全没有回报。

目前我们正在使用Docentric Toolkit这是一个通用的文档处理库,甚至更好的基于模板的/邮件合并工具包的.NET。它允许在MS Word中进行模板设计,然后用应用程序数据填充它们,并以不同格式生成最终文档。