ABAP EXCEL上传和下载

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_CONVERTALSM_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时会弹出如下警告:

image-20241111212009481

并且本函数仅支持xls格式的excel的下载,不支持xlsx格式。

函数SAP_CONVERT_TO_XLS_FORMAT

类似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文件处理工具,参考文章


ABAP EXCEL上传和下载
https://claudechan1228.github.io/2024/10/28/026-ABAP EXCEL上传和下载/
作者
Claude Chan
发布于
2024年10月28日
许可协议