ABAP 导入Excel形成内表

在这里插入图片描述

创建导入模板

在这里插入图片描述

程序实现

在这里插入图片描述

代码

*&---------------------------------------------------------------------*
*& Report Z_EXCEL_UPLOAD_LHY
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT Z_EXCEL_UPLOAD_LHY.
TABLES SSCRFIELDS.

DATA: LS_FUNCTXT TYPE SMP_DYNTXT.
CONSTANTS:COS_TEMPLATE TYPE W3OBJID VALUE 'ZFI001',
          COS_FILENAME TYPE STRING VALUE '财务导入模板.xlsx'.
TYPES: BEGIN OF T_MARC,
         MATNR TYPE MARC-MATNR, "物料编号
         WERKS TYPE MARC-WERKS, "工厂
         MAKTX TYPE MAKT-MAKTX,  "物料描述
         MATKL TYPE MARA-MATKL,  "物料组
       END   OF T_MARC.
DATA GT_DATA TYPE TABLE OF T_MARC.

SELECTION-SCREEN BEGIN OF BLOCK BK1.
  PARAMETERS P_FILE TYPE RLGRAP-FILENAME  MODIF ID M1.
SELECTION-SCREEN END OF BLOCK BK1.
**--按钮定义
SELECTION-SCREEN FUNCTION KEY 1.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR  P_FILE. "按选择帮助<F4>键时触发该事件
  PERFORM FRM_GET_FILE_NAME CHANGING P_FILE.


INITIALIZATION.
**--按钮定义-初始化
  CLEAR LS_FUNCTXT.
  LS_FUNCTXT-ICON_ID   = ICON_IMPORT. "图标,可以通过ICON查找
  LS_FUNCTXT-ICON_TEXT = '下载文件'."描述
  SSCRFIELDS-FUNCTXT_01 = LS_FUNCTXT.

AT SELECTION-SCREEN.
**--按钮响应
  CASE SSCRFIELDS-UCOMM.
    WHEN 'FC01'.
      PERFORM FRM_DOWNLOAD_TEMPLATE USING COS_TEMPLATE COS_FILENAME.
    WHEN OTHERS.
  ENDCASE.

START-OF-SELECTION.
  "解析Excel文件到内表
  PERFORM FILE_DATA_INPUT.


**&---------------------------------------------------------------------*
**& Module STATUS_9000 OUTPUT
**&---------------------------------------------------------------------*
**&
**&---------------------------------------------------------------------*
*MODULE STATUS_9000 OUTPUT.
*  SET PF-STATUS 'STANDARD'.
** SET TITLEBAR 'xxx'.
*ENDMODULE.
*&---------------------------------------------------------------------*
*& Form frm_get_file_name
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- P_FILE
*&---------------------------------------------------------------------*
FORM FRM_GET_FILE_NAME  CHANGING CV_FILE.

  DATA: LT_FILETABLE TYPE FILETABLE,  "表类型
        LS_FILETABLE TYPE FILE_TABLE, "结构类型
        LV_RC        TYPE I.
  FREE LT_FILETABLE.
  CLEAR: LV_RC.

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
    EXPORTING
*     window_title            =
      DEFAULT_EXTENSION       = CL_GUI_FRONTEND_SERVICES=>FILETYPE_EXCEL
*     default_filename        =
      FILE_FILTER             = CL_GUI_FRONTEND_SERVICES=>FILETYPE_EXCEL
*     with_encoding           =
*     initial_directory       =
*     multiselection          =
    CHANGING
      FILE_TABLE              = LT_FILETABLE
      RC                      = LV_RC
*     user_action             =
*     file_encoding           =
    EXCEPTIONS
      FILE_OPEN_DIALOG_FAILED = 1
      CNTL_ERROR              = 2
      ERROR_NO_GUI            = 3
      NOT_SUPPORTED_BY_GUI    = 4
      OTHERS                  = 5.
  READ TABLE LT_FILETABLE INTO LS_FILETABLE INDEX 1.
  IF SY-SUBRC <> 0.
*     Implement suitable error handling here
  ENDIF.
  IF SY-SUBRC EQ 0.
    CV_FILE = LS_FILETABLE-FILENAME.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> COS_TEMPLATE
*&      --> COS_FILENAME
*&---------------------------------------------------------------------*
FORM FRM_DOWNLOAD_TEMPLATE  USING   U_OBJID TYPE W3OBJID
                                     U_FILE_NAME TYPE STRING.
  DATA: LS_KEY      TYPE WWWDATATAB,
        LV_FILENAME TYPE STRING,
        LV_PATH     TYPE STRING,
        LV_FULLPATH TYPE STRING.

  "判断模板是否存在
  SELECT SINGLE * FROM WWWDATA
    WHERE RELID EQ 'MI'
    AND OBJID EQ @U_OBJID
    INTO CORRESPONDING FIELDS OF @LS_KEY.
  IF SY-SUBRC NE 0.
*   模板&1不存在
    MESSAGE 'ZFI001下载模板不存在' TYPE 'E'."ZFI001
    RETURN.
  ENDIF.
*   调用函数打开文件选择框

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
    EXPORTING
*     window_title              =
      DEFAULT_EXTENSION         = CL_GUI_FRONTEND_SERVICES=>FILETYPE_EXCEL
      DEFAULT_FILE_NAME         = U_FILE_NAME
*     with_encoding             =
*     file_filter               =
*     initial_directory         =
*     prompt_on_overwrite       = 'X'
    CHANGING
      FILENAME                  = LV_FILENAME
      PATH                      = LV_PATH
      FULLPATH                  = LV_FULLPATH
