在Word中可以通過下面的方法手動添加一個條碼:使用菜單“視圖”——“工具列”——“控制項工具箱”開啟控制項工具箱,使用控制項工具箱右下角的最後一個按鈕“其它控制項”,在彈出的列表中選擇“Microsoft BarCode Control 9.0”,在文檔中新添加的條碼上單擊右鍵,使用郵件菜單“屬性”開啟屬性對話方塊,設定Value和Style屬性值即可顯示相應的條碼。
還有另外一種可以添加條碼的方法,使用一些條碼字型檔,只要輸入相應條碼的字元,並選擇使用特定的條碼字型即可。
這裡討論的是第一種方法,而且應用的情境是一次性向一個Word文檔添加多個條碼,此時手動添加不適用,可以考慮使用VBA完成添加條碼的操作。
在VBA for Word的編程參考資料裡很容易找到這樣的代碼:
1 Set myCB = ActiveDocument.Shapes.AddOLEControl(ClassType:="Forms.CheckBox.1")
2 With myCB.OLEFormat.Object
3 .Value = False
4 .Caption = "Check if over 21"
5 End With
這是向Word文檔中添加一個複選框的VBA代碼,如果是添加一個條碼對象,代碼是這樣的:
1 Set myCB = ActiveDocument.Shapes.AddOLEControl(ClassType:="BARCODE.BarCodeCtrl.1")
2 With myCB.OLEFormat.Object
3 .Value = "S-102909211000001-12"
4 .Style = 7
5 End With
條碼上顯示的字串是“S-102909211000001-12”。
在C#中如何完成以上操作?
首先應當在項目中添加Microsoft.Office.Interop.Word引用,再添加對Office安裝目錄下的2052目錄中的msbcode9.ocx的引用,後者在方案總管中顯示為BARCODELib,需要使用此命名空間對條碼的屬性進行設定。
然後使用以下程式碼完成向Word文檔中添加一個條碼:
1 private void btnAddBarCodeControl_Click(object sender, EventArgs e)
2 {
3
4 Microsoft.Office.Interop.Word.Application CurWord = null;
5 Microsoft.Office.Interop.Word.Document CurDocument = null;
6 object mValue = System.Reflection.Missing.Value;
7
8 object objFileName = Application.StartupPath + "/testdoc.doc";
9
10 object objReadOnly = false;
11
12 CurWord = new Microsoft.Office.Interop.Word.Application();
13
14 CurDocument = CurWord.Documents.Open(
15 ref objFileName
16 , ref mValue
17 , ref objReadOnly
18 , ref mValue
19 , ref mValue
20 , ref mValue
21 , ref mValue
22 , ref mValue
23 , ref mValue
24 , ref mValue
25 , ref mValue
26 , ref mValue
27 , ref mValue
28 , ref mValue
29 , ref mValue
30 , ref mValue
31 );
32
33 object objOleControlType = "BARCODE.BarCodeCtrl.1";
34
35 object objLeft = 20;
36 object objTop = 20;
37 object objWidth = 200;
38 object objHeight = 50;
39
40 object comControl = CurDocument.Shapes.AddOLEControl(
41 ref objOleControlType
42 , ref objLeft
43 , ref objTop
44 , ref objWidth
45 , ref objHeight
46 , ref mValue
47 ).OLEFormat.Object;
48
49
50 ((BARCODELib.IBarCodeCtrl)comControl).Value = "S-102909211000001-12";
51
52 ((BARCODELib.IBarCodeCtrl)comControl).Style = 7;
53
54 CurDocument.Save();
55
56 }
上面的C#代碼是由完成同樣功能的VBA代碼轉換過來的,其它地方可能並無什麼難理解之處,有兩個地方需要說明一下——
1、AddOLEControl方法的第一個參數ClassType如何確定?文法提示告訴我們這是ActiveX控制項的程式設計識別碼,其實,這個程式設計識別碼可以在VBA for Word編程參考資料中找到,文檔主題即為“OLE 程式設計識別碼”,常用控制項的程式設計識別碼列表如下:
要建立此控制項 |
使用此標識符 |
複選框 |
Forms.CheckBox.1 |
組合框 |
Forms.ComboBox.1 |
命令按鈕 |
Forms.CommandButton.1 |
架構 |
Forms.Frame.1 |
映像 |
Forms.Image.1 |
標籤 |
Forms.Label.1 |
列表框 |
Forms.ListBox.1 |
多頁控制項 |
Forms.MultiPage.1 |
選項按鈕 |
Forms.OptionButton.1 |
捲軸 |
Forms.ScrollBar.1 |
數值調節鈕 |
Forms.SpinButton.1 |
TabStrip |
Forms.TabStrip.1 |
文字框 |
Forms.TextBox.1 |
切換按鈕 |
Forms.ToggleButton.1 |
當然,對於條碼控制項來說,它的程式設計識別碼要特殊一些,沒有辦法,只能找找VBA方法中處理時使用的ClassType名稱了。
2、comControl的類型是如何確定的?如果不確定它的類型,我們是無法設定該控制項的Value和Style屬性的。
確定該COM物件類型的過程是這樣的,添加對Microsoft.VisualBasic的引用,監視察看Microsoft.VisualBasic.Information.TypeName(comControl)的值(在設定OLE控制項屬性之前),可以得到字串"IBarCodeCtrl"(原理可以參照“擷取System.__ComObject的真正類型”,不再贅述),在BARCODELib命名空間下恰好有名稱為IBarCodeCtrl的介面。
如果要添加的是Office的常用控制項,而不是條碼控制項,方法類似。以添加一個文字框為例,objOleControlType應為"Forms.TextBox.1",察看Microsoft.VisualBasic.Information.TypeName(comControl)的值為IMdeText,要使用這個介面,應該添加引用Microsoft.Vbe.Interop.Forms,這個命名空間下包含了Office常用控制項的介面,可以使用下面的語句為該文字框設定初始顯示的字串:
1 ((Microsoft.Vbe.Interop.Forms.IMdcText)comControl).Text = "inital value";
P.S. 有關C#以COM方式操作Word文檔可以參見sharemeteor的一篇隨筆:.NET1.1下,使用C#自動產生Word2003文檔(通過操作COM組件實現)。