天天看點

在PB中嵌入Word文檔

PB(PowerBuilder)是Sybase公司推出的一種優秀的資料庫開發工具,利用它的資料視窗控件可以快速地開發出一個資料管理系統。現在許多機關很注重報表的格式,需要不同類型的報表,是以必須提高報表格式的多樣性。雖然我們可以利用PB設計出具有列印功能的視窗,但是由于格式是事先規定好的,使用者很難根據需要進行修改。Word是大家熟悉的一種文字處理工具,具有強大的編輯與列印功能。如果能夠将資料源動态地導入到Word文檔中,然後在Word中調整和列印,使用者的自由度就比較大。下面筆者以生成使用者話費清單為例,介紹一種通過OLE技術嵌入Word文檔的方法。 ?

?

建立模闆檔案 ?

首先,我們建立一個報表樣式的模闆檔案,取名為“使用者清單模闆.dot”。根據需要錄入靜态文本,并在需要插入動态資料的地方插入“書簽”。“書簽”名字與PB資料源中列的名字一緻,如圖1所示。 ?

?

?

?

圖1 ? 模闆檔案 ?

?

編寫程式 ?

1. ? 資料視窗d_user和d_cost,分别取自行動電話使用者基本資訊表和使用者話費記錄表,資料模型如 ?

?

?

?

圖2 ? 資料模型 ?

?

2. ? PB和Word通信時,如果向Word中輸出漢字,則該漢字後面會出現與漢字個數相同的亂碼,是以必須編寫函數處理這種情況。定義全局函數integer ? f_getcnnum(string ? aString)。代碼如下: ?

string ? ls_ch ? //臨時單元 ?

string ? ls_SecondSecTable ? //存放所有國标二級漢字讀音 ?

integer ? li_num ? = ? 0 ? //傳回值 ?

integer ? i,j ?

for ? i ? = ? 1 ? to ? Len(aString) ?

ls_ch ? = ? Mid(aString,i,1) ?

if ? Asc(ls_ch) ? > = ? 128 ? then ? //判定是漢字 ?

li_num++ ?

i ? = ? i+1 ?

end ? if ?

next ?

return ? li_num ?

3.建立視窗w_costlist,其中包含兩個資料視窗dw_1和dw_2,分别對應資料視窗d_user和d_cost。再插入兩個單行編輯器sle_1和sle_2,分别用于使用者錄入和選擇模闆檔案與文檔輸出路徑。本文省略選擇檔案與路徑按鈕的程式設計代碼。 ?

4.添加“生成使用者清單(Word)”按鈕。該按鈕Clicked事件代碼如下: ?

constant ? integer ? ppLayoutBlank ? = ? 12 ?

OLEObject ? ole_object ?

ole_object ? = ? CREATE ? OLEObject ?

integer ? li_ret ?

//建立與Word的連接配接 ?

li_ret ? = ? ole_object.ConnectToObject(“Word.application”) ?

if ? li_ret ? <> ? 0 ? then ?

//如果Word還沒有打開,則建立一個Word ?

li_ret ? = ? ole_object.ConnectToNewObject(“Word.application”) ?

if ? li_ret ? <> ? 0 ? then ?

MessageBox(‘OLE錯誤’,‘OLE無法連接配接! ? 錯誤号 ? :’ ? + ? string(li_ret)) ?

return ?

end ? if ?

ole_object.Visible ? = ? false ?

end ? if ?

string ? ls_modelfilename ?

ls_modelfilename ? = ? sle_1.text ?

string ? ls_savefilename ?

ls_savefilename ? = ? sle_2.text ?

ole_object.Documents.open(ls_modelfilename) ?

constant ? long ? wdWord9TableBehavior ? = ? 1 ?

constant ? long ? wdAutoFitFixed ? = ? 0 ?

constant ? long ? wdCell ? = ? 12 ?

long ? i,j,k,ll_colnum,ll_rownum ?

string ? ls_value,ls_colname ?

//輸出清單表頭 ?

ll_colnum ? = ? Long(dw_1.object.datawindow.column.count) ?

dw_1.setredraw(false) ?

for ? j ? = ? 1 ? to ? ll_colnum ?

dw_1.setcolumn(j) ?

ls_value ? = ? dw_1.gettext() ?

ls_colname ? = ? dw_1.describe(‘#’ ? + ? string(j) ? + ? “.name”) ?

if ? ls_colname ? = ? “name” ? then ? ls_savefilename ? + ? = ? “\使用者 ? ” ? + ? ls_value ? + ? “ ? 話費清單.doc” ?

ole_object.selection.goto(true,0,0,ls_colname) ?

ole_object.Selection.TypeText(ls_value) ?

for ? k ? = ? 1 ? to ? f_getcnnum(ls_value) ?

ole_object.Selection.TypeBackspace() ?

next ?

next ?

dw_1.setredraw(true) ?

//輸出清單 ?

ll_colnum ? = ? Long(dw_2.object.datawindow.column.count) ?

ll_rownum ? = ? dw_2.rowcount() ? + ? 1 ?

ole_object.selection.goto(true,0,0,‘list’) ?

ole_object.ActiveDocument.Tables.Add(ole_object.Selection.Range, ? ll_rownum, ? ll_colnum, ? wdWord9TableBehavior, ? wdAutoFitFixed) ?

ole_object.Selection.MoveLeft(wdCell) ?

for ? i ? = ? 1 ? to ? ll_colnum ?

//得到标題頭的名字 ?

ls_colname ? = ? dw_2.describe(‘#’ ? + ? string(i) ? +“.name”) ? +“_t” ?

ls_value ? = ? dw_2.describe(ls_colname ? + ? “.text”) ?

ole_object.Selection.TypeText(ls_value) ?

for ? k ? = ? 1 ? to ? f_getcnnum(ls_value) ?

ole_object.Selection.TypeBackspace() ?

next ?

ole_object.Selection.MoveRight(wdCell) ?

next ?

//輸出清單資料 ?

dw_2.setredraw(false) ?

ole_object.Selection.MoveLeft(wdCell) ?

for ? i ? = ? 2 ? to ? ll_rownum ?

for ? j ? = ? 1 ? to ? ll_colnum ?

dw_2.scrolltorow(i ? - ? 1) ?

dw_2.setcolumn(j) ?

ls_value ? = ? dw_2. ? gettext() ?

ole_object.Selection.MoveRight(wdCell) ?

ole_object.Selection.TypeText(ls_value) ?

for ? k ? = ? 1 ? to ? f_getcnnum(ls_value) ?

ole_object.Selection.TypeBackspace() ?

next ?

next ?

next ?

dw_2.setredraw(true) ?

constant ? long ? wdFormatDocument ? = ? 0 ?

//儲存使用者詳細話單 ?

ole_object.ActiveDocument.SaveAs(ls_savefilename,1) ?

ole_object.Application.Quit() ?

ole_object.DisConnectObject() ? //斷開OLE連接配接 ?

Destroy ? ole_object ?

MessageBox(“提示”,“使用者詳細話單Word文檔已經生成!”) ?

?

當使用者單擊“生成使用者清單(Word)”按鈕後,程式将利用OLE技術連接配接Word,在相應的位置填寫資料,生成使用者的話費清單,并且儲存在指定目錄下。生成所有使用者的話費清單後,即可以統一進行列印。 ?