第二章第三節 編程模型要點 現在總結一下我們對工作表元件的介紹,我將講述(試算表)控制項編程模型的各個要點,以便您瞭解如何運用這個控制項,以及當您需要編寫指令碼來實現不同的功能時該如何去做。本節不是編程模型的完全指南――那將會是另外一本書。在這裡會介紹常用的屬性和方法,每個屬性和方法會附帶一段簡短的描述。如果需要瞭解編程模型的更多資訊,可以參考Msowcvba.chm檔案中的線上說明,它位於Office目錄的本地化目錄下(對於英語語系的人來說,一般是Program Files\Microsoft Office\Office\1033目錄)。 如果您已經非常熟悉Excel的編程模型的話,您會發現它和工作表元件的編程模型非常相似。
在指令碼中使用枚舉 COM和OLE自動化允許組件定義枚舉,每個枚舉都是指定的一組常量,作用類似程式設計語言中的型別宣告。可以將一個枚舉用作屬性或方法的參數,這使得如VB和VC這樣的環境能夠顯示包含一個枚舉中有效常量的陳述式完成下拉式清單 (
譯者注:陳述式完成功能指開發環境會建議開發人員如何完成一行代碼,使開發人員不需要記住對象的所有成員)。OWC和其它許多ActiveX控制項一樣,包含了一系列預定義的枚舉。 不過,在例如web頁面或asp頁面這樣的指令碼環境中,不存在類型的概念。因此,在現有的這些指令碼語言中不能使用枚舉成員名稱,因為這些語言無法知道一個特定的常量(例如ssHAlignLeft)對應的是什麼。這意味著您的VBScript或ECMA指令碼代碼會因為不能自描述的神秘數字而混亂不堪(
譯者註:指程式中大量的數字常量造成程式很難被讀懂)。 為了盡量解決這個問題,所有的owc組件都有一個名為Constants的頂級屬性,在指令碼語言中可以使用這個屬性訪問組件的各種枚舉成員。例如,如果您需要在VBScript代碼中使用ssHAlignLeft常量使一個單元的內容居左顯示,您可以這樣書寫代碼:
| MyRange.HAlignment = Spreadsheet1.Constants.ssHAlignLeft |
為了使用一個枚舉常量,您可以把它當作Constants對象的一個屬性來引用它,而對象將返回枚舉成員的正確的值。請注意,如果您計劃在您的函數的多處使用常量對象,那麼設定一個等於Constants對象的變數是很有用的,這樣做既避免了不必要的打字,也能夠提高效能。例如,您可以這樣書寫代碼:
| Set c = Spreadsheet1.ConstantsMyRange.HAlignment = c.ssHAlignRightMyRange.VAlignment = c.ssVAlignBottom |
Constants對象只在沒有枚舉概念的指令碼語言中有意義。如果您是在VB,VBA或C++中編寫代碼,請象平常那樣直接使用枚舉,不用理會Constants對象。
將資料輸入組件 之前我已經講述了多個將資料輸入組件的技巧。我現在將更詳細的描述編程模型中的這些技巧。表2-1列出了與裝載資料相關的屬性和方法,所有這些屬性和方法都通過試算表對象的介面公布。
表 2-1.
裝載資料相關的屬性和方法。
| 屬性或方法 |
描述 |
| Spreadsheet.DataType |
字串類型的屬性,告訴工作表元件在多個用於裝載資料的屬性被設定時,應該使用哪個屬性來裝載資料,您賦給這個屬性的值就是您應該用來裝載資料的那個屬性的名稱――例如,將這個屬性設定位HTMLURL,會使組件裝載從屬性HTMLURL中的URL處 獲得的資料。 |
| Spreadsheet.HTMLData |
字串類型的屬性,可用來獲得或設定HTML表格格式的試算表內容。這種格式也包含了額外的屬性和XML標籤,這些屬性和標籤是用來保留重建試算表模型所必須的資訊(例如一個單元公式)的,不過它們不屬於HTML3.2的表格格式。您可以將這個屬性設定為包含了一個HTML表格的一個字串,或者在需要儲存時通過讀取該屬性值來獲得試算表完整的內容。 |
| Spreadsheet.HTMLURL |
字串類型的屬性,包含了一個URL,可以從這個URL處裝載試算表的資料。這個URL必須返回一個包含了表格的HTML文檔。使用Excel 2000中來儲存為HTML格式的試算表可以使用這個屬性來裝載,這個屬性也可以是一個從資料庫中即時產生表格的ASP頁面或CGI程式。 |
| Spreadsheet.CSVData |
字串類型的屬性,和屬性HTMLData類似,不過它接受和返回的資料的格式是CSV。當需要從不能發布HTML格式的老系統中裝載資料時這個屬性很有用。 |
| Spreadsheet.CSVURL |
字串類型的屬性,和屬性HTMLURL類似,不過它希望從URL處獲得的資料格式是CSV格式的。就象HTMLURL屬性一樣,這個URL可以是一個從資料庫中即時產生表格的ASP頁面或CGI程式。 |
| Spreadsheet.LoadText |
可以將一個被分隔的文字檔載入試算表的方法。與CSV格式不同的是,這個文字檔可以使用任何欄位分隔符號。Range對象也可使用LoadText方法和它的兄弟方法ParseText,來將文本載入試算表的一個指定的地區中。LoadText方法可以指向一個您本地檔案系統中的檔案或指向一個URL。 |
使用地區 工作表元件中最常使用的編程介面是Range對象。很多方法都返回Range對象,當需要對一個地區的各單元進行修改,格式化,排序和設定自動篩選時,都會用到Range對象。表2-2顯示了在你建立工作表元件的解決方案時應該瞭解的Range對象的屬性和方法。
表 2-2.
Range對象主要的屬性和方法。
| 屬性或方法 |
介紹 |
| Spreadsheet.Range |
該方法接受一個地區引用(例如A1:B2或A:B),返回一個Range對象。因為一個地區可以只有一個單元,因此您也可以傳入單個單元的引用(例如A1)。該方法也可以接受兩個不同的單元引用,而返回一個含蓋這兩個單元的地區。 |
| Range.Address |
該屬性返回一個地區的地址(例如,A1:B2)。 |
| Range.Cells |
當我首次看到這個函數時,我非常迷惑,因為它被定義為返回另一個Range對象。不過,您可以將該屬性當作多個單元的一個集合,也就是說您可以使用For Each逐一查看其中的每一個單元。該屬性也可以以二維數組的形式來訪問。例如,MyRange.Cells(1,3).Value會返回地區中行1,列3的值。試算表和工作表對象也有Cells屬性,因此您可以使用它代替前面提到的Range方法來訪問指定單元。 |
| Range.Column, Range.Row |
這些屬性指出地區中首行和首列的編號。當您在一個地區的行和列中進行迭代時,如果需要知道當前位於哪行哪列,這個屬性非常有用。 |
| Range.Columns, Range.Rows |
雖然在名稱上和前兩個屬性非常相似,但是這對屬性返回的是Range對象包含的行或者列的集合。Range.Columns.Count和Range.Rows.Count可以告訴你目前範圍中行和列的數目。 |
| Range.HTMLData |
該屬性和Spreadsheet.HTMLData屬性相似,不過Range對象的這個屬性是唯讀。使用它可以快速獲得一個給定地區中資料的HTML表格的表現形式。 |
| Range.Value |
該屬性獲得或設定地區的值。雖然協助檔案說在地區由多個單元構成時Range.Value會返回一個二維變數數組,但實際上目前的版本中這是沒有實現的。不過,Range.Value可以接受一個二維數組的變數,來將資料輸入地區中,當你需要使用文字值設定一個或多個單元值,或者是需要獲得一個單元的無格式的值時,可以使用這個屬性。(譯者註:無格式的值指沒有經過格式化的值。) |
| Range.Formula |
該屬性讀寫一個單元的公式字串。當您需要獲得或設定地區中一個或多個單元的公式時可以使用這個屬性,記住在公式的開始使用等號(=)。 |
| Range.Text |
Range.Text屬性返回Range.Value屬性的格式化版本。當您需要在訊息框或另一個使用者介面元素中顯示格式化的值時這個屬性很有用,該屬性值就是您在添加AutoFilter對象的過濾條件時傳入的值。(譯者註:也就是說,過濾是根據一個儲存格的表面值進行過濾的) |
格式化在將資料載入試算表後,您可能需要通過編程來控制格式化。每個單元都有自己的字型,對齊,邊框,顏色和數字格式屬性,所有這些特徵都可以使用表2-3中的屬性來設定。
表 2-3.
用于格式化的屬性。
| 屬性 |
描述 |
| Range.NumberFormat |
字串類型的屬性,控制單元中數位格式。您可以引用現有的格式名稱來使用眾多的內建格式(例如Currency)。也可以建立自訂格式(例如,#,###,使1000顯示為1,000)。 |
| Range.Font |
返回一個許多組件都能使用的常用的Font對象。Range.Font允許設定Font對象的的多個屬性,例如Name,Size,Bold,Italic,Color和Underline。請注意,如果需要,可以在Font.Color屬性中使用IE的顏色名。 |
| Range.Halignment, Range.Valignment |
這兩個屬性控制地區的各單元水平和垂直方向上的文本對齊。每個屬性中定義了各自可以使用的對齊的枚舉值。 |
| Range.Borders |
該屬性返回一個Borders對象,可以通過它來設定每個單元邊框的各個特性,如邊框線的線粗,樣式及顏色。 |
組件級的外觀和行為許多屬性和方法會影響整個工作表元件。表2-4列出了定製的解決方案中最有趣的屬性和方法。
表 2-4.
影響整個試算表的主要屬性。
| Property |
Description |
| Spreadsheet.AllowPropertyToolbox |
控制是否顯示內容工具箱(譯者註:指“命令和選項”視窗)。如果該屬性設定為False,屬性工具箱在工具條上的表徵圖和在右鍵菜單上的功能表項目會被禁止。可以隨時使用這個屬性來禁止預設的格式化使用者介面,並提供您自己的格式化介面。 |
| Spreadsheet.AutoFit |
決定控制項是否處於”自動適應”模式。請查看前面章節中關於AutoFit的細節來瞭解這個特性是如何工作的。 |
| Spreadsheet.Dirty |
當控制項中有任何修改,任何單元被改變後,這個屬性會被置為true以通知您這個改變。通常使用Dirty屬性來判斷是否需要儲存內容。請注意這是一個read/write屬性,因此可以通過重設它來使試算表又變”乾淨”。You commonly use the Dirty property to determine whether you need to save the contents in some way. |
| Spreadsheet.DisplayColHeaders, Spreadsheet.DisplayRowHeaders |
控制是否顯示行頭和列頭。這兩個屬性的預設值是True。通常,您可以在需要使用您自己的代碼來對試算表介面進行完全控制時將這兩個屬性設定為False。 |
| Spreadsheet.DisplayGridlines |
控制是否顯示網格線。預設是要顯示的,如果在定製解決方案中,要在需要單元分隔線的地方使用邊框,則常關閉這個屬性。 |
| Spreadsheet.DisplayPropertyToolbox |
控制是否顯示內容工具箱。將屬性置為true則顯示,置為false就會隱藏。 |
| Spreadsheet.DisplayTitleBar |
控制是否顯示標題列。預設是顯示標題列的。可以使用下面介紹的TitleBar屬性來修改標題列上的內容和格式。 |
| Spreadsheet.DisplayToolbar |
控制是否顯示工具條。預設是顯示。 |
| Spreadsheet.EnableAutoCalculate |
控制試算表模型如何重算。如果這個屬性被置為false,試算表模型不會自動重算;必須調用工作表對象的Calculate方法,才能看到改變輸入後的新結果。在計劃修改一系列的輸入,並且希望只有在完成所有的修改後,才重算模型時,這個屬性非常有用。這個屬性預設為True――模型會在試算表被修改時自動進行重算。 |
| Spreadsheet.ScreenUpdating |
預設情況下,試算表在螢幕上的顯示總是反映最新的資料,不過如果計劃執行大量的操作,而不希望試算表在每一個操作之後都會因為更新而閃爍。可以將這個屬性置為Fasle。將這個屬性重新設回True會觸發一個徹底的重繪動作。 |
| Spreadsheet.Selection |
返回當前選擇的對象。可以使用VBA或VBScript中的TypeName函數來判斷這個對象的類型。 |
| Spreadsheet.TitleBar |
使您可以訪問試算表的標題列,可以改變標題列的文本和格式。 |
| Spreadsheet.ViewableRange |
控制試算表實際可見的部分。請查看前面關於ViewableRange和AutoFit的介紹,以瞭解這個屬性是如何工作的。 |
排序和過濾表 2-5 列出了在工作表元件中排序和過濾資料時可以使用的屬性和方法。
Table 2-5.
具有排序和過濾功能的屬性和方法。
| 屬性或方法 |
介紹 |
| Range.Sort |
根據給定的列和排序方法對地區進行排序。 |
| Worksheet.AutoFilter |
該屬性返回一個AutoFilter對象,該對象可用來設定當前過濾器的細節。 |
| AutoFilter.Filters |
該屬性返回當前自動過濾地區的過濾器集合。一個過濾器對象應用於自動過濾地區中的一列,過濾器對象的下標和對應地區中列的下標相對應。 |
| AutoFilter.Apply |
該方法應用一個新的自動過濾。在設定完過濾條件後,必須調用這個方法來實際應用過濾器。 |
| Criteria.FilterFunction |
該屬性控制符合過濾條件的項是包括在過濾器中,還是被排除在過濾器之外。如果是包含,則過濾器僅包含符合過濾條件集合的項,而如果是排除,則過濾器包含除了哪些符合過濾條件集合的項之外的所有項。 |
| Criteria.ShowAll |
該屬性決定是否顯示所有的資料。當設為True時,該屬性重設過濾器來顯示所有的資料。當設為False時,假如沒有任何過濾條件,將不顯示任何資料。 |
| Criteria.Add |
該方法將一個新的過濾條件添加到過濾器中。 |
| Range.AutoFilter |
該方法針針對一個給定的地區開啟AutoFilter開關。首先調用這個方法,然後使用Worksheet.AutoFilter屬性(如上所述)訪問過濾器並設定過濾條件。 |
保 護 如果需要保護試算表的某部分,使您的使用者不能修改單元內容或改變儲存格式,您需要使用控制保護功能的各屬性。表2-6列出了常用的具有保護功能的屬性,並給出如何使用每一個屬性的簡短的描述。請注意,保護設定即通過使用者介面應用到使用者互動中,也應用到代碼中執行的操作中。因此如果您在一個保護選項被啟用的情況下需要刪除一行,您必須在執行刪除操作前將Protection對象的Enabled屬性設定為False,並在完成操作後,將Enabled屬性設回True以便返回到受保護的狀態。
表 2-6.
常用的具有保護功能的各屬性。
| 屬性 |
描述 |
| Worksheet.Protection |
返回一個Protection對象,可以使用它設定各種保護選項,從而啟用各種全域操作(例如:插入和刪除行)。 |
| Protection.Enabled |
控制一般情況下是否啟用保護。在需要使用保護選項或鎖定儲存格時,首先設定選項或者鎖定儲存格,然後將這個屬性設為True。當需要在代碼中執行操作時,可以將該屬性設為False來暫時禁止保護功能。 |
| Protection.AllowInsertingColumns, Protection.AllowInsertingRows, Protection.AllowDeletingColumns, Protection.AllowDeletingRows |
允許或禁止在試算表中插入、刪除列或行。例如,如果AllowInsertingRows被設為False,則試算表會禁止所有用來插入一行的命令,包括哪些編程模型中的命令。 |
| Protection.AllowSizingAllColumns, Protection.AllowSizingAllRows |
允許或禁止調整列或行的大小。例如,如果AllowSizingAllRows被設為False,試算表就不會允許使用者調整行的大小,也不會允許您通過代碼來這樣做。 |
| Protection.AllowSorting |
允許或禁止在試算表中排序資料。將AllowSorting設為False會禁止使用者對任何地區中的內容進行排序。 |
| Protection.AllowFiltering |
允許或禁止使用自動篩選功能。將這個屬性設為False會禁止使用者啟用自動過濾功能。 |
撤 消表2-7 列出了當您控制工作表元件的撤消機制時會用到的有關的屬性和方法。
表 2-7.
控制撤消機制相關的屬性和方法。
| 屬性和方法 |
描述 |
| Spreadsheet.BeginUndo |
一個使您可以將一系列的操作看作一個撤消操作的方法。例如,如果您調用BeginUndo方法,然後執行了三個不同的排序動作,或改變了許多單元,您可以一下撤消所有這些操作。 |
| Spreadsheet.EndUndo |
一個標記您的邏輯撤消單元的結束的方法。在調用BeginUndo方法和調用EndUndo方法之間執行的所有操作會被當前一個單一的單元來撤消。 |
| Spreadsheet.EnableUndo |
該屬性控制撤消功能是否可用。預設是可用的。您可能需要暫時禁止這個功能,以便節約記憶體或在代碼中執行大量的操作。 |
有用的事件試算表的頂級對象公布了大量的事件,比OWC庫中的任何其它控制項都要多。表2-8列出了一些關鍵的事件,當圍繞工作表元件開發定製解決方案時您很可能會需要使用它們。 幾乎所有試算表控制項中的事件都向事件處理函數傳遞一個類型為SpreadsheetEventInfo的單一參數。SpreadsheetEventInfo是一個COM對象,您可以使用它來獲得事件被觸發時應用程式狀態的各種資訊,包括什麼被選擇了,那個地區被影響了,滑鼠的位置在哪裡,那個鍵被按下,等等。這反映出DOM中事件資訊的處理方式。使用一個對象來作為事件參數的最重要的原因,是因為需要支援JavaScript中的撤消事件的功能。JavaScript中傳遞給事件的參數總是值傳遞的,除非參數是對象的指標。換句話說,如果OWC小組將事件設計為附加一個ReturnValue參數,指令碼可以通過將這個參數設定為True來撤消事件,那麼在JavaScript中因為參數的值傳遞方式這不會正常工作。然而,如果指令碼將一個對象的ReturnValue屬性設定為True,觸發事件的控制項則會正確的發現它。因此,如果您需要撤消一個事件(大部分以”Before”開頭的事件是可以被撤消的),請將SpreadsheetEventInfo對象的ReturnValue屬性設為False。
表 2-8.
有用的事件
| 事件 |
描述 |
| Spreadsheet.Change |
只要試算表中的一個或多個單元被改變,該事件就會被觸發。可以使用SpreadsheetEventInfo對象的Range屬性來判斷被改變的地區。 |
| StartEdit, EndEdit, CancelEdit |
當一個單元將要被編輯,正要結束編輯,或正要撤消編輯時觸發。您可以在EndEdit事件處理函數中執行資料校正,並通過將SpreadsheetEventInfo對象的ReturnValue屬性設為True來拒絕輸入的新值。使用SpreadsheetEventInfo對象的EditData屬性可獲得單元的新值。為了編輯的需要,可以在StartEdit事件中使用另一個元素來代替顯示的值。例如使用一個TrueType字型來顯示一個特殊的符號,而不是使用文字的描述。 |
| BeforeCommand, Command |
在正要執行一個命令之前和剛執行完一個命令後觸發――例如排序;過濾;插入或刪除行或列;顯示協助;和剪下,拷貝或粘貼這樣的動作――被執行時。在Msowcvba.chm檔案中或在您的物件瀏覽器中查看SheetCommandEnum常量的列表,可以知道在這些事件中可以捕捉的所有命令。同樣的,如果需要撤銷一個事件的預設行為,您可以將BeforeCommand事件中的ReturnValue屬性設定為False。例如,您可能希望當使用者點擊試算表工具條上的協助按鈕時顯示您自己的協助頁面。 |
獲得版本資訊有時您需要查看正在使用的控制項的版本,以便能夠利用新特性的優勢,或者使用變通的代碼來解決一個較早版本中的問題。大部分的軟體程式都會在主要的版本之間發布SR版本,因此您常常需要檢查您的代碼正在互動的版本是否就是您所期望的版本。為了協助您完成這些工作,我們為owc庫中的每一個控制項添加了表2-9中的屬性。您可以使用這些屬性來判斷您的代碼正在操作的控制項的版本,並執行適當的動作。
表 2-9.
所有Office Web 元件都具有的版本資訊屬性。
| 屬性 |
描述 |
| MajorVersion |
一個long型的整數值,指示組件的主要版本號。對於Office 2000版本來說,這個數字是9。 |
| MinorVersion |
一個字元型的值,指示組件的次版本號碼。對於Office2000版本來說,這個數字是0,如果在下一個主要版本發布之前,發布了任何小版本,這個數字會增加。請注意,為了處理出現例如”a”這樣的版本號碼的情況,MinorVersion是一個字串值。最好對這個值進行相等的比較操作,而不要進行大於或小於的比較操作。 |
| BuildNumber |
一個字元型的值,指示組件的編譯數目。編譯數目會隨著組件DLL的每一次編譯而增加。Office 2000版本的這個數值在寫作這本書時還不可用,這也是一個字元型的數值,因此,它可以處理在發布一個次版本時版本號碼中被加入了一個字母的情況。 |
| Version |
一個字元型的數值,返回整個版本數值。當需要顯示版本號碼時可以使用這個屬性,但是在需要判斷一個版本是否就是您需要的那個版本時請使用其它的屬性。 |