ABAP EXCEL 处理 EXCEL 转内表 函数ALSM_EXCEL_TO_INTERNAL_TABLE 本函数为开发中常用的解析excel数据表函数,由于它的接收excel数据的内表为row-col-val格式,所以有时候也可以用来解析特定的excel模板(比如申请表)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 DATA: lt_excel TYPE STANDARD TABLE OF alsmex_tabline, ls_excel TYPE alsmex_tabline, lv_value TYPE char256, lv_error TYPE string. CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' EXPORTING filename = pv_fname "文件路径 i_begin_col = 1 "开始解析的列 i_begin_row = 2 "开始解析的行 i_end_col = 3 "结束解析的列 i_end_row = 50 "结束解析的行 TABLES intern = lt_excel "接收解析后的excel数据,以row-col-value的格式存储 EXCEPTIONS inconsistent_parameters = 1 upload_ole = 2 OTHERS = 3. IF sy-subrc <> 0. WRITE: / 'SY-SUBRC = ', sy-subrc. MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_error. WRITE: / lv_error. ELSE. "解析excel数据至指定格式内表 SORT lt_excel BY row. LOOP AT lt_excel INTO ls_excel. lv_value = ls_excel-value. AT NEW row. INSERT INITIAL LINE INTO TABLE gt_toexcel ASSIGNING FIELD-SYMBOL(<fs_excel>). ENDAT. ASSIGN COMPONENT ls_excel-col OF STRUCTURE <fs_excel> TO FIELD-SYMBOL(<fs_value>). IF sy-subrc = 0. <fs_value> = lv_value. ENDIF. ENDLOOP. ENDIF.
在实际的业务实现过程中,本函数存在一些缺陷、并不能完全满足业务要求。
比如:
接收excel数据的内表结构中value字段长度只有50
不能指定解析的sheet页
开发者可以通过copy本函数进行自开发优化。详细可参考ABAP: excel上载函数ALSM_EXCEL_TO_INTERNAL_TABLE 。
另外有一个函数KCD_EXCEL_OLE_TO_INT_CONVERT和ALSM_EXCEL_TO_INTERNAL_TABLE用法类似,不过它的接收excel数据的内表的value字段长度只有32。
函数FILE_READ_AND_CONVERT_SAP_DATA 本函数所在的函数组TRUX中有许多SAP的标准文件转换函数,其中TEXT_CONVERT_XLS_TO_SAP也是转换excel的函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 DATA: lv_error TYPE string. CALL FUNCTION 'FILE_READ_AND_CONVERT_SAP_DATA' EXPORTING i_filename = pv_fname "文件路径 i_servertyp = 'OLE2' "解析方式 i_fileformat = 'XLS' "对象文件格式 * I_FIELD_SEPERATOR = * I_LINE_HEADER = TABLES i_tab_receiver = pt_data "接收excel的内表 EXCEPTIONS file_not_found = 1 close_failed = 2 authorization_failed = 3 open_failed = 4 conversion_failed = 5 OTHERS = 6. IF sy-subrc <> 0. WRITE: / 'SY-SUBRC = ', sy-subrc. MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_error. WRITE: / lv_error. STOP. ENDIF.
本函数的优点是接收的内表无需转换,可直接使用对应excel数据表格式的自定义内表进行接收;缺点是支持的excel文件格式只有xls,且在程序运行过程中会弹出并显示excel文件,excel文件如果处于打开状态则程序会解析失败。
内表转 EXCEL 函数GUI_DOWNLOAD 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 TABLES: sflight. DATA: BEGIN OF lt_fieldnames OCCURS 0, name TYPE char20, END OF lt_fieldnames. SELECT carrid, fldate INTO TABLE @DATA(lt_sflight) FROM sflight UP TO 20 ROWS. "表格抬头 lt_fieldnames-name = '航班代码'. APPEND lt_fieldnames. lt_fieldnames-name = '航班日期'. APPEND lt_fieldnames. CALL FUNCTION 'GUI_DOWNLOAD' EXPORTING filename = 'C:\Users\Wuyuan\Desktop\GUI_DOWNLOAD下载excel.xls' filetype = 'DAT' "这里一般用DAT,AT会显示为-1000; "如果用ASC则1000-不会显示为-1000; "如果用DBF则不会有缩进,即字符前面的空格会被除去,而且字符的前导0也会输出; codepage = '8404' "字符格式标识符 TABLES data_tab = lt_sflight fieldnames = lt_fieldnames.
基本的excel下载函数,类CL_GUI_FRONTEND_SERVICES的方法GUI_DOWNLOAD里面也是调用的本函数。
本函数虽然简单,但是其下载的excel的实际格式其实是txt,因此在打开excel时会弹出如下警告:
并且本函数仅支持xls格式的excel的下载,不支持xlsx格式。
类似GUI_DOWNLOAD,支持xlsx格式,但是本函数没有定义excel表头的功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 TABLES: sflight. SELECT carrid, fldate INTO TABLE @DATA(lt_sflight) FROM sflight UP TO 20 ROWS. CALL FUNCTION 'SAP_CONVERT_TO_XLS_FORMAT' EXPORTING i_filename = 'C:\Users\Wuyuan\Desktop\GUI_DOWNLOAD下载excel.xlsx' TABLES i_tab_sap_data = lt_sflight EXCEPTIONS conversion_failed = 1 OTHERS = 2. IF sy-subrc <> 0. * Implement suitable error handling here ENDIF.
OLE 可实现高度定制化的excel下载,参考文章 。
ABAP2XLSX官方社区开发者开源的excel文件处理工具,参考文章 。