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

如何在APEX中创建含双工作表的报表并导出为同份Excel的双工作表

APEX导出多工作表到同一Excel文件详细步骤

一、准备两个报表的数据源

先写好你要导出的两组数据对应的SQL查询,确保在APEX中能正常返回结果。示例:

  • 工作表1(员工数据):SELECT emp_id, emp_name, dept FROM emp
  • 工作表2(部门数据):SELECT dept_id, dept_name, location FROM dept

二、在页面添加导出按钮

  1. 打开目标APEX页面的页面设计器
  2. 左侧面板找到「按钮」,点击「创建」→「按钮」
  3. 填写按钮属性:
    • 名称:设为英文标识(如BTN_EXPORT_EXCEL,避免中文)
    • 标签:导出双工作表Excel(用户易懂即可)
    • 位置:选页面顶部工具栏或报表上方,方便操作
    • 动作:选择「执行PL/SQL代码」(新手优先用这个,最稳定)

三、编写核心PL/SQL导出代码

在按钮的「执行PL/SQL代码」编辑框中,粘贴以下代码**(注意替换成你自己的SQL查询和对应表头)**:

DECLARE
  l_workbook  apex_excel.t_workbook;
  l_worksheet apex_excel.t_worksheet;
BEGIN
  -- 初始化Excel工作簿
  apex_excel.initialize_workbook(p_workbook => l_workbook);

  -- 创建第一个工作表:员工数据
  l_worksheet := apex_excel.add_worksheet(p_workbook => l_workbook, p_name => '员工表');
  -- 写入表头
  apex_excel.add_row(p_workbook => l_workbook, p_worksheet => l_worksheet);
  apex_excel.cell(p_workbook => l_workbook, p_worksheet => l_worksheet, p_column => 1, p_value => '员工ID');
  apex_excel.cell(p_workbook => l_workbook, p_worksheet => l_worksheet, p_column => 2, p_value => '员工姓名');
  apex_excel.cell(p_workbook => l_workbook, p_worksheet => l_worksheet, p_column => 3, p_value => '所属部门');
  -- 循环写入数据行
  FOR rec IN (SELECT emp_id, emp_name, dept FROM emp) LOOP
    apex_excel.add_row(p_workbook => l_workbook, p_worksheet => l_worksheet);
    apex_excel.cell(p_workbook => l_workbook, p_worksheet => l_worksheet, p_column => 1, p_value => rec.emp_id);
    apex_excel.cell(p_workbook => l_workbook, p_worksheet => l_worksheet, p_column => 2, p_value => rec.emp_name);
    apex_excel.cell(p_workbook => l_workbook, p_worksheet => l_worksheet, p_column => 3, p_value => rec.dept);
  END LOOP;

  -- 创建第二个工作表:部门数据
  l_worksheet := apex_excel.add_worksheet(p_workbook => l_workbook, p_name => '部门表');
  -- 写入表头
  apex_excel.add_row(p_workbook => l_workbook, p_worksheet => l_worksheet);
  apex_excel.cell(p_workbook => l_workbook, p_worksheet => l_worksheet, p_column => 1, p_value => '部门ID');
  apex_excel.cell(p_workbook => l_workbook, p_worksheet => l_worksheet, p_column => 2, p_value => '部门名称');
  apex_excel.cell(p_workbook => l_workbook, p_worksheet => l_worksheet, p_column => 3, p_value => '部门位置');
  -- 循环写入数据行
  FOR rec IN (SELECT dept_id, dept_name, location FROM dept) LOOP
    apex_excel.add_row(p_workbook => l_workbook, p_worksheet => l_worksheet);
    apex_excel.cell(p_workbook => l_workbook, p_worksheet => l_worksheet, p_column => 1, p_value => rec.dept_id);
    apex_excel.cell(p_workbook => l_workbook, p_worksheet => l_worksheet, p_column => 2, p_value => rec.dept_name);
    apex_excel.cell(p_workbook => l_workbook, p_worksheet => l_worksheet, p_column => 3, p_value => rec.location);
  END LOOP;

  -- 触发文件下载
  apex_excel.download(p_workbook => l_workbook, p_file_name => '员工部门数据.xlsx');
END;

代码说明:

  • apex_excel是APEX自带的Excel操作API,无需额外安装
  • 每个工作表通过add_worksheet创建,可自定义工作表名称
  • 先写表头行,再通过循环遍历查询结果写入数据行
  • 最后用download方法生成并下载Excel文件

四、权限设置与测试

  1. 确保当前APEX用户拥有APEX_EXCEL相关权限(管理员账号默认具备,普通用户需联系管理员授予)
  2. 保存页面,运行后点击导出按钮,检查下载的Excel文件是否包含两个工作表,数据是否匹配

五、可选优化(按需调整)

  • 复用交互式报表查询:如果用的是交互式报表,可把循环中的SQL替换为FOR rec IN (SELECT * FROM TABLE(apex_exec.get_rows(p_sql_statement => :P1_IR_SOURCE))) LOOP(需先将交互式报表的源设置为可引用)
  • 美化格式:给表头单元格添加p_format => 'bold'参数,实现表头加粗
  • 格式化特殊字段:日期字段可转成标准格式(如to_char(rec.hire_date, 'YYYY-MM-DD')),数字字段可设置小数位数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 13:05:26