龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 数据库类 > Oracle 技术 >

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

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
-- 销售表(脚本) CREATE TABLE IT_SALE_TAB(ITS_ID VARCHAR2(5),ITS_DATE DATE,ITS_TOTAL NUMBER); INSERT INTO IT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL) VALUES(’1’,TO_DATE(’2004-01-01’,’YYYY

-- 销售表(脚本)

CREATE TABLE IT_SALE_TAB(ITS_ID VARCHAR2(5),ITS_DATE DATE,ITS_TOTAL NUMBER); 
INSERT INTO IT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL) 
VALUES(’1’,TO_DATE(’2004-01-01’,’YYYY-MM-DD’),250); 
INSERT INTO IT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL) 
VALUES(’2’,TO_DATE(’2004-02-01’,’YYYY-MM-DD’),150); 
INSERT INTO IT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL) 
VALUES(’3’,TO_DATE(’2004-03-01’,’YYYY-MM-DD’),80); 
INSERT INTO IT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL) 
VALUES(’4’,TO_DATE(’2004-04-01’,’YYYY-MM-DD’),96); 
INSERT INTO IT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL) 
VALUES(’5’,TO_DATE(’2004-05-01’,’YYYY-MM-DD’),300); 
INSERT INTO IT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL) 
VALUES(’6’,TO_DATE(’2004-06-01’,’YYYY-MM-DD’),210); 
INSERT INTO IT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL) 
VALUES(’7’,TO_DATE(’2004-07-01’,’YYYY-MM-DD’),320); 
INSERT INTO IT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL) 
VALUES(’8’,TO_DATE(’2004-08-01’,’YYYY-MM-DD’),280); 

INSERT INTO IT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL) 
VALUES(’9’,TO_DATE(’2004-09-01’,’YYYY-MM-DD’),276); 
INSERT INTO IT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL) 
VALUES(’10’,TO_DATE(’2004-10-01’,’YYYY-MM-DD’),368); 
INSERT INTO IT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL) 
VALUES(’11’,TO_DATE(’2004-11-01’,’YYYY-MM-DD’),163); 
INSERT INTO IT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL) 
VALUES(’12’,TO_DATE(’2004-12-01’,’YYYY-MM-DD’),305); 
COMMIT;  

操作Excel对象包(Package)。 

CREATE OR REPLACE PACKAGE oraExcel IS 
xlThin BINARY_INTEGER DEFAULT 2; 
DummyToken BINARY_INTEGER; 
applicationToken BINARY_INTEGER:=-1; -- Excel对象句柄 
WorkBooksToken BINARY_INTEGER:=-1; -- 工作簿句柄 
WorkBookToken BINARY_INTEGER:=-1; 
WorkSheetToken BINARY_INTEGER:=-1; -- 工作表句柄 
WorkSheetToken1 BINARY_INTEGER:=-1; 
RangeToken BINARY_INTEGER:=-1; -- Range区句柄 
ChartObjectToken BINARY_INTEGER:=-1; -- 图表对象句柄 
ChartObject1 BINARY_INTEGER:=-1; 
Chart1Token BINARY_INTEGER:=-1; 
hLines BINARY_INTEGER:=-1; 
i BINARY_INTEGER; 
err_src VARCHAR2(255); 
err_desc VARCHAR2(255); 
err_hpf VARCHAR2(255); 
err_hpID BINARY_INTEGER; 
-- 创建Excel对象 
FUNCTION CreateExcelWorkSheet(servername VARCHAR2) RETURN BINARY_INTEGER; 
-- 插入数据(字符型) 
FUNCTION setCellValues(RANGE VARCHAR2,data VARCHAR2,TYPE VARCHAR2) 
RETURN BINARY_INTEGER; 
-- 插入数据(日期型) 
FUNCTION setCellValues(RANGE VARCHAR2,data DATE,TYPE VARCHAR2) 
RETURN BINARY_INTEGER; 
-- 插入数据(整型) 
FUNCTION setCellValues(RANGE VARCHAR2,data BINARY_INTEGER,TYPE VARCHAR2) 
RETURN BINARY_INTEGER; 
-- 插入数据(实型) 
FUNCTION setCellValuesReal(RANGE VARCHAR2,data DOUBLE PRECISION,TYPE VARCHAR2) 

