如何在APEX中创建含双工作表的报表并导出为同份Excel的双工作表
APEX导出多工作表到同一Excel文件详细步骤
一、准备两个报表的数据源
先写好你要导出的两组数据对应的SQL查询,确保在APEX中能正常返回结果。示例:
- 工作表1(员工数据):
SELECT emp_id, emp_name, dept FROM emp - 工作表2(部门数据):
SELECT dept_id, dept_name, location FROM dept
二、在页面添加导出按钮
- 打开目标APEX页面的页面设计器
- 左侧面板找到「按钮」,点击「创建」→「按钮」
- 填写按钮属性:
- 名称:设为英文标识(如
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文件
四、权限设置与测试
- 确保当前APEX用户拥有
APEX_EXCEL相关权限(管理员账号默认具备,普通用户需联系管理员授予) - 保存页面,运行后点击导出按钮,检查下载的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
相关产品推荐
相关产品推荐

