在PB中嵌入Word文档

来源:互联网 发布:淘宝女童模特可可真名 编辑:程序博客网 时间:2024/04/28 21:05
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,在相应的位置填写数据,生成用户的话费清单,并且保存在指定目录下。生成所有用户的话费清单后,即可以统一进行打印。 ?