原文地址: https://synuora.hashnode.dev/apex-emailing-classic-report-region-as-an-attachment # APEX:将经典报表区域作为邮件附件发送 ![APEX: Emailing Classic Report Region as an Attachment](https://synuora.hashnode.dev/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fstock%2Funsplash%2FvSlCNmZdjHQ%2Fupload%2F7af8826d585b9d23c13c8311ed9a5e36.jpeg&w=3840&q=75) ## 背景 在内部讨论中,我被要求排查邮件发送失败的原因,同时用户提出需求:"如何将当前看到的报表结果通过邮件发送给他人?"。交互式报表和网格可以通过内置功能实现,但经典报表需要额外开发。 ## 实现步骤 ### 创建经典报表区域 1. 为报表区域设置静态ID:`emp_region` ![设置静态ID](https://cdn.hashnode.com/res/hashnode/image/upload/v1770977137409/9745abd4-c18c-4f90-9d68-52696392a16f.png) ### 添加操作按钮 添加按钮和动态动作,点击时执行服务器端PL/SQL代码: ![添加按钮](https://cdn.hashnode.com/res/hashnode/image/upload/v1770977586653/a00d6db8-07b0-4a57-b980-13443771d731.png) ### 关键API说明 1. `APEX_REGION.EXPORT_DATA` - 导出区域数据 2. `APEX_DATA_EXPORT` 数据类型 - 定义导出格式常量 3. `APEX_MAIL.ADD_ATTACHMENT` - 添加邮件附件 ```sql DECLARE l_export apex_data_export.t_export; l_region_id number; l_email_id number; BEGIN SELECT region_id into l_region_id FROM apex_application_page_regions WHERE application_id = :APP_ID and page_id = :APP_PAGE_ID and static_id = 'emp_region'; l_export := apex_region.export_data ( p_format => apex_data_export.c_format_xlsx, p_page_id => :APP_PAGE_ID, p_region_id => l_region_id ); ``` ### 完整实现代码 ```sql DECLARE l_export apex_data_export.t_export; l_region_id number; l_email_id number; BEGIN SELECT region_id into l_region_id FROM apex_application_page_regions WHERE application_id = :APP_ID and page_id = :APP_PAGE_ID and static_id = 'emp_region'; l_export := apex_region.export_data ( p_format => apex_data_export.c_format_xlsx, p_page_id => :APP_PAGE_ID, p_region_id => l_region_id ); l_email_id := apex_mail.send( p_to => 'sydney.nurse@oracle.com', p_from => 'no_reply@appsamples.apex', p_subj => 'Employee Search Export', p_body => 'See Attachment' ); apex_mail.add_attachment( p_mail_id => l_email_id, p_attachment => l_export.content_blob, p_filename => 'Employee_Search_Export.xlsx', p_mime_type => l_export.mime_type ); apex_mail.push_queue; END; ``` ![邮件结果](https://cdn.hashnode.com/res/hashnode/image/upload/v1770981899262/db5f3369-f8e0-4b3b-aa46-2a29dae0ef3d.png) ## 总结 作者还开发了一个示例插件,可在GitHub获取:[email-classic-report-view](https://github.com/SyNuOra/PubWork/tree/main/APEX/plugins/email-classic-report-view)。