zoukankan      html  css  js  c++  java
  • Oracle中哄骗PL/SQL使用COM对象2

     源头:搜集





       5) 使用Excel示例

       本节引见若何使用COM对象(以Excel对象为例),将数据库里的表记实经由PL/SQL语句输入成Excel文件。经由对象阅读器可以审查Excel对象供应的属性和要领。(如:在Excel菜单,对象 -> 宏 -> 掀开Visual Basic编纂器,在编纂器里,视图 -> 对象阅读器)。

       哄骗Excel对象巨年夜针对单元格举办使用(如,设置第一个单元格字体巨细的代码为:Range("A1").Font.Size = 20)。对应的COM内部例程使用的步骤为:

       1、获取挨次句柄;

       2、获取使命簿句柄;

       3、获取使命表句柄;

       4、获取Range区句柄;

       5、获取Font类句柄;

       6、设置Size属性。

       如下为使用Excel对象的例子,起首设立设置装备布置示例表,然后设立设置装备布置使用包(package),末了是哄骗包函数的过程(procedure)。设立设置装备布置一个测试用表:

       -- 贩卖表(剧本)

    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;

       成功设立设置装备布置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对象)。

       除了限定外,挪用内部例程会惹起额外的系统资源开支,在哄骗内部例程之前要考虑能否必定要用到内部例程。




    版权声明: 原创作品,允许转载,转载时请务必以超链接体例标明文章 原始来由 、作者信息和本声明。不然将清查法则责任。

  • 相关阅读:
    Linux下oracle数据库操作
    springcloud学习一
    nginx反向代理实现前后端分离
    GIT版本控制(码云)
    VUE环境搭建
    线程池的使用
    neo4j图形数据库实战
    idea 下tomcat字符集问题
    webservice客户端生成方式
    Spring声明式事务不回滚的问题
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1976053.html
Copyright © 2011-2022 走看看