摘要 Microsoft公司的Office办公软件中的Excel是一种专业的电子表格处理软件,Microsoft公司对它的Office软件系列都提供了对自动化技术的支持,这样就可以通过其他高级编程语言调用Office软件系列,利用其成熟而可靠的技术与功能来轻松实现特定功能。本文中,将通过自动化技术,实现在PowerBuilder中调用Excel来实现表格的输出与打印。
关键词 自动化 Excel PowerBuilder 表格
1 问题的提出
在为某企业设计电子图文档管理系统中,用户提出要求,要能够快速输出某些电子表格。在未使用自动化技术之前,该企业使用的是AutoCad软件来一次性将多个表格生成到一个DWG文件中,然后通过绘图仪出图。这种做法的好处在于能够有效的节省企业的开支,一次性生成大量的表格。但是,缺点也是明显的:这种做法欠缺灵活性,当遇到只需要输出少量表格的情况时,做法过于复杂。即这种做法非常适合于大量表格的批量输出,而不适合个别表格的单独输出。正是在这种背景下,我们提出了使用Excel电子表格处理软件来处理该企业的表格输出问题。
Excel软件是专门为处理各式电子表格而设计,它能够非常高效而专业的处理各式表格,并且非常关键的是:它具有表格计算汇总功能,在这一点上,AutoCad软件是无法相比的。另外一个原因,在当前的企业中,打印机的使用日益普及,打印速度也日益加快,当多个用户同时需要打印时,可以通过高速的网络打印机来轻松实现,在这一点上,使用Excel也具有一定的优势。
2 自动化技术
Microsoft公司提供的自动化技术,简单的说,就是将某一个应用程序的功能(可能是一部分)当作一系列的对象来向其他的外部应用程序暴露(Expose),这个外部应用程序就可以使用这些对象,这个过程就被称为自动化(Automation)。例如,Excel,我们可以将它的大部分功能当作一系列对象来加以暴露,然后在另外的应用程序中使用这些对象,这就是使用自动化对象来调用Excel完成指定功能的关键所在。
一个应用程序的可访问对象被称为对象模型(Object Model),如果能够使用自动化来操纵一个程序的对象模型就意味着可以重复使用组件。例如,使用自动化,利用Excel中已经编写和测试好的代码来进行复杂的数学运算,这就省去了程序员亲自动手编写和调试复杂代码的麻烦。
暴露对象的程序被称为服务器(Servers),使用这些对象的程序被称为客户(Clients)。在这里,我们把Excel当作自动化服务器,把我们的PowerBuilder应用程序当作客户,这样就可以通过自动化技术来实现特定的表格生成和打印功能。
在大多数的Office软件中都包含一个Application对象,Excel也不例外,这个对象是Excel对象模式中的基础对象,它包含了许许多多的成员(Member),但是在这里,我们只需要使用到其中的一部分。
3 在PowerBuilder中使用自动化技术
PowerBuider是Sybase公司推出的一种高级数据库应用程序开发环境,在这个环境中开发数据库应用程序,使用其专利技术——DataWindow,可以很轻松的开发出非常专业的数据库应用程序。此外,PowerBuilder还支持多种数据库,能够很轻松的与目前流行的MS SQL Server、Oracle等企业级数据库建立连接,处理各种事务。
PowerBuilder中的编程语言被称为脚本(Script),实际上,使用PowerBuilder编写的程序也是事件驱动,在界面设计上也完全做到了“所见即所得”,并完全使用面向对象的编程思想,它还提供了对OLE、DDE、Automation等技术的支持,下面就来说明如何在PowerBuilder中使用自动化技术。
首先,声明一个OLE对象,
OLEObject OLE_MyExcel
其次,创建该OLE对象,
OLE_MyExcel =Create OLEObject
然后,使用PowerBuilder中的ConnectToNewObject函数来创建一个新的OLE对象,并且连接到该对象上,
OLE_MyExcel. ConnectToNewObject ("excel.Application")
调用该函数时,如果成功的话,返回值是0,否则就意味着调用失败。
到此,自动化的准备工作已经完成,下面是具体的操作过程。
4 处理和打印表格
在调用Excel时,首先需要解决的一个问题是是否让Excel可见,即是否为后台操作。这个问题可以简单的通过设置Visible属性加以控制,如果希望Excel后台运行,可以简单的编写如下语句:
OLE_MyExcel.visible=false
然后是打开指定的XLS文件,具体的语句
OLE_MyExcel.Application.Workbooks.Open ("d:“excel-example.xls")
要操纵数据列表中的数据单元,就必须对ActiveCell对象进行操纵,该对象是Application对象中一项属性。将数据输入到一个数据单元包括两个步骤:第一是选择一个数据单元,第二是将数据传递给它。选择一个数据单元通过调用Range对象的Select()方法就可以完成,Range对象是用来选择一个或多个数据单元的。Select()方法需要起始的行数、列数和结束的行数、列数来确定所选择的数据单元。如果只选择一个单独的数据单元,就可以忽略结束的行、列数。当范围被设定以后,将数据传递给ActiveCell对象(引用了被Range对象指定的数据单元)的FormulaR1C1属性。
OLE_MyExcel.Range("c10").Select()
OLE_MyExcel.ActiveCell.FormulaR1C1 = sle_2.text //Sle_2为一个静态文本框控件
OLE_MyExcel.Range("J10").Select()
……
如果希望得到一系列数值的和,则需要首先使用Select()方法来指定需要求和的Cell的范围,然后指定存放和的Cell位置,最后调用SUM方法即可,
OLE_MyExcel.Range(“A1:D1”).Select()
OLE_MyExcel.Range(“E1”).Activate()
OLE_MyExcel.ActiveCell.FormulaR1C1 = “=SUM(RC[-4]:RC[-1])”
当然还可以进行其他方面的设置,例如把字体设置为粗体(Bold),则可以编写如下代码:
OLE_MyExcel.Range(“A1:E1”).Select()
OLE_MyExcel.Selection.Font.Bold = True
至于其他的设置可以参考相关书籍。
至于表格的打印,则是简单的调用PrintOut()方法即可,但是需要首先指定打印的范围,如下是打印名为“Sheet1”的WorkSheet的代码:
OLE_MyExcel.Worksheets("sheet1").Activate()
OLE_MyExcel.ActiveSheet.PrintOut()
接下来是关于对XLS文件进行了改动以后,在关闭该文件时是否需要向用户提出警告。这个问题只需要简单的对OLE_MyExcel.Application.DisplayAlerts属性进行设置即可,为True时弹出警告框,为False时不弹出警告框,保存所作的修改。
最后一步,在作完所有工作以后,需要关闭自动化对象,撤销与自动化服务器的连接,销毁OLE对象,因为使用自动化程序,尤其是Word或Excel这样的Office程序,所消耗的系统资源是很庞大的,因此在每次工作完成之后,需要释放这部分系统资源。
OLE_MyExcel.Application.quit()
OLE_MyExcel.DisConnectObject()
destroy OLE_MyExcel
5 结束语
在使用了自动化技术以后,完满的解决了原来的表格处理问题,可以非常方便的对各种表格进行小批量的处理与打印,非常灵活。如果能够与企业的数据库结合起来,通过外部程序将数据成批输入,亦可解决大批量数据输出的问题,不失为一条好的解决方案。
在实际应用中,通过与企业数据库相结合,使用此方法自动填写了包含了大量数据的XLS文件,并可以通过打印机打印出来.
参考资料
[1]James Foxall 《Teaching yourself Visual Basic .NET in 24 hours》 Sams 11/2001
梁科山,徐晓军,刘涛 《某企业的PDM系统设计方案书》
PowerBuilder帮助文件