做了一個(gè)多月的C#生成Word文檔的工作,我從一開始的對(duì)這個(gè)一竅不通,到現(xiàn)在的順利完成了這個(gè)功能模塊,其中還是有點(diǎn)心得的。想想自己說(shuō)不定以后還會(huì)用到,于是想吧這些心得寫下來(lái),以供自己以后的學(xué)習(xí)。同時(shí)也希望對(duì)那些正在或正要編程實(shí)現(xiàn)自動(dòng)生成Word的朋友有些小小的幫助 下面是我自學(xué)C#生成Word文檔的過(guò)程(首先必須安裝好Word2003和.NET2003 ![]() 一、下載Word的VBA編程參考手冊(cè)和網(wǎng)上的在線資料
微軟大概覺(jué)得VB用的人太少了,想大力發(fā)展之,搞得Office編程的參考手冊(cè)都是VBA編程,害的我不懂VB的人也不得不學(xué)。不過(guò)沒(méi)辦法,要做這個(gè)工作,微軟的參考手冊(cè)是不能少的,可以從http://msdn.microsoft.com/office/downloads/vba/default.aspx這個(gè)頁(yè)面中下到相應(yīng)的的Office(本人使用的是Word2003,但好像只用WordXP的參考手冊(cè))的VBA Language References(當(dāng)然這個(gè)文檔是全英文的,看她簡(jiǎn)直是我的噩夢(mèng))。沒(méi)有必要看完這個(gè)參考手冊(cè),只要搜索需要的函數(shù),然后看看就可以了。
有了這個(gè)參考手冊(cè)是遠(yuǎn)遠(yuǎn)不夠的,我們需要去網(wǎng)上搜集大量的現(xiàn)成代碼來(lái)看看才能快速的上手。下面是一個(gè)微軟老大提供的關(guān)于C#生成Word的中文How To文檔,感覺(jué)很好,分享一下 ![]() ![]() ![]() 二、編程實(shí)現(xiàn):通過(guò)查看Word宏代碼完善自定義類庫(kù)
有了這樣一個(gè)大致的框架以后,我們就可以開始用C#開始實(shí)現(xiàn)各種Word操作的功能。總的來(lái)說(shuō),這項(xiàng)工作不難,但很繁瑣(要看你對(duì)Word操作的熟悉程度
![]() 一般情況下,自動(dòng)生成的Word文檔會(huì)有一個(gè)模板Word文件(以.dot結(jié)尾,當(dāng)然模板本身也可以是.doc的Word文檔)。在這個(gè)模板中,我們先設(shè)計(jì)好要導(dǎo)出文檔的總體框架,在那些需要插入文字的地方先做好書簽。在這個(gè)工作中,我們最常用到的就是書簽,使用書簽的好處是方便快捷,Word文檔中的差不多所有的定位都是通過(guò)書簽來(lái)完成的。為了了解一個(gè)Word操作的具體編程實(shí)現(xiàn),我們可以通過(guò)Word自帶的宏編程:在進(jìn)行想要了解的操作之前,先錄制宏,操作完后再查看剛才錄制的宏代碼,這樣我們就得到了進(jìn)行這個(gè)操作的VB編碼。如:我們需要查看Word生成一個(gè)Table表的動(dòng)作是怎樣的,我們可以先在進(jìn)行插入Table前錄制宏,然后在Word中進(jìn)行一個(gè)插入Table的操作,再停止宏,這樣我們就可以看到一個(gè)插入Table的宏代碼了。下面就是一個(gè)插入最簡(jiǎn)單的Table的宏代碼:
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 了解這些后,我們就需要學(xué)會(huì)從VBA編程到C#實(shí)現(xiàn)之間的轉(zhuǎn)變(這是我碰到的最大難題)??偨Y(jié)下來(lái),兩者間的函數(shù)名一般是相同的,但由于VB可以缺省參數(shù)而C#不行,所以我們必須同時(shí)了解那些缺省參數(shù),并進(jìn)行合理的填充。那些在VB代碼中出現(xiàn)的參數(shù)也要進(jìn)行適當(dāng)?shù)母淖儾拍軕?yīng)用于C#中。比如打開一個(gè)Word文檔的操作吧,Word的宏代碼如下:
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 缺省參數(shù)一般可以通過(guò)賦System.Reflection.Missing.Value值就可以了。而那些VB代碼中出現(xiàn)了的參數(shù),我們必須先通過(guò)查找VBA Language References參考手冊(cè)了解其具體的值(實(shí)際上這些參數(shù)都是枚舉變量,其值大多數(shù)都是Object型的整數(shù)),然后再在C#中賦予相同的Object型的整數(shù)值。需要注意的是,C#中的參數(shù)一般都是引用型的,要加ref。
這里有些方便的小技巧,在參考手冊(cè)的Reference/Enumerations下可以找到那些參數(shù)的名稱和其值,我們可以通過(guò)直接賦整數(shù)值實(shí)現(xiàn),但在C#的Word類庫(kù)中,Word.Wd***這個(gè)枚舉量下都會(huì)有一個(gè)值和VB中的這個(gè)參數(shù)對(duì)應(yīng),所以建議用這些枚舉值進(jìn)行賦值。如VB有個(gè)參數(shù)叫wdAlignParagraphCenter,我們通過(guò)查參考手冊(cè)知道它是WdParagraphAlignment下的枚舉值,那么它在C#中的值為Word.WdParagraphAlignment.wdAlignParagraphCenter。 三、編程中遇到的問(wèn)題及解決 在這個(gè)工作中,碰到點(diǎn)問(wèn)題是難免的,只要你用心,相信只是 ![]() ![]() 1. Style等對(duì)象不能賦值的問(wèn)題 感覺(jué)微軟對(duì)Office的類庫(kù)的設(shè)計(jì)可能存在問(wèn)題,很多在VB中可以賦值的對(duì)象如Style,但在C#就是不能賦值。這引來(lái)了很多問(wèn)題,如前面的產(chǎn)生Table的宏中就有“.Style = "網(wǎng)格型"”的語(yǔ)句,這在C#中是不可能用一條等價(jià)的語(yǔ)句來(lái)實(shí)現(xiàn)的。 這里有兩種解決辦法,一種是干脆不用Style,另一種是間接實(shí)現(xiàn)Style的賦值。 有些地方的Style是可以被替換的,如產(chǎn)生table的宏中的Style,它的Style只不過(guò)是是定義邊框的樣式,我們可以手工定義樣式來(lái)替代Style,用下列函數(shù)實(shí)現(xiàn)產(chǎn)生一個(gè)Table: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 但有些地方的Sytle就替換不了了,有一種方法可以間接實(shí)現(xiàn)對(duì)Style等不能在C#中賦值對(duì)象的賦值,那就是通過(guò)調(diào)用VB.NET的dll。不得不佩服微軟的.NET框架,各個(gè)語(yǔ)言間可以隨意的調(diào)用,用起來(lái)相當(dāng)之方便。
我們可以在VB.NET下面建個(gè)函數(shù)來(lái)調(diào)用那個(gè)語(yǔ)句,然后生成dll,C#項(xiàng)目只要引用這個(gè)dll,然后調(diào)用這個(gè)dll中的函數(shù)就可以了。下面是VB.NET下對(duì)Style賦值的函數(shù)(簡(jiǎn)單吧!C#里就是死活也不行 ![]() ![]() ![]() ![]() 其他那些不能在C#里賦值的對(duì)象都可以通過(guò)這種方法實(shí)現(xiàn)賦值。
2.書簽過(guò)多,一個(gè)一個(gè)定位麻煩的問(wèn)題 如果你的Word模板夠龐大,可能會(huì)出現(xiàn)有50多個(gè)書簽,而這些書簽的位置只是填充一些簡(jiǎn)單數(shù)據(jù)的情況。如果我們編程時(shí)一個(gè)個(gè)的定位,然后一個(gè)個(gè)的填充數(shù)據(jù)肯定時(shí)非常麻煩的。這種情況下,我的解決辦法是設(shè)置XML配置文檔。 我們可以設(shè)置一個(gè)XML文件,其中存放需要填充數(shù)據(jù)的書簽(這些書簽處只是做簡(jiǎn)單的插入文本)的名稱。如下面是我的XML文件的詳細(xì)內(nèi)容: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 3.頁(yè)眉頁(yè)腳中添文字的問(wèn)題 對(duì)于頁(yè)眉頁(yè)腳,需要注意的就是不要用書簽去定位,因?yàn)轫?yè)眉頁(yè)腳和主文檔的頁(yè)面視圖不一樣,所以不能在普通的視圖下直接定位到頁(yè)眉頁(yè)腳所在書簽處。但只要你切換一下視圖,一切就OK了。 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 4.項(xiàng)目符號(hào)及多級(jí)項(xiàng)目符號(hào)的Style問(wèn)題 這個(gè)問(wèn)題我的解決中有點(diǎn)問(wèn)題,要和模板一起設(shè)置才能用,感覺(jué)不好,就不拿出來(lái)給大家看了,以免誤導(dǎo)大家了 ![]() 5.添加特殊字符的問(wèn)題 當(dāng)你要在文檔中添加特殊文字的時(shí)候(如你想添加一個(gè)þ),不能直接通過(guò)簡(jiǎn)單的復(fù)制粘貼來(lái)實(shí)現(xiàn)(你根本沒(méi)辦法在.NET的IDE下看到þ)。這時(shí),我們可以通過(guò)查找這個(gè)特殊字符的字體名稱和代表的16進(jìn)制編碼來(lái)插入。我們可以查到þ所在的字符集是Wingdings,它的16進(jìn)制編碼是\u00fe,這時(shí),我們就能對(duì)這個(gè)þ進(jìn)行插入,具體代碼如: ![]() ![]() ![]() |
|