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
相关产品推荐
相关产品推荐

