在給企業開發的項目中,客戶經常要求將數據匯總顯示並打印。站在程序員的立場上,簡單數據的匯總打印可以采用VB自帶報表,對復雜的數據用水晶報表或第三方打印控件。在企業中,匯總數據另一個目的是為了便於交流和共享資源,報表的格式通常固定,內容可以自己調整,他們對 Excel 和 Word 情有獨鐘。
剛完成的項目中,客戶要求將匯總的數據以三種方式進行顯示和打印:AutoCAD、Excel 和 Word 文檔中。前兩種方式網上資源很多,對 Word 文檔我找到例子不是很多。由於需要和 AutoCAD 開發程序結合,不能將 Word 文檔以 OLE 的方式 嵌入到程序中,文檔只能在內存中形成,這將占用大量的CPU資源,另開一個線程進行處理,線程間以發送消息的方式進行通信。
首先在VC引入Word, 對格式相同的地方一定使用模版的方式進行處理,這可以大大的提高運行速度,Word中的模版為*.dot。加載模版的代碼為:
sDocs=sApp.GetDocuments();
sDocs.AttachDispatch(sApp.GetDocuments(),true);
COleVariant vFalse((long)0),vTrue((long)1);
sDoc.AttachDispatch(sDocs.Add(COleVariant(_variant_t(strFileName)), vFalse,vFalse, vTrue));
需要注意的是,如果Word中使用到表格,VBA錄制的全是Selection對象的處理方法,在VC中使用Selection對象的MoveUp和MoveDown函數時會出現不確定現象(如果你知道為什麼的話請告訴我)。如果你需要繪制表格,不要用程序來動態形成,繪制表格的代碼是很繁瑣的,而且在頁眉中繪制單元格是很難控制的。可以先在模版中繪出你要的表格格式,然後用程序復制單元格或者直接使用模版中的單元格。由於我做的項目表格的行數不確定,我采用的是復制單元格的方式(速度比較慢,誰有更好的方法?)。
剩下的處理流程,就是你想做什麼操作,先在Word中錄制一段宏,然後查看其VBA代碼,並將其轉化到Vc程序中。這就看你Word使用的熟練程度了,例如如何把不同頁的頁眉頁腳設置不同,如何得到當前頁的頁數以及總的文檔的頁數,具體可以參考程序。
VC中也可以像Excel中調用模版中存在的宏,代碼如下:
VARIANT vtMissing ;vtMissing.vt =VT_ERROR;
vtMissing.scode =DISP_E_PARAMNOTFOUND;
sApp.Run("AddCell",&vtMissing,&vtMissing,&vtMissing,
&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,
&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,
&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,
&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing);
本文的目的是想起到拋磚引玉的作用,看看大家在VC中使用Word有什麼更好的方法