You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle Forms 12c使用Client_OLE2导出数据到Excel的示例过程求助

Oracle Forms 12c Client_OLE2 导出数据到Excel 示例实现

注意:Client_OLE2为Forms客户端侧OLE操作接口,所有Excel操作均在客户端本地执行,不占用应用服务器资源,使用前需确认客户端已安装Excel程序。

前置配置

  • 需在Forms配置文件formsweb.cfg中添加参数allowOleAutomation=true,重启Forms服务后OLE功能方可正常调用
  • 若需用户自主选择保存路径,可使用Forms内置函数GET_FILE_NAME('Excel 文件|*.xlsx', '选择保存路径')获取用户指定的文件路径

示例存储过程

以下代码可封装为Forms程序单元,也可直接写在按钮的WHEN-BUTTON-PRESSED触发器中使用:

PROCEDURE export_to_excel IS
    -- OLE对象定义
    v_application OLE2.OBJ_TYPE;
    v_workbooks OLE2.OBJ_TYPE;
    v_workbook OLE2.OBJ_TYPE;
    v_worksheets OLE2.OBJ_TYPE;
    v_worksheet OLE2.OBJ_TYPE;
    v_range OLE2.OBJ_TYPE;
    
    -- 业务数据游标,可替换为实际业务查询
    CURSOR cur_emp_data IS
        SELECT empno, ename, job, hiredate, sal, deptno 
        FROM emp;
    v_row_num NUMBER := 1;
BEGIN
    -- 启动Excel应用进程
    v_application := OLE2.CREATE_OBJ('Excel.Application');
    -- 调试阶段可设为TRUE显示Excel界面,正式使用建议设为FALSE后台执行
    OLE2.SET_PROPERTY(v_application, 'Visible', FALSE);

    -- 新建空白工作簿
    v_workbooks := OLE2.GET_OBJ_PROPERTY(v_application, 'Workbooks');
    v_workbook := OLE2.INVOKE_OBJ(v_workbooks, 'Add');

    -- 获取第一个工作表并自定义名称
    v_worksheets := OLE2.GET_OBJ_PROPERTY(v_workbook, 'Worksheets');
    v_worksheet := OLE2.GET_OBJ_PROPERTY(v_worksheets, 'Item', 1);
    OLE2.SET_PROPERTY(v_worksheet, 'Name', '员工数据导出');

    -- 写入表头
    OLE2.SET_PROPERTY(OLE2.GET_OBJ_PROPERTY(v_worksheet, 'Cells', v_row_num, 1), 'Value', '员工编号');
    OLE2.SET_PROPERTY(OLE2.GET_OBJ_PROPERTY(v_worksheet, 'Cells', v_row_num, 2), 'Value', '员工姓名');
    OLE2.SET_PROPERTY(OLE2.GET_OBJ_PROPERTY(v_worksheet, 'Cells', v_row_num, 3), 'Value', '岗位');
    OLE2.SET_PROPERTY(OLE2.GET_OBJ_PROPERTY(v_worksheet, 'Cells', v_row_num, 4), 'Value', '入职日期');
    OLE2.SET_PROPERTY(OLE2.GET_OBJ_PROPERTY(v_worksheet, 'Cells', v_row_num, 5), 'Value', '薪资');
    OLE2.SET_PROPERTY(OLE2.GET_OBJ_PROPERTY(v_worksheet, 'Cells', v_row_num, 6), 'Value', '所属部门');

    -- 表头加粗样式设置
    v_range := OLE2.GET_OBJ_PROPERTY(v_worksheet, 'Range', 'A1:F1');
    OLE2.SET_PROPERTY(OLE2.GET_OBJ_PROPERTY(v_range, 'Font'), 'Bold', TRUE);
    OLE2.RELEASE_OBJ(v_range);

    v_row_num := v_row_num + 1;

    -- 循环写入业务数据
    FOR rec IN cur_emp_data LOOP
        OLE2.SET_PROPERTY(OLE2.GET_OBJ_PROPERTY(v_worksheet, 'Cells', v_row_num, 1), 'Value', rec.empno);
        OLE2.SET_PROPERTY(OLE2.GET_OBJ_PROPERTY(v_worksheet, 'Cells', v_row_num, 2), 'Value', rec.ename);
        OLE2.SET_PROPERTY(OLE2.GET_OBJ_PROPERTY(v_worksheet, 'Cells', v_row_num, 3), 'Value', rec.job);
        OLE2.SET_PROPERTY(OLE2.GET_OBJ_PROPERTY(v_worksheet, 'Cells', v_row_num, 4), 'Value', TO_CHAR(rec.hiredate, 'yyyy-mm-dd'));
        OLE2.SET_PROPERTY(OLE2.GET_OBJ_PROPERTY(v_worksheet, 'Cells', v_row_num, 5), 'Value', rec.sal);
        OLE2.SET_PROPERTY(OLE2.GET_OBJ_PROPERTY(v_worksheet, 'Cells', v_row_num, 6), 'Value', rec.deptno);
        v_row_num := v_row_num + 1;
    END LOOP;

    -- 自动适配列宽
    v_range := OLE2.GET_OBJ_PROPERTY(v_worksheet, 'UsedRange');
    v_range := OLE2.GET_OBJ_PROPERTY(v_range, 'EntireColumn');
    OLE2.INVOKE(v_range, 'AutoFit');

    -- 保存文件,路径可替换为用户自定义路径
    OLE2.INVOKE(v_workbook, 'SaveAs', 'C:\export\员工数据.xlsx');

    -- 正常释放OLE对象,避免Excel进程残留
    OLE2.INVOKE(v_workbook, 'Close');
    OLE2.INVOKE(v_application, 'Quit');

    OLE2.RELEASE_OBJ(v_range);
    OLE2.RELEASE_OBJ(v_worksheet);
    OLE2.RELEASE_OBJ(v_worksheets);
    OLE2.RELEASE_OBJ(v_workbook);
    OLE2.RELEASE_OBJ(v_workbooks);
    OLE2.RELEASE_OBJ(v_application);

    MESSAGE('导出成功,文件已保存至C:\export\员工数据.xlsx');
EXCEPTION
    WHEN OTHERS THEN
        -- 异常场景强制释放资源
        IF NOT OLE2.IS_NULL(v_application) THEN
            OLE2.INVOKE(v_application, 'Quit');
            OLE2.RELEASE_OBJ(v_application);
        END IF;
        MESSAGE('导出失败,错误信息:'||SQLERRM);
END export_to_excel;

常见优化点

  • 数据量大于1000行时,建议使用数组批量赋值的方式写入Excel,可大幅提升导出效率
  • 可按需扩展样式设置,比如单元格背景色、对齐方式、数字格式等,均通过OLE2操作对应Excel属性即可实现
  • 导出前可增加数据量校验,避免数据量过大导致客户端卡顿

内容的提问来源于stack exchange,提问作者Deva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 00:06:09