在Oracle中使用PL/SQL操作COM对象(三)

日期: 2008-06-16 作者:chanet 来源:TechTarget中国

  成功创建oraExcel包后,最后创建使用包的存储过程,实现把数据表里的字符型、日期型和数值型分别传到Excel工作表里,对数值型数据进行统计和使用Excel中的图表。该过程具体操作步骤为:  



  • 创建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对象)。


  除了限制外,调用外部例程会引起额外的系统资源开销,在使用外部例程之前要考虑是否一定要用到外部例程。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

作者

chanet
chanet

相关推荐