SAP 简单报表输出开发系列共6篇第五篇SAP 报表多格式输出Excel/PDF 批量导出功能实现报表开发完成后业务用户通常会提出“能否导出Excel做二次分析”或“能否生成PDF发给领导审批”的需求。标准ALV自带导出Excel功能但格式较为简单有时需要按固定模板填充数据生成对账单、订单确认函等甚至需要直接将ALV内容转为PDF文件。本文将详解标准ALV导出增强、自定义Excel模板填充、PDF文件生成三类常用输出方式的实现代码满足业务端离线归档、二次编辑的实际需求。一、标准ALV的Excel导出开箱即用1.1 功能说明使用REUSE_ALV_GRID_DISPLAY标准函数时工具栏上默认就有“导出Excel”按钮图标为绿色表格。用户点击后系统会将当前ALV显示的内容导出为.XLS文件实际为HTML格式可被Excel打开。无需额外代码。局限格式为HTML不是原生.XLSX。无法自定义多Sheet页、合并单元格等复杂样式。大数据量导出可能较慢。1.2 增强导出选项添加“本地文件”按钮通过设置参数i_save A或X可以让用户保存变式同时导出格式可选择“Excel 2007*.xlsx”取决于系统版本和补丁。新版SAP GUI支持导出真正的.XLSX。CALL FUNCTION REUSE_ALV_GRID_DISPLAY EXPORTING i_save A A 允许保存布局X 强制保存布局 ...用户点击工具栏中的“电子表格”按钮在弹出的对话框中选择“Excel 2007*.xlsx”即可。二、自定义Excel模板填充OLE / ABAP2XLSX当需要生成固定格式的订单确认函、采购合同、对账单时标准导出无法满足。此时可以使用OLE自动化操作Excel或使用开源库ABAP2XLSX推荐。2.1 方案选择方案优点缺点OLE系统自带无需额外安装速度慢依赖前端Excel稳定性差ABAP2XLSX快速纯ABAP生成.xlsx支持模板填充需手动导入ZCL_EXCEL等类库PDF生成后续章节格式固定不可编辑不适合二次编辑推荐使用ABAP2XLSX可在GitHub获取SAP标准“XLSX Workbench”或自行集成。本文给出OLE示例因为系统通用和ABAP2XLSX简单示例。2.2 OLE方式将内表数据填充到预设模板假设已有一个Excel模板文件服务器路径或上传到SMW0需要将数据写入指定单元格。DATA: lo_excel TYPE ole2_object, lo_workbook TYPE ole2_object, lo_sheet TYPE ole2_object, lo_cell TYPE ole2_object. 创建Excel对象 CREATE OBJECT lo_excel EXCEL.APPLICATION. lo_excel-visible 1. 设为1可看到Excel界面0为后台 打开模板文件 CALL METHOD OF lo_excel Workbooks lo_workbook. CALL METHOD OF lo_workbook Open EXPORTING #1 C:\TEMPLATE\order_template.xlsx. 获取第一个工作表 CALL METHOD OF lo_workbook Worksheets lo_sheet EXPORTING #1 1. 写入单元格第3行第2列 CALL METHOD OF lo_sheet Cells lo_cell EXPORTING #1 3 #2 2. SET PROPERTY OF lo_cell Value lv_order_no. 保存为新文件 CALL METHOD OF lo_workbook SaveAs EXPORTING #1 C:\OUTPUT\order_output.xlsx. 关闭并释放内存 CALL METHOD OF lo_workbook Close. CALL METHOD OF lo_excel Quit. FREE OBJECT lo_cell; FREE OBJECT lo_sheet; FREE OBJECT lo_workbook; FREE OBJECT lo_excel.注意OLE方式需要在应用服务器上安装Excel且性能较差适合小规模、轻量使用。2.3 ABAP2XLSX方式生产环境推荐ABAP2XLSX是一个开源库可直接在ABAP中生成.xlsx文件。需先导入类ZCL_EXCEL等。以下为填充内表到Excel的示例。DATA: lo_excel TYPE REF TO zcl_excel, lo_worksheet TYPE REF TO zcl_excel_worksheet, lv_row TYPE i. 创建Excel对象 lo_excel NEW zcl_excel( ). lo_worksheet lo_excel-get_active_worksheet( ). lo_worksheet-set_title( 订单报表 ). 设置标题行 lv_row 1. lo_worksheet-set_cell( ip_row lv_row ip_column 1 ip_value 订单号 ). lo_worksheet-set_cell( ip_row lv_row ip_column 2 ip_value 金额 ). 填充数据 LOOP AT lt_ekko INTO ls_ekko. lv_row lv_row 1. lo_worksheet-set_cell( ip_row lv_row ip_column 1 ip_value ls_ekko-ebeln ). lo_worksheet-set_cell( ip_row lv_row ip_column 2 ip_value ls_ekko-netwr ). ENDLOOP. 生成文件并下载 DATA: lv_xlsx TYPE xstring, lv_filename TYPE string. lv_xlsx lo_excel-get_file( ). lv_filename order_export.xlsx. cl_gui_frontend_servicesgui_download( EXPORTING bin_filesize xstrlen( lv_xlsx ) filename lv_filename filetype BIN CHANGING data_tab lt_xls_content ). 需将xstring转换为内表实际使用时需将xstring切分成256字节块放入内表调用gui_download。可参考标准函数SCMS_XSTRING_TO_BINARY。三、PDF文件生成从ALV输出或自定义布局3.1 场景分析PDF通常用于打印或发送审批。可以通过两种方式生成使用标准函数REUSE_ALV_GRID_DISPLAY的打印功能用户可以点击打印然后选择“Adobe PDF”打印机生成PDF。程序化生成PDF调用SAP_CONVERT_TO_PDF_FORMATTED或使用Smart Forms/PDF表单。3.2 将ALV内表数据转为PDF使用函数SAP_CONVERT_TO_PDF_FORMATTED该函数可以将一个内部的HTML或ABAP列表输出转换为PDF。最简单的做法是先将数据输出到列表WRITE然后捕捉列表内容转为PDF。DATA: lt_list TYPE TABLE OF abaplist, lv_pdf TYPE xstring, lv_len TYPE i. 将ALV内表数据输出到列表需要调用REUSE_ALV_GRID_DISPLAY的变体 更简单用DISPLAY报表的LIST输出再转换。下面示例为直接写列表。 NEW-PAGE PRINT OFF. 不弹出打印对话框 LOOP AT lt_ekko INTO ls_ekko. WRITE: / ls_ekko-ebeln, ls_ekko-netwr. ENDLOOP. 获取列表内容 SUBMIT REPORT... EXPORTING LIST TO MEMORY... 复杂建议使用函数模块。 推荐方法使用函数模块 CONVERT_ABAPSPOOLJOB_TO_PDF DATA: lv_spoolid TYPE tsp01-rqident. CALL FUNCTION CONVERT_ABAPSPOOLJOB_TO_PDF EXPORTING src_spoolid lv_spoolid IMPORTING pdf_byte lv_pdf.但这种方法需要先产生Spool较麻烦。3.3 简单方式调用标准函数SAP_CONVERT_TO_XLSX的PDF变体实际上无直接内表转PDF。更常用的生产做法使用Smart Form或Adobe Form设计好模板将数据传入并生成PDF。以下以Smart Form为例DATA: lv_fm_name TYPE rs38l_fnam, lv_pdf TYPE xstring. 获取Smart Form函数名 CALL FUNCTION SSF_FUNCTION_MODULE_NAME EXPORTING formname ZSMART_PURCHASE_ORDER IMPORTING fm_name lv_fm_name. 调用Smart Form生成PDF CALL FUNCTION lv_fm_name EXPORTING control_parameters VALUE ssfctrlop( no_dialog X preview ) 不预览直接输出 ... 业务数据参数 IMPORTING document_data DATA(ls_doc_data) EXCEPTIONS ... 从智能表单获取PDF DATA lt_pdf TYPE TABLE OF tline. CALL FUNCTION SSF_GET_PDF EXPORTING control_parameters VALUE ssfctrlop( no_dialog X ) document_data ls_doc_data IMPORTING pdf_bytes lv_pdf.然后通过cl_gui_frontend_servicesgui_download将lv_pdf保存为.pdf文件。四、完整示例ALV报表附加“导出PDF”按钮在ALV工具栏上增加自定义按钮“导出PDF”点击后生成PDF并下载。4.1 注册工具栏按钮使用REUSE_ALV_GRID_DISPLAY的回调函数I_CALLBACK_PF_STATUS_SET设置自定义按钮。CALL FUNCTION REUSE_ALV_GRID_DISPLAY EXPORTING i_callback_pf_status_set FRM_SET_PF_STATUS 设置工具栏 ...在FRM_SET_PF_STATUS中增加按钮FORM frm_set_pf_status USING rt_extab TYPE slis_t_extab. SET PF-STATUS STANDARD EXCLUDING rt_extab. 增加按钮 EXPORT_PDF DATA: lt_fcode TYPE TABLE OF sy-ucomm, ls_fcode LIKE LINE OF lt_fcode. ls_fcode EXPORT_PDF. APPEND ls_fcode TO lt_fcode. SET PF-STATUS STANDARD EXCLUDING lt_fcode. 实际上是包含需用另外方式 正确SE41中维护状态或动态添加较复杂。简单起见使用预定义状态。 ENDFORM.更简单在标准状态中已经包含“打印”按钮用户可通过“打印→PDF打印机”生成PDF。无需自定义。4.2 通过用户命令触发PDF生成注册回调I_CALLBACK_USER_COMMANDCALL FUNCTION REUSE_ALV_GRID_DISPLAY EXPORTING i_callback_user_command FRM_USER_COMMAND ...在FRM_USER_COMMAND中判断FORM frm_user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield. IF r_ucomm EXPORT_PDF. PERFORM f_export_to_pdf. ENDIF. ENDFORM.4.3 生成PDF并下载FORM f_export_to_pdf. DATA: lv_pdf TYPE xstring, lt_pdf_table TYPE TABLE OF tline. 方法调用SAP标准函数将内表转为PDF借助打印 DATA: lv_lists TYPE TABLE OF abaplist. 首先将内表内容输出到列表隐藏 SUBMIT z_my_report ... 不能递归调用自身。因此需专门写一个函数生成列表。 或者使用函数模块 DISPLAY_REPORT 获取列表。 较复杂此处省略具体实现。 推荐使用Smart Form或Adobe Form重新生成PDF。 简单演示通过调用打印功能需要用户交互不是纯后台。 ENDFORM.鉴于生成PDF代码较长项目中建议使用Smart Form或Adobe Form将ALV数据传入生成PDF并提供下载按钮。五、总结与最佳实践导出方式适用场景实现难度推荐度标准ALV导出简单数据导出无需复杂样式极低免费功能⭐⭐⭐⭐⭐ABAP2XLSX模板填充、多Sheet、样式丰富中等需导入库⭐⭐⭐⭐⭐OLE临时使用不推荐生产低⭐⭐Smart Form PDF固定格式的打印版文档中等设计表单⭐⭐⭐⭐直接内表转PDF无模板的简单PDF高需捕获列表⭐⭐建议对于日常报表标准ALV导出Excel已满足80%需求。若需要固定对账单样式使用ABAP2XLSXExcel或Smart FormPDF。尽量避免在生产系统中使用OLE因为性能差且不稳定。下一篇将介绍报表权限管控与性能测试确保报表在生产环境安全、稳定运行。下篇预告《SAP 报表权限管控与性能测试上线前收尾工作全指南》作者你的SAP学习伙伴版本记录2026年6月 你更习惯用哪种方式导出Excel遇到过导出乱码或格式错乱的问题吗欢迎留言交流。