ABAP导入Excel
SAP中导入Excel数据的方法有很多,这里只罗列一下我工作中用到的一些方法
第一步 获取文件路径
方法一
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
def_path = 'C'
mask = ',Excel,*.XLSX;*.XLS.'
title = '选择文件'
IMPORTING
filename = p_file
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
IF sy-subrc 0 AND sy-subrc = 3.
MESSAGE '选择文件出错' TYPE 'I' DISPLAY LIKE 'E'.
STOP.
ENDIF.
方法二
*这个方法可以用于web GUI数据导入,返回的path其实是浏览器缓存路径
*配合GUI_UPLOAD、SCMS_BINARY_TO_XSTRING、cl_fdt_xl_spreadsheet完成数据导入
FORM get_filename_n .
DATA: lv_rc TYPE i.
DATA: lt_file_table TYPE filetable,
ls_file_table TYPE file_table.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = 'Select a file'
CHANGING
file_table = lt_file_table
rc = lv_rc.
IF sy-subrc = 0.
READ TABLE lt_file_table INTO ls_file_table INDEX 1.
p_file = ls_file_table-filename.
ENDIF.
ENDFORM.
第二步 导入Excel数据
方法一
1. WebGui无法使用;
2. 导入数据长度受alsmex_tabline限制,最长50位.可以通过调整参照自定义长度
DATA BEGIN OF iexcel OCCURS 0. " excel上载内表
INCLUDE STRUCTURE alsmex_tabline.
DATA END OF iexcel.
*上载excel文件
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = p_file "文件路径
i_begin_col = 1
i_begin_row = l_header "开始行
i_end_col = 50
i_end_row = 5000
TABLES
intern = iexcel
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc <> 0.
WRITE: / 'EXCEL UPLOAD FAILED ', p_file, sy-subrc.
STOP.
ELSE.
SORT iexcel BY row col.
ENDIF.
方法二
FIELD-SYMBOLS : <gt_data> TYPE STANDARD TABLE,
<ls_data> TYPE any,
<lv_field> TYPE any,
<lv_row> TYPE any,
<lv_col> TYPE any,
<lv_value> TYPE any,
<lt_excel> TYPE STANDARD TABLE,
<ls_excel> TYPE any
.
DATA : lv_filename TYPE string,
lv_headerxstring TYPE xstring,
lv_filelength TYPE i,
lt_records TYPE solix_tab,
lt_data TYPE REF TO data,
ls_data TYPE REF TO data.
*第一步、把Excel的二进制文件导入到系统中
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = lv_filename
filetype = 'BIN'
IMPORTING
filelength = lv_filelength
header = lv_headerxstring
TABLES
data_tab = lt_records
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17.
*第二步、二进制数据转换为xstring
"convert binary data to xstring
"if you are using cl_fdt_xl_spreadsheet in odata then skips this step
"as excel file will already be in xstring
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING
input_length = lv_filelength
IMPORTING
buffer = lv_headerxstring
TABLES
binary_tab = lt_records
EXCEPTIONS
failed = 1
OTHERS = 2.
*第三步、解析
DATA : lo_excel_ref TYPE REF TO cl_fdt_xl_spreadsheet,
lr_excel_core TYPE REF TO cx_fdt_excel_core
.
TRY .
lo_excel_ref = NEW cl_fdt_xl_spreadsheet(
document_name = lv_filename
xdocument = lv_headerxstring ) .
CATCH cx_fdt_excel_core INTO lr_excel_core .
"Implement suitable error handling here
DATA(lt_msg) = lr_excel_core->mt_message.
ENDTRY .
"Get List of Worksheets
lo_excel_ref->if_fdt_doc_spreadsheet~get_worksheet_names(
IMPORTING
worksheet_names = DATA(lt_worksheets) ).
IF NOT lt_worksheets IS INITIAL.
READ TABLE lt_worksheets INTO DATA(lv_woksheetname) INDEX i_sheets_num .
DATA(lo_data_ref) = lo_excel_ref->if_fdt_doc_spreadsheet~get_itab_from_worksheet(
lv_woksheetname ).
"now you have excel work sheet data in dyanmic internal table
ASSIGN lo_data_ref->* TO <gt_data>.
ENDIF .
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hblog!
