2010-06-25 118 views
1

其目的是生成提案文檔,可以在事後將文檔手動編輯,但在發送給客戶之前。以編程方式從ASP.NET生成可編輯的Word文檔?

許多提案內容將來自現有的HTML網站內容(支持CMS)以及針對特定場景的一些自定義(非HTML)注入。當然,條件邏輯可以進入服務器端ASP.NET以適當地改變內容。

我對第三方工具開放,如果原始的API操作是艱鉅的。事實上,一個好的第三方工具可能就是答案。

回答

3

使用.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

3

我以前沒有使用過任何第三方工具,因爲我只編寫過已安裝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

1

你可以考慮使用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

0

您不需要任何第三方控件來創建Word文檔。從2007年起,Word可以將html作爲word文檔讀取。您只需使用「.doc」擴展名保存任何網頁,Word將對其進行排序。

只需創建您想要的任何格式的網頁,然後用.doc擴展名保存。

我以前HttpWebRequest到URL(與parmaters)打電話到我的網頁,然後使用WebResponseStream讓我的網頁到一個緩衝區,然後StreamReaderStreamWriter將其保存到一個實際的文檔。然後我有自己的自定義函數來下載文件。

如果有人想我的代碼,讓我知道

2

我有一個關於文檔的生成和郵件合併的悠久歷史。在過去,我們甚至在服務器端(ASP)應用程序中廣泛使用Office COM。多年來,我們已經瞭解到,這種方法導致了許多問題,今天我一直主張在幾乎任何情況下都不要使用Office COM(Word自動化)。

隨着微軟推出的Open XML SDK,我們成功創建了一個可靠的郵件合併組件,其速度比Office COM解決方案快許多倍,並且更加強大。根據我的經驗,Open XML SDK允許開發人員創建一個可靠的解決方案,但需要花費大量的精力和時間才能使其具有實用性和可靠性。

市場上有好幾個很好的文檔生成/處理庫。我們後來最終購買了一個,而在我看來,創建您自己的解決方案(基於Open XML SDK或Office COM)完全沒有回報。

目前我們正在使用Docentric Toolkit這是一個通用的文檔處理庫,甚至更好的基於模板的/郵件合併工具包的.NET。它允許在MS Word中進行模板設計,然後用應用程序數據填充它們,並以不同格式生成最終文檔。