RETURN BINARY_INTEGER; 
-- 设置列宽 
FUNCTION setCellColWidth(RANGE VARCHAR2,width DOUBLE PRECISION,TYPE VARCHAR2) RETURN 
BINARY_INTEGER; 
-- 设置表格 
FUNCTION setCellLines(RANGE VARCHAR2,BordersIndex BINARY_INTEGER,weight 
BINARY_INTEGER DEFAULT xlThin,TYPE VARCHAR2) RETURN BINARY_INTEGER; 
-- 合并单元格 
FUNCTION setCellMerge(RANGE VARCHAR2,bValues BOOLEAN,TYPE VARCHAR2) 
RETURN BINARY_INTEGER; 
-- 设置字体属性 
FUNCTION setCellFont(RANGE VARCHAR2,Property VARCHAR2, 
fontValues BINARY_INTEGER,TYPE VARCHAR2) RETURN BINARY_INTEGER; 
-- 调用方法 
FUNCTION callMethod(RANGE VARCHAR2,MethodName VARCHAR2) RETURN BINARY_INTEGER; 
-- 插入图表 
FUNCTION InsertChart(xpos BINARY_INTEGER,ypos BINARY_INTEGER, 
width BINARY_INTEGER,height BINARY_INTEGER, 
RANGE VARCHAR2,TYPE VARCHAR2) RETURN BINARY_INTEGER; 
-- 保存文件 
FUNCTION SaveToFile(filename VARCHAR2) RETURN BINARY_INTEGER; 
-- 关闭Excel对象 
FUNCTION CloseExcel RETURN BINARY_INTEGER; 
END oraExcel;  

数据包体内容(PACKAGE BODY) 

CREATE OR REPLACE PACKAGE BODY oraExcel IS 
FUNCTION CreateExcelWorkSheet(servername VARCHAR2) RETURN BINARY_INTEGER IS 
BEGIN 
-- 创建Excel对象 
i:=ordcom.CreateObject(’Excel.Application’, 0, servername,applicationToken); 
IF (i!=0) THEN -- 创建失败,提示返回的错误信息 
ordcom.GetLastError(err_src, err_desc, err_hpf, err_hpID); 
raise_application_error(-20000,err_src || err_desc || err_hpf || err_hpID); 
END IF; 
-- 通过程序对象句柄获取工作簿句柄 
i:=ordcom.GetProperty(applicationToken, ’WorkBooks’, 0, WorkBooksToken); 
ordcom.InitArg(); 
ordcom.SetArg(-4167,’I4’); 
i:=ordcom.Invoke(WorkBooksToken, ’Add’, 1, WorkBookToken); 
ordcom.InitArg(); 
ordcom.SetArg(’Sheet 1’,’BSTR’); 

-- 获取工作表句柄 
i:=ordcom.GetProperty(applicationToken, ’WorkSheets’, 0, WorkSheetToken1); 
i:=ordcom.Invoke(WorkSheetToken1, ’Add’, 0, WorkSheetToken); 
RETURN i; 
END CreateExcelWorkSheet; 
FUNCTION setCellValues(RANGE VARCHAR2,data VARCHAR2, TYPE VARCHAR2) 
RETURN BINARY_INTEGER IS 
BEGIN 
ordcom.InitArg(); 
ordcom.SetArg(RANGE,’BSTR’); 
-- 获取Range区句柄,之后将数据写入到指定的单元格 
i:=ordcom.GetProperty(WorkSheetToken, ’Range’, 1, RangeToken); 
i:=ordcom.SetProperty(RangeToken, ’Value’, data, TYPE); 
i:=ordcom.DestroyObject(RangeToken); 
RETURN i; 
END setCellValues; 
FUNCTION setCellValues(RANGE VARCHAR2,data BINARY_INTEGER,TYPE VARCHAR2) 
RETURN BINARY_INTEGER IS 
BEGIN 
ordcom.InitArg(); 
ordcom.SetArg(RANGE, ’BSTR’); 
i:=ordcom.GetProperty(WorkSheetToken, ’Range’, 1, RangeToken); 
i:=ordcom.SetProperty(RangeToken, ’Value’, data, type); 
i:=ordcom.DestroyObject(RangeToken); 
RETURN i; 
END setCellValues; 
FUNCTION setCellValuesReal(RANGE VARCHAR2,data DOUBLE PRECISION,TYPE VARCHAR2) 
RETURN BINARY_INTEGER IS 
BEGIN 
ordcom.InitArg(); 
ordcom.SetArg(RANGE, ’BSTR’); 
i:=ordcom.GetProperty(WorkSheetToken, ’Range’, 1, RangeToken); 
i:=ordcom.SetProperty(RangeToken, ’Value’, data, type); 
i:=ordcom.DestroyObject(RangeToken); 
RETURN i; 
END setCellValuesReal; 
FUNCTION setCellValues(RANGE VARCHAR2,data DATE,TYPE VARCHAR2) 
RETURN BINARY_INTEGER IS 
BEGIN 
ordcom.InitArg(); 
ordcom.SetArg(RANGE, ’BSTR’); 
i:=ordcom.GetProperty(WorkSheetToken, ’Range’, 1, RangeToken); 
i:=ordcom.SetProperty(RangeToken, ’Value’, data, TYPE); 
i:=ordcom.DestroyObject(RangeToken); 

