其目的是生成提案文檔,可以在事後將文檔手動編輯,但在發送給客戶之前。以編程方式從ASP.NET生成可編輯的Word文檔?
許多提案內容將來自現有的HTML網站內容(支持CMS)以及針對特定場景的一些自定義(非HTML)注入。當然,條件邏輯可以進入服務器端ASP.NET以適當地改變內容。
我對第三方工具開放,如果原始的API操作是艱鉅的。事實上,一個好的第三方工具可能就是答案。
其目的是生成提案文檔,可以在事後將文檔手動編輯,但在發送給客戶之前。以編程方式從ASP.NET生成可編輯的Word文檔?
許多提案內容將來自現有的HTML網站內容(支持CMS)以及針對特定場景的一些自定義(非HTML)注入。當然,條件邏輯可以進入服務器端ASP.NET以適當地改變內容。
我對第三方工具開放,如果原始的API操作是艱鉅的。事實上,一個好的第三方工具可能就是答案。
使用.Net的Aspose Words組件。
組件本身理解Microsoft Word文件格式,而無需對應用程序環境中安裝任何Microsoft Office產品。然後,您可以從現有的單詞模板開始或以編程方式從頭開始構建整個Microsoft Word文檔。然後,Word對象模型允許您導出到doc/docx等,並將其保存爲本地Word文件,以便隨時隨地使用。
他們在他們的網站上設置了大量的演示。
我以前沒有使用過任何第三方工具,因爲我只編寫過已安裝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
搜索和替換
需要注意的一件事是find和replacement對象可能無法正常工作。它不是搜索整個文檔,而是隻搜索主文本。如果文檔中有文本框架,這些將被忽略。相反,您必須遍歷所有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
+1非常徹底。謝謝。 – 2010-06-25 19:13:09
你可以考慮使用XSL to generate some WordML.
這項技術絕對令人費解但在佈局中給你很大的力量。
+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)打電話到我的網頁,然後使用WebResponse
和Stream
讓我的網頁到一個緩衝區,然後StreamReader
和StreamWriter
將其保存到一個實際的文檔。然後我有自己的自定義函數來下載文件。
如果有人想我的代碼,讓我知道
我有一個關於文檔的生成和郵件合併的悠久歷史。在過去,我們甚至在服務器端(ASP)應用程序中廣泛使用Office COM。多年來,我們已經瞭解到,這種方法導致了許多問題,今天我一直主張在幾乎任何情況下都不要使用Office COM(Word自動化)。
隨着微軟推出的Open XML SDK,我們成功創建了一個可靠的郵件合併組件,其速度比Office COM解決方案快許多倍,並且更加強大。根據我的經驗,Open XML SDK允許開發人員創建一個可靠的解決方案,但需要花費大量的精力和時間才能使其具有實用性和可靠性。
市場上有好幾個很好的文檔生成/處理庫。我們後來最終購買了一個,而在我看來,創建您自己的解決方案(基於Open XML SDK或Office COM)完全沒有回報。
目前我們正在使用Docentric Toolkit這是一個通用的文檔處理庫,甚至更好的基於模板的/郵件合併工具包的.NET。它允許在MS Word中進行模板設計,然後用應用程序數據填充它們,並以不同格式生成最終文檔。
+1感謝您的鏈接,並提醒我必須在服務器上安裝Word,才能直接使用API。 – 2010-06-25 17:54:03
Adpose組件看起來很有趣。他們的網站指向Microsoft網站上的一個有趣頁面,該頁面討論了服務器端Office自動化的問題:http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2 – Mike 2010-06-25 18:09:35
@Mike,感謝您的鏈接,這非常有說服力。 – 2010-06-25 19:23:10