*     user_action               =
*     file_encoding             =
    EXCEPTIONS
      CNTL_ERROR                = 1
      ERROR_NO_GUI              = 2
      NOT_SUPPORTED_BY_GUI      = 3
      INVALID_DEFAULT_FILE_NAME = 4
      OTHERS                    = 5.
  IF SY-SUBRC <> 0.
*   Implement suitable error handling here
  ENDIF.
  CHECK LV_FULLPATH NE ''.
*   下载SMW0模版
  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      KEY         = LS_KEY
      DESTINATION = CONV LOCALFILE( LV_FULLPATH ).

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FILE_DATA_INPUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FILE_DATA_INPUT .
  CLEAR GT_DATA. "清空内表
  DATA: LT_INTERN TYPE STANDARD TABLE OF ALSMEX_TABLINE.
  DATA: ERROR_STR TYPE STRING.
  FREE: LT_INTERN.

  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      FILENAME                = P_FILE
      I_BEGIN_COL             = 1
      I_BEGIN_ROW             = 2
      I_END_COL               = 99
      I_END_ROW               = 65536
    TABLES
      INTERN                  = LT_INTERN
    EXCEPTIONS
      INCONSISTENT_PARAMETERS = 1
      UPLOAD_OLE              = 2
      OTHERS                  = 3.
  IF SY-SUBRC NE 0.
  ENDIF.
  SORT LT_INTERN BY ROW COL.
  LOOP AT LT_INTERN INTO DATA(LS_INTERN).
    AT NEW ROW. "如果字段ROWROW的左侧全部字段的数据,与上一行数据不一致,则执行代码。
      APPEND INITIAL LINE TO GT_DATA ASSIGNING FIELD-SYMBOL(<FS_DATA>).
    ENDAT.
    "按照现在的LS_INTERNCOL的值,分配结构<FS_DATA>的对应下标的地址给指针<FS_VAL>ASSIGN COMPONENT LS_INTERN-COL OF STRUCTURE <FS_DATA> TO FIELD-SYMBOL(<FS_VAL>).
    <FS_VAL> = LS_INTERN-VALUE.
    CLEAR LS_INTERN.
  ENDLOOP.
  CL_DEMO_OUTPUT=>DISPLAY( GT_DATA ).
ENDFORM.

代码解析

在这里插入图片描述

运行结果

在这里插入图片描述

### 将Excel数据动态插入到ABAP内部 在处理将外部Excel文件中的数据导入至SAP系统的内部时,可以采用多种方式实现这一目标。这里介绍一种基于`CL_GUI_FRONTEND_SERVICES`类的方法来读取本地磁盘上的Excel文件,并将其内容加载到内中。 #### 使用`CL_GUI_FRONTEND_SERVICES`读取Excel文件 通过调用`cl_gui_frontend_services=>gui_upload`方法可以直接从客户端计算机上选取并上传指定路径下的Excel文件。此过程允许程序获取整个工作簿的内容作为字符串数组返回给后台服务器端的应用逻辑处理器(ALP),之后再进一步解析这些原始数据转换成适合存储于内存结构体内的格式。 对于具体实施细节如下: 1. **定义数据对象** 为了能够接收来自前端传来的每一行记录,在开始之前先声明必要的变量与格类型用于暂存中间状态的数据项以及最终要填充的目标内实例化后的副本。 ```abap DATA: lv_filename TYPE string, lt_excel_data TYPE TABLE OF string. TYPES: BEGIN OF ty_itab, field1 TYPE char20, "假设这是你要映射的第一个字段 field2 TYPE i, "第二个整型字段... ... END OF ty_itab. DATA: lt_final_table TYPE STANDARD TABLE OF ty_itab. ``` 2. **选择并上传文件** 利用对话框让用户挑选待处理的工作薄位置,接着执行实际的传输动作。 ```abap CALL METHOD cl_gui_frontend_services=>file_open_dialog CHANGING filename = lv_filename. IF NOT lv_filename IS INITIAL. CALL METHOD cl_gui_frontend_services=>gui_upload EXPORTING filename = lv_filename filetype = 'ASC' IMPORTING filelength = DATA(lv_file_length) CHANGING data_tab = lt_excel_data[] EXCEPTIONS OTHERS = 1. ENDIF. ``` 3. **解析CSV/TSV格式文本** 如果所选文件是以逗号分隔值(Comma-Separated Values)或制符分割(Tab-Separated Values)的形式保存,则需逐行拆解每条目之间的界限以便正确分配各列对应的属性名及其关联的实际值得关系对儿。 4. **构建内部** 最后一步就是遍历经过初步清理过的临时容器(`lt_excel_data`)里的每一个元素,依据预设好的规则完成向目的集合(`lt_final_table`)里追加新成员的操作流程。 ```abap LOOP AT lt_excel_data INTO DATA(ls_line). SPLIT ls_line AT ',' INTO FIELD-SYMBOL(<fs_field>) VALUE (lv_value). APPEND INITIAL LINE TO lt_final_table ASSIGNING FIELD-SYMBOL(<ls_target>). <ls_target>-field1 = COND #( WHEN sy-tabix EQ 1 THEN lv_value ). <ls_target>-field2 = COND #( WHEN sy-tabix EQ 2 THEN lv_value AS INT ). CLEAR: ls_line, lv_value. ENDLOOP. ``` 上述代码片段仅提供了一个简化版的概念验证模型,真实场景下可能还需要考虑更多因素如异常情况捕获机制、性能优化措施等[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值