RETURN i; 
END setCellColWidth; 
FUNCTION setCellMerge(RANGE VARCHAR2,bValues BOOLEAN,TYPE VARCHAR2) 
RETURN i; 
END setCellValues; 
FUNCTION setCellColWidth(RANGE VARCHAR2,width DOUBLE PRECISION,TYPE VARCHAR2) 
RETURN BINARY_INTEGER IS 
BEGIN 
ordcom.InitArg(); 
ordcom.SetArg(RANGE,’BSTR’); 
i:=ordcom.GetProperty(WorkSheetToken,’Range’,1,RangeToken); 
i:=ordcom.SetProperty(RangeToken,’ColumnWidth’,width,TYPE); 
i:=ordcom.DestroyObject(RangeToken); 
RETURN BINARY_INTEGER IS 
BEGIN 
ordcom.InitArg(); 
ordcom.SetArg(RANGE,’BSTR’); 
i:=ordcom.GetProperty(WorkSheetToken,’Range’,1,RangeToken); 
i:=ordcom.SetProperty(RangeToken,’MergeCells’,bValues,’BOOLEAN’); 
i:=ordcom.DestroyObject(RangeToken); 
RETURN i; 
END setCellMerge; 
FUNCTION setCellLines(RANGE VARCHAR2,BordersIndex BINARY_INTEGER, 
weight BINARY_INTEGER DEFAULT xlThin,TYPE VARCHAR2) RETURN BINARY_INTEGER IS 
BEGIN 
ordcom.InitArg(); 
ordcom.SetArg(RANGE,’BSTR’); 
i:=ordcom.GetProperty(WorkSheetToken,’Range’,1,RangeToken); 
ordcom.InitArg(); 
ordcom.SetArg(BordersIndex,TYPE); -- 画表格的具体载入参数 
i:=ordcom.GetProperty(RangeToken,’Borders’,1,hLines); 
i:=ordcom.SetProperty(hLines,’weight’,weight,TYPE); 
i:=ordcom.DestroyObject(hLines); 
i:=ordcom.DestroyObject(RangeToken); 
RETURN i; 
END setCellLines; 
FUNCTION setCellFont(RANGE VARCHAR2,Property VARCHAR2,fontValues BINARY_INTEGER,TYPE 
VARCHAR2) RETURN BINARY_INTEGER IS 
BEGIN 
ordcom.InitArg(); 
ordcom.SetArg(RANGE,’BSTR’); 
i:=ordcom.GetProperty(WorkSheetToken,’Range’,1,RangeToken); 
ordcom.InitArg(); 
ordcom.SetArg(Property,TYPE); 

