在Oracle中使用PL/SQL操作COM对象(1)(3)
创建Excel对象。
建立表头,设置列宽。
将游标数据传到工作表。
画表格。
设置字体属性。
插入图表。
保存为Excel格式文件,关闭Excel对象。
如下为dp_toExcel存储过程:
CREATE OR REPLACE PROCEDURE dp_ToExcel IS CURSOR c1 IS SELECT ITS_ID,ITS_DATE,ITS_TOTAL FROM IT_SALE_TAB; n BINARY_INTEGER:=2; i BINARY_INTEGER; filename VARCHAR2(255); cellIndex VARCHAR2(40); cellValue VARCHAR2(40); cellColumn VARCHAR2(10); returnedTime VARCHAR2(20); currencyvalue DOUBLE PRECISION; dateValue DATE; xlThin BINARY_INTEGER:=2; xlEdgeLeft BINARY_INTEGER:=7; xlEdgeTop BINARY_INTEGER:=8; xlEdgeBottom BINARY_INTEGER:=9; xlEdgeRight BINARY_INTEGER:=10; xlInsideVertical BINARY_INTEGER:=11; xlInsideHorizontal BINARY_INTEGER:=12; BEGIN i:=oraExcel.CreateExcelWorkSheet(’’); i:=oraExcel.setCellValues(’A2’, ’序号’, ’BSTR’); i:=oraExcel.setCellValues(’B2’, ’日期’, ’BSTR’); i:=oraExcel.setCellValues(’C2’, ’销售’, ’BSTR’); cellValue:=c1_rec.ITS_TOTAL; currencyValue:=cellValue; i:=oraExcel.setCellValuesReal(cellIndex, currencyValue, ’CY’); n:=n+1; END LOOP; i:=oraExcel.setCellValues(’A’||n,’合计’,’BSTR’); i:=oraExcel.setCellValues(’C’||n,’=SUM(C3:C’||to_char(n-1)||’)’,’BSTR’); -- 画表格 i:=oraExcel.setCellLines(’A1:C’||n,xlEdgeLeft,xlThin,’I2’); i:=oraExcel.setCellLines(’A1:C’||n,xlEdgeTop,xlThin,’I2’); i:=oraExcel.setCellLines(’A1:C’||n,xlEdgeBottom,xlThin,’I2’); i:=oraExcel.setCellLines(’A1:C’||n,xlEdgeRight,xlThin,’I2’); i:=oraExcel.setCellLines(’A1:C’||n,xlInsideVertical,xlThin,’I2’); i:=oraExcel.setCellLines(’A1:C’||n,xlInsideHorizontal,xlThin,’I2’); -- 设置字体属性 i:=oraExcel.setCellFont(’A1:C1’,’Size’,20,’I2’); i:=oraExcel.setCellFont(’A1:C1’,’Bold’,1,’I2’); i:=oraExcel.callMethod(’A1:C1’,’Merge’); -- 合并单元格 i:=oraExcel.setCellValues(’A1:C1’,’合计’,’BSTR’); -- 插入图表 i:=oraExcel.setCellColWidth(’B:B’, 12.75,’CY’); -- 设置列宽 i:=oraExcel.setCellColWidth(’C:C’, 12.75,’CY’); n:=3; For c1_rec IN c1 LOOP cellColumn:=TO_CHAR(n); cellIndex:= ’A’||cellColumn; cellValue:= TO_CHAR(c1_rec.ITS_ID); i:=oraExcel.setCellValues(cellIndex, cellValue, ’BSTR’); cellIndex:= ’B’ || cellColumn; dateValue:=c1_rec.ITS_DATE; i:=oraExcel.setCellValues(cellIndex, dateValue, ’DATE’); cellIndex:= ’C’ || cellColumn; i:=oraExcel.InsertChart(350,200,250,250,’C3:C’||TO_CHAR(n-1),’xlPie’); SELECT TO_CHAR(SYSDATE, ’HH24MISS’) INTO returnedTime FROM dual; filename:=’D:\testExcel’ || returnedTime || ’.xls’; i:=oraExcel.SaveToFile(filename); -- 保存文件 i:=oraExcel.closeExcel(); -- 关闭对象 END; |
小结
本文介绍如何从PL/SQL中直接调用C程序的外部例程,并以操作Excel对象为示例。在调用该外部例程时,有如下相关的限制:
操作系统必需支持动态链接库(DLL)和共享库功能。
监听器和extproc进程必须运行在数据库所在的同一台机子上,不支持远程数据库。
extproc唯一支持的是C例程,但可以通过先调用C外部例程去使用其它对象(如:COM对象)。
除了限制外,调用外部例程会引起额外的系统资源开销,在使用外部例程之前要考虑是否一定要用到外部例程。
(责任编辑:铭铭 mingming_ky@126.com TEL:(010)68476636)



