
ABAP核心进阶篇120篇ALV报表开发15篇功能进阶篇6篇第四篇ALV数据导出增强——实现Excel/PDF/CSV多格式自定义导出博客标题《ALV数据导出增强实现Excel/PDF/CSV多格式自定义导出》博客简介详解ALV报表的多格式导出方案覆盖标准导出功能增强、自定义Excel模板填充、带样式PDF文件生成、批量导出多页报表的实现代码解决默认导出格式混乱、无法满足业务归档要求的问题。 写在前面ALV报表的标准导出功能虽然方便但往往无法满足业务的个性化需求默认Excel格式混乱、PDF无法满足归档要求、CSV中文乱码、无法批量导出多页报表。本文将详细讲解四种常用的专业导出方案帮助你彻底解决这些痛点。数据导出方案 标准ALV导出工具栏/编程调用 自定义Excel (OLE2)带样式/公式/图表 PDF归档导出Smart Forms CONVERT_OTF CSV数据交换GUI_DOWNLOAD 编码处理快速导出 / 无复杂样式专业报表 / 需样式与公式打印归档 / 页眉页脚系统对接 / 数据交换通过本文的学习你将掌握标准ALV导出功能的增强方法工具栏自定义/编程调用自定义OLE2 Excel导出带样式、公式、单元格合并PDF文件生成Smart Forms CONVERT_OTFCSV导出及中文编码完美处理各方案的适用场景与选型建议一、导出方案对比与决策 1.1 四种方案能力矩阵方案样式能力性能前端依赖归档级别适用场景标准ALV导出基础快无无快速导出、数据检查OLE2 Excel极强慢需安装Excel中复杂报表、领导汇报PDF (Smart Forms)强中无高归档、打印、邮件附件CSV无极快无无数据交换、批量导入 1.2 方案选型决策否是否是是否需要导出数据需要格式化样式数据交换/批量导入CSV 导出 (UTF-8 BOM)标准 ALV 导出需要打印归档或PDF电子签名PDF 导出 (Smart Forms)OLE2 Excel 导出二、方案一标准ALV导出增强 2.1 适用场景快速导出不需要复杂样式开发成本最低。可通过编程方式触发导出避免用户手动操作。 2.2 OO ALV 编程触发导出推荐原理通过模拟ALV工具栏功能码触发标准导出对话框比直接调用call_function更稳定。 触发标准 Excel 导出XXL 格式 go_alv-get_function( )-set_function( i_fcode XXL ). go_alv-get_function( )-trigger_function( i_fcode XXL ). 触发标准 CSV 导出 go_alv-get_function( )-set_function( i_fcode CSV ). go_alv-get_function( )-trigger_function( i_fcode CSV ). 触发标准 PDF 导出需要安装 ADS 或配置前端PDF打印机 go_alv-get_function( )-set_function( i_fcode PDF ). go_alv-get_function( )-trigger_function( i_fcode PDF ).注意上述代码会调出系统的标准文件保存对话框用户体验与点击工具栏按钮一致最为可靠。三、方案二自定义Excel导出OLE2 3.1 适用场景需要复杂样式、公式、合并单元格的专业Excel报表适合汇报材料。 3.2 完整代码示例已优化资源释放REPORT zmm_po_export_ole2. TYPES: BEGIN OF ty_po_data, ebeln TYPE ekko-ebeln, erdat TYPE ekko-erdat, lifnr TYPE ekko-lifnr, name1 TYPE lfa1-name1, matnr TYPE ekpo-matnr, maktx TYPE makt-maktx, menge TYPE ekpo-menge, meins TYPE ekpo-meins, netwr TYPE ekpo-netwr, END OF ty_po_data. DATA: gt_po_data TYPE TABLE OF ty_po_data. DATA: go_excel TYPE ole2_object, go_workbooks TYPE ole2_object, go_workbook TYPE ole2_object, go_sheets TYPE ole2_object, go_sheet TYPE ole2_object, go_range TYPE ole2_object, go_font TYPE ole2_object, go_borders TYPE ole2_object. PARAMETERS: p_ebeln TYPE ekko-ebeln. START-OF-SELECTION. PERFORM fetch_data. PERFORM create_excel. PERFORM fill_excel_data. PERFORM format_excel. PERFORM save_and_show. PERFORM free_all_objects. 统一释放 FORM fetch_data. SELECT ekko~ebeln, ekko~erdat, ekko~lifnr, lfa1~name1, ekpo~matnr, makt~maktx, ekpo~menge, ekpo~meins, ekpo~netwr FROM ekko INNER JOIN ekpo ON ekko~ebeln ekpo~ebeln LEFT JOIN lfa1 ON ekko~lifnr lfa1~lifnr LEFT JOIN makt ON ekpo~matnr makt~matnr AND makt~spras sy-langu INTO CORRESPONDING FIELDS OF TABLE gt_po_data WHERE ( p_ebeln IS INITIAL OR ekko~ebeln p_ebeln ) UP TO 50 ROWS. ENDFORM. FORM create_excel. CREATE OBJECT go_excel Excel.Application. SET PROPERTY OF go_excel Visible 0. GET PROPERTY OF go_excel Workbooks go_workbooks. CALL METHOD OF go_workbooks Add go_workbook. GET PROPERTY OF go_workbook Sheets go_sheets. CALL METHOD OF go_sheets Item go_sheet EXPORTING #1 1. ENDFORM. FORM fill_excel_data. DATA: lv_row TYPE i VALUE 1. 标题 PERFORM set_cell_value USING lv_row 1 采购订单报表. lv_row lv_row 2. 表头 PERFORM set_cell_value USING lv_row 1 采购订单号. PERFORM set_cell_value USING lv_row 2 创建日期. PERFORM set_cell_value USING lv_row 3 供应商编号. PERFORM set_cell_value USING lv_row 4 供应商名称. PERFORM set_cell_value USING lv_row 5 物料编号. PERFORM set_cell_value USING lv_row 6 物料描述. PERFORM set_cell_value USING lv_row 7 数量. PERFORM set_cell_value USING lv_row 8 单位. PERFORM set_cell_value USING lv_row 9 金额. lv_row lv_row 1. 数据行 LOOP AT gt_po_data INTO DATA(ls_po). PERFORM set_cell_value USING lv_row 1 ls_po-ebeln. PERFORM set_cell_value USING lv_row 2 ls_po-erdat. PERFORM set_cell_value USING lv_row 3 ls_po-lifnr. PERFORM set_cell_value USING lv_row 4 ls_po-name1. PERFORM set_cell_value USING lv_row 5 ls_po-matnr. PERFORM set_cell_value USING lv_row 6 ls_po-maktx. PERFORM set_cell_value USING lv_row 7 ls_po-menge. PERFORM set_cell_value USING lv_row 8 ls_po-meins. PERFORM set_cell_value USING lv_row 9 ls_po-netwr. lv_row lv_row 1. ENDLOOP. 合计行 PERFORM set_cell_value USING lv_row 1 合计. PERFORM set_cell_formula USING lv_row 9 |SUM(I4:I{ lv_row - 1 })|. ENDFORM. FORM set_cell_value USING iv_row TYPE i iv_col TYPE i iv_value TYPE any. CALL METHOD OF go_sheet Cells go_range EXPORTING #1 iv_row #2 iv_col. SET PROPERTY OF go_range Value iv_value. ENDFORM. FORM set_cell_formula USING iv_row TYPE i iv_col TYPE i iv_formula TYPE string. CALL METHOD OF go_sheet Cells go_range EXPORTING #1 iv_row #2 iv_col. SET PROPERTY OF go_range Formula iv_formula. ENDFORM. FORM format_excel. 合并标题并居中加粗 CALL METHOD OF go_sheet Range go_range EXPORTING #1 A1:I1. SET PROPERTY OF go_range MergeCells 1. SET PROPERTY OF go_range HorizontalAlignment -4108. xlCenter GET PROPERTY OF go_range Font go_font. SET PROPERTY OF go_font Bold 1. SET PROPERTY OF go_font Size 16. 表头加粗 CALL METHOD OF go_sheet Range go_range EXPORTING #1 A3:I3. GET PROPERTY OF go_range Font go_font. SET PROPERTY OF go_font Bold 1. 数据区域加边框 CALL METHOD OF go_sheet Range go_range EXPORTING #1 |A3:I{ lines( gt_po_data ) 3 }|. GET PROPERTY OF go_range Borders go_borders. SET PROPERTY OF go_borders LineStyle 1. xlContinuous 自动列宽 CALL METHOD OF go_sheet Columns go_range. CALL METHOD OF go_range AutoFit. ENDFORM. FORM save_and_show. CALL METHOD OF go_workbook SaveAs EXPORTING #1 C:\Temp\采购订单报表.xlsx #2 51. xlOpenXMLWorkbook SET PROPERTY OF go_excel Visible 1. MESSAGE Excel文件已生成 TYPE S. ENDFORM. FORM free_all_objects. FREE OBJECT go_borders. FREE OBJECT go_font. FREE OBJECT go_range. FREE OBJECT go_sheet. FREE OBJECT go_sheets. FREE OBJECT go_workbook. FREE OBJECT go_workbooks. FREE OBJECT go_excel. ENDFORM. 3.3 核心要点与限制OLE2 必须在有Excel的前端环境运行后台作业无法使用。务必按从属关系逆序释放所有OLE2对象否则Excel进程残留。大量数据1000行性能极差建议改用ABAP2XLSX类库或后台SMARTFORMS导出。四、方案三PDF归档导出Smart Forms CONVERT_OTF 4.1 适用场景需要正式归档、打印、邮件附件要求具备页眉页脚、水印、公司Logo。 4.2 完整流程与代码前置条件使用事务SMARTFORMS创建表单ZMM_PO_REPORT定义表接口GT_PO_DATA设计表格和文本。REPORT zmm_po_export_pdf. TYPES: BEGIN OF ty_po_data, ebeln TYPE ekko-ebeln, erdat TYPE ekko-erdat, name1 TYPE lfa1-name1, maktx TYPE makt-maktx, menge TYPE ekpo-menge, netwr TYPE ekpo-netwr, END OF ty_po_data. DATA: gt_po_data TYPE TABLE OF ty_po_data, gt_otf TYPE TABLE OF itcoo, gt_pdf TYPE solix_tab, lv_len TYPE i. PARAMETERS: p_ebeln TYPE ekko-ebeln. START-OF-SELECTION. PERFORM fetch_data. PERFORM call_smartform. PERFORM convert_otf_to_pdf. PERFORM download_pdf. FORM fetch_data. SELECT ekko~ebeln, ekko~erdat, lfa1~name1, makt~maktx, ekpo~menge, ekpo~netwr FROM ekko INNER JOIN ekpo ON ekko~ebeln ekpo~ebeln LEFT JOIN lfa1 ON ekko~lifnr lfa1~lifnr LEFT JOIN makt ON ekpo~matnr makt~matnr AND makt~spras sy-langu INTO CORRESPONDING FIELDS OF TABLE gt_po_data WHERE ( p_ebeln IS INITIAL OR ekko~ebeln p_ebeln ) UP TO 100 ROWS. ENDFORM. FORM call_smartform. DATA: lv_fm_name TYPE rs38l_fnam, ls_output TYPE ssfcrescl. CALL FUNCTION SSF_FUNCTION_MODULE_NAME EXPORTING formname ZMM_PO_REPORT IMPORTING fm_name lv_fm_name EXCEPTIONS no_form 1 OTHERS 2. IF sy-subrc 0. MESSAGE 请先通过SMARTFORMS创建ZMM_PO_REPORT TYPE E. ENDIF. CALL FUNCTION lv_fm_name EXPORTING control_parameters VALUE ssfctrlop( no_dialog X getotf X ) IMPORTING output ls_output TABLES gt_po_data gt_po_data EXCEPTIONS formatting_error 1 internal_error 2 OTHERS 3. gt_otf ls_output-otfdata. ENDFORM. FORM convert_otf_to_pdf. CALL FUNCTION CONVERT_OTF EXPORTING format PDF max_linewidth 132 IMPORTING bin_filesize lv_len TABLES otf gt_otf lines gt_pdf EXCEPTIONS err_conv_not_possible 1 OTHERS 2. ENDFORM. FORM download_pdf. cl_gui_frontend_servicesgui_download( EXPORTING filename C:\Temp\采购订单报表.pdf filetype BIN size lv_len CHANGING data_tab gt_pdf ). MESSAGE PDF已生成 TYPE S. ENDFORM.关键点Smart Forms 的表格接口名称必须与TABLES参数后的内表名完全一致此处为GT_PO_DATA。五、方案四CSV导出中文编码完美处理 5.1 适用场景系统间数据交换、批量导入、分析工具对接。 5.2 完整代码示例UTF-8 BOM 正确分隔符REPORT zmm_po_export_csv. TYPES: BEGIN OF ty_po_data, ebeln TYPE ekko-ebeln, erdat TYPE ekko-erdat, name1 TYPE lfa1-name1, maktx TYPE makt-maktx, menge TYPE ekpo-menge, netwr TYPE ekpo-netwr, END OF ty_po_data. DATA: gt_po_data TYPE TABLE OF ty_po_data, gt_csv TYPE TABLE OF string, gs_csv TYPE string. PARAMETERS: p_ebeln TYPE ekko-ebeln. START-OF-SELECTION. PERFORM fetch_data. PERFORM prepare_csv_data. PERFORM download_csv_with_bom. FORM fetch_data. SELECT ekko~ebeln, ekko~erdat, lfa1~name1, makt~maktx, ekpo~menge, ekpo~netwr FROM ekko INNER JOIN ekpo ON ekko~ebeln ekpo~ebeln LEFT JOIN lfa1 ON ekko~lifnr lfa1~lifnr LEFT JOIN makt ON ekpo~matnr makt~matnr AND makt~spras sy-langu INTO CORRESPONDING FIELDS OF TABLE gt_po_data WHERE ( p_ebeln IS INITIAL OR ekko~ebeln p_ebeln ) UP TO 100 ROWS. ENDFORM. FORM prepare_csv_data. 表头 gs_csv |采购订单号,创建日期,供应商名称,物料描述,数量,金额|. APPEND gs_csv TO gt_csv. 数据行金额转换为字符串以避免科学计数法 LOOP AT gt_po_data INTO DATA(ls_po). gs_csv |{ ls_po-ebeln },{ ls_po-erdat },{ ls_po-name1 },{ ls_po-maktx },{ ls_po-menge },{ ls_po-netwr }|. APPEND gs_csv TO gt_csv. ENDLOOP. ENDFORM. FORM download_csv_with_bom. DATA: lv_bom_hex TYPE xstring VALUE EFBBBF, UTF-8 BOM lv_content TYPE string, lv_hex TYPE xstring, lv_full_hex TYPE xstring, lt_binary TYPE solix_tab. 将所有行用回车换行连接 LOOP AT gt_csv INTO lv_content. IF sy-tabix 1. CONCATENATE lv_content cl_abap_char_utilitiescr_lf INTO lv_content. ENDIF. CALL FUNCTION SCMS_STRING_TO_XSTRING EXPORTING text lv_content mimetype text/csv IMPORTING buffer lv_hex. CONCATENATE lv_full_hex lv_hex INTO lv_full_hex IN BYTE MODE. ENDLOOP. 前面加上 BOM CONCATENATE lv_bom_hex lv_full_hex INTO lv_full_hex IN BYTE MODE. 转换为 SOLIX 表 CALL FUNCTION SCMS_XSTRING_TO_BINARY EXPORTING buffer lv_full_hex TABLES binary_tab lt_binary. cl_gui_frontend_servicesgui_download( EXPORTING filename C:\Temp\采购订单报表.csv filetype BIN CHANGING data_tab lt_binary ). MESSAGE CSV已生成(UTF-8 BOM) TYPE S. ENDFORM.核心通过手动写入 UTF-8 BOMEFBBBF并转为二进制下载确保 Excel 打开时中文不再乱码。六、常见问题与排查#问题原因解决方法Q1OLE2 导出后 Excel 进程残留对象未完全释放使用逆序FREE OBJECT并检查所有引用Q2PDF 导出内容为空Smart Forms 表格接口名不匹配确保TABLES后的参数名与表单定义一致Q3CSV 中文在 Excel 中乱码缺少 UTF-8 BOM按上文方案写入 BOM 并以二进制格式下载Q4CSV 金额显示为科学计数Excel 自动转换金额字段添加制表符前缀或导出时加引号Q5OO ALVcall_function无反应该方法不稳定改用get_function( )-trigger_function( )方式七、总结导出方案标准ALV开发成本最低OLE2 Excel样式能力最强PDF归档最规范CSV交换最通用触发功能码 XXL CSV释放所有OLE对象Smart Forms CONVERT_OTFUTF-8 BOM 二进制下载方案核心技术一句话要点标准ALVtrigger_function最稳定适合日常快速导出OLE2 ExcelOLE2 对象模型释放所有对象仅限前台PDFSmart Forms OTF表格接口名必须一致CSVBOM 二进制写入BOM解决乱码核心要点根据场景选择简单导出用标准功能复杂报表用 OLE2归档用 PDF数据交换用 CSVOLE2 务必逆序释放所有对象PDF 需提前创建 Smart Forms 并确保接口参数名称匹配CSV 必须写入 BOM 并转为二进制下载彻底告别乱码批量导出建议限制数据量并采用异步处理下一篇预告《ALV异常场景兼容空数据、权限不足、数据报错的友好提示实现》作者爱喝水的鱼丶版本记录2026年7月验证基准SAP NetWeaver 7.51 你在开发导出功能时遇到过哪些奇怪的格式问题欢迎分享你的经验