ordcom.InitArg(); 
i:=ordcom.GetProperty(WorkSheetToken, ’ChartObjects’, 0, ChartObjectToken); 
ordcom.InitArg(); 
ordcom.SetArg(xpos,’I2’); -- 载入图表对象位置参数 
ordcom.SetArg(ypos,’I2’); 
ordcom.SetArg(width,’I2’); 
ordcom.SetArg(height,’I2’); 
i:=ordcom.Invoke(ChartObjectToken, ’Add’, 4, ChartObject1); -- 添加图表 
i:=ordcom.GetProperty(ChartObject1, ’Chart’, 0,Chart1Token); 
ordcom.InitArg(); 
ordcom.SetArg(RANGE, ’BSTR’); 
i:=ordcom.GetProperty(WorkSheetToken,’Range’, 1, RangeToken); -- 选取区域 
ordcom.InitArg(); 
ordcom.SetArg(RangeToken, ’DISPATCH’); 
IF TYPE=’xlPie’ THEN 
charttype := -4102; 
ELSIF TYPE=’xl3DBar’ THEN 
charttype := -4099; 
ELSIF TYPE=’xlBar’ THEN 
charttype := 2; 
ELSIF TYPE=’xl3dLine’ THEN 
i:=ordcom.GetProperty(RangeToken,’Font’,0,hLines); -- 获取字体对象 
i:=ordcom.SetProperty(hLines,Property,fontValues,TYPE); 
i:=ordcom.DestroyObject(hLines); 
i:=ordcom.DestroyObject(RangeToken); 
RETURN i; 
END; 
FUNCTION callMethod(RANGE VARCHAR2,MethodName VARCHAR2) RETURN BINARY_INTEGER IS 
reti BINARY_INTEGER := -1; 
BEGIN 
ordcom.InitArg(); 
ordcom.SetArg(RANGE,’BSTR’); 
i:=ordcom.GetProperty(WorkSheetToken,’Range’,1,RangeToken); 
ordcom.InitArg(); 
i:=ordcom.Invoke(RangeToken,MethodName,0,reti); -- 调用对象的方法 
i:=ordcom.DestroyObject(RangeToken); 
RETURN reti; 
END; 
FUNCTION InsertChart(xpos BINARY_INTEGER, ypos BINARY_INTEGER, 
width BINARY_INTEGER, height BINARY_INTEGER, 
RANGE VARCHAR2, TYPE VARCHAR2) 
RETURN BINARY_INTEGER IS 
charttype BINARY_INTEGER:= -4099; 
BEGIN 

charttype:= -4101; 
END IF; 
ordcom.SetArg(charttype,’I4’); 
i:=ordcom.Invoke(Chart1Token,’ChartWizard’, 2, DummyToken); 
i:=ordcom.DestroyObject(RangeToken); 
i:=ordcom.DestroyObject(ChartObjectToken); 
i:=ordcom.DestroyObject(ChartObject1); 
i:=ordcom.DestroyObject(Chart1Token); 
RETURN i; 
END InsertChart; 
FUNCTION SaveToFile(filename VARCHAR2) RETURN BINARY_INTEGER IS 
BEGIN 
ordcom.InitArg(); 
ordcom.SetArg(filename,’BSTR’); 
i:=ordcom.Invoke(WorkBookToken, ’SaveAs’, 1, DummyToken); -- 保存文件 
IF (i!=0) THEN 
ordcom.GetLastError(err_src, err_desc, err_hpf, err_hpID); 
raise_application_error(-20000,err_src || err_desc || err_hpf || err_hpID); 
END IF; 
RETURN i; 
END SaveToFile; 
FUNCTION CloseExcel RETURN BINARY_INTEGER IS 
BEGIN 
ordcom.InitArg(); 
ordcom.InitArg(); 
ordcom.SetArg(FALSE,’BOOL’); 
i:=ordcom.Invoke(WorkBookToken, ’Close’, 0, DummyToken); 
i:=ordcom.DestroyObject(WorkBookToken); 
ordcom.InitArg(); 
i:=ordcom.Invoke(WorkBooksToken, ’Close’, 0, DummyToken); 
i:=ordcom.DestroyObject(WorkBooksToken); 
i:=ordcom.Invoke(applicationToken, ’Quit’, 0, DummyToken); 
-- 关闭所有句柄 
i:=ordcom.DestroyObject(WorkSheetToken); 
i:=ordcom.DestroyObject(WorkSheetToken1); 
i:=ordcom.DestroyObject(applicationToken); 
i:=ordcom.DestroyObject(ChartObjectToken); 
i:=ordcom.DestroyObject(Chart1Token); 
i:=ordcom.DestroyObject(hLines); 
i:=ordcom.DestroyObject(ChartObject1); 
i:=ordcom.DestroyObject(dummyToken); 
RETURN i; 
END CloseExcel; 
END oraExcel;

精彩图集

赞助商链接