前言
ABAP读取Excel文件可以使用多种方式实现,OLE是最常用的技术,但速度及兼容性较差;也可以使用DOI接口读取,最新的技术则通过XML技术进行解析,采用最新的面向对象编程,容易理解,且兼容性较好。
方法
标准函数
函数名 | 说明 |
---|---|
TEXT_CONVERT_XLS_TO_SAP | 基于OLE,需要内表结构与Exce列顺序一致 |
ALSM_EXCEL_TO_INTERNAL_TABL | 基于OLE,按单元读取出来,最长只支持50个字符 |
UPLOAD_XLS_FILE_2_ITAB | (尚未验证,谨慎使用)基于DOI,需要内表结构与Exce列顺序一致 |
标准方法改造
通过改造标准函数ALSM_EXCEL_TO_INTERNAL_TABL,实现读取更大长度的内容,以及读取指定索引或名称的多个sheet,源代码如下,粘贴至SE24或即可全局使用
结构定义
ABAP代码
class ZCL_MDG_IF_TOOLS definition
public
final
create public .
public section.
type-pools OLE2 .
types:
types TY_D_ITABVALUE type ZSMDG_ALSMEX_TABLINE-VALUE .
types TY_ITAB type ZSMDG_ALSMEX_TABLINE .
types:
ty_t_itab type table of zsmdg_alsmex_tabline .
types:
begin of ty_s_senderline,
line(4096) type c,
end of ty_s_senderline .
types TY_SENDER type TY_S_SENDERLINE .
types:
ty_t_sender type table of ty_s_senderline .
constants GC_ESC type C value '"' ##NO_TEXT.
class-methods READ_EXCEL_MULTIPLE_SHEETS
importing
!FILENAME type RLGRAP-FILENAME
!I_BEGIN_COL type I default 1
!I_BEGIN_ROW type I default 2
!I_END_COL type I default 99
!I_END_ROW type I default 100000
!SHEET_INDEX type I optional
!SHEET_NAME type ALSMEX_TABLINE-VALUE optional
exporting
!INTERN type ZMDG_ALSMEX_TABLINE_T
exceptions
INCONSISTENT_PARAMETERS
UPLOAD_OLE .
protected section.
class-methods line_to_cell_esc_sep
changing
!i_string type any
!i_sic_int type i
!i_separator type c
!i_intern_value type ty_d_itabvalue .
class-methods line_to_cell_separat
changing
!i_line type any
!i_row type sy-tabix
!ch_cell_col type kcd_ex_col
!i_separator type c
!i_fdpos type sy-fdpos
!i_intern type ty_t_itab .
class-methods separated_to_intern_convert
changing
!i_tab type ty_t_sender
!i_separator type c
!i_intern type ty_t_itab .
private section.
ENDCLASS.
CLASS ZCL_MDG_IF_TOOLS IMPLEMENTATION.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Protected Method ZCL_MDG_IF_TOOLS=>LINE_TO_CELL_ESC_SEP
* +-------------------------------------------------------------------------------------------------+
* | [<-->] I_STRING TYPE ANY
* | [<-->] I_SIC_INT TYPE I
* | [<-->] I_SEPARATOR TYPE C
* | [<-->] I_INTERN_VALUE TYPE TY_D_ITABVALUE
* +--------------------------------------------------------------------------------------</SIGNATURE>
method line_to_cell_esc_sep.
data: l_int type i,
l_cell_end(2).
field-symbols: <l_cell> type any.
l_cell_end = gc_esc