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,在相應的位置填寫資料,生成使用者的話費清單,并且儲存在指定目錄下。生成所有使用者的話費清單後,即可以統一進行列印。 ?