当前位置: 首页 > news >正文

SAP将指定EXCEL工作SHEET的数据上传到内表

SAP将指定EXCEL工作SHEET的数据上传到内表

 本文描述了一个SAP ABAP类方法upload_excel_2internaltab,用于将Excel文件数据上传到内部表。主要功能包括:

  1. 验证Excel行列范围有效性,若起始值大于结束值则抛出异常
  2. 检查文件是否存在,支持直接指定路径或通过文件对话框选择
  3. 使用OLE自动化技术操作Excel,包括打开工作簿、选择工作表、复制指定单元格范围数据
  4. 通过剪贴板将Excel数据导入ABAP内部表,调用标准函数进行格式转换
  5. 包含完善的异常处理机制,针对文件不存在、操作失败等情况抛出定制异常类ZCX_AB_K2_SERVICE的相应错误
  6. 最后释放所有OLE对象以关闭Excel进程

该方法实现了Excel与SAP系统间的数据交互,适用于需要批量导入数据的业务场景。

class ZCX_AB_K2_SERVICE definition
  public
  inheriting from CX_STATIC_CHECK
  create public .

public section.

  interfaces IF_T100_DYN_MSG .
  interfaces IF_T100_MESSAGE .

  constants:
    begin of PROCESSID_NOT_CONFIGED,
      msgid type symsgid value 'ZMSG_AB_I02',
      msgno type symsgno value '001',
      attr1 type scx_attrname value 'MV_APTYP',
      attr2 type scx_attrname value 'MV_BUKRS',
      attr3 type scx_attrname value '',
      attr4 type scx_attrname value '',
    end of PROCESSID_NOT_CONFIGED .
  constants:
    begin of PROCESSID_NOT_UNIQUE,
      msgid type symsgid value 'ZMSG_AB_I02',
      msgno type symsgno value '016',
      attr1 type scx_attrname value '',
      attr2 type scx_attrname value '',
      attr3 type scx_attrname value '',
      attr4 type scx_attrname value '',
    end of PROCESSID_NOT_UNIQUE .
  constants:
    begin of WRONG_COMPANY_CODE,
      msgid type symsgid value 'ZMSG_AB_I02',
      msgno type symsgno value '017',
      attr1 type scx_attrname value 'MV_BUKRS',
      attr2 type scx_attrname value '',
      attr3 type scx_attrname value '',
      attr4 type scx_attrname value '',
    end of WRONG_COMPANY_CODE .
  constants:
    begin of BEGIN_OVER_END,
      msgid type symsgid value 'ZMSG_AB_I02',
      msgno type symsgno value '023',
      attr1 type scx_attrname value '',
      attr2 type scx_attrname value '',
      attr3 type scx_attrname value '',
      attr4 type scx_attrname value '',
    end of BEGIN_OVER_END .
  constants:
    begin of UPLOAD_FILE_FAILED,
      msgid type symsgid value 'ZMSG_AB_I02',
      msgno type symsgno value '022',
      attr1 type scx_attrname value '',
      attr2 type scx_attrname value '',
      attr3 type scx_attrname value '',
      attr4 type scx_attrname value '',
    end of UPLOAD_FILE_FAILED .
  data MV_APTYP type ZE_APTYP .
  data MV_BUKRS type ZE_BUKRS .

  methods CONSTRUCTOR
    importing
      !TEXTID like IF_T100_MESSAGE=>T100KEY optional
      !PREVIOUS like PREVIOUS optional
      !MV_APTYP type ZE_APTYP optional
      !MV_BUKRS type ZE_BUKRS optional .

METHOD upload_excel_2internaltab.

    DATA: lt_excel_tab   TYPE tyt_send_line,
          lo_application TYPE ole2_object,
          lo_workbook    TYPE ole2_object,
          lo_worksheet   TYPE ole2_object,
          lo_cell        TYPE ole2_object,
          lo_cell_1      TYPE ole2_object,
          lo_range       TYPE ole2_object,
          lv_return_code TYPE i,
          lt_file_table  TYPE filetable.

    IF iv_begin_colomn > iv_end_colomn.
      "起止大于截止
      RAISE EXCEPTION TYPE zcx_ab_k2_service
        EXPORTING
          textid = zcx_ab_k2_service=>begin_over_end.
    ENDIF.

    IF iv_begin_row > iv_end_row.
      RAISE EXCEPTION TYPE zcx_ab_k2_service
        EXPORTING
          textid = zcx_ab_k2_service=>begin_over_end.
    ENDIF.

    IF iv_file_name IS NOT INITIAL.
      CALL METHOD cl_gui_frontend_services=>file_exist
        EXPORTING
          file                 = iv_file_name
        RECEIVING
          result               = DATA(lv_file_exist)
        EXCEPTIONS
          cntl_error           = 1
          error_no_gui         = 2
          wrong_parameter      = 3
          not_supported_by_gui = 4
          OTHERS               = 5.
      IF sy-subrc <> 0 OR lv_file_exist EQ abap_false.
        "文件不存在
        RAISE EXCEPTION TYPE zcx_ab_k2_service
          EXPORTING
            textid = zcx_ab_k2_service=>upload_file_failed.
      ELSE.
        DATA(lv_file_name) = iv_file_name.
      ENDIF.

    ELSE.
      CALL METHOD cl_gui_frontend_services=>get_desktop_directory
        CHANGING
          desktop_directory    = lv_file_name
        EXCEPTIONS
          cntl_error           = 1
          error_no_gui         = 2
          not_supported_by_gui = 3
          OTHERS               = 4.
      IF sy-subrc <> 0.
        RAISE EXCEPTION TYPE zcx_ab_k2_service
          EXPORTING
            textid = zcx_ab_k2_service=>upload_file_failed.
      ENDIF.

      CALL METHOD cl_gui_frontend_services=>file_open_dialog
        EXPORTING
          window_title            = CONV #( TEXT-001 )
          default_extension       = CONV #( TEXT-002 )
*         default_filename        = '上传模板'
          file_filter             = cl_gui_frontend_services=>filetype_excel
*         with_encoding           =
          initial_directory       = lv_file_name
          multiselection          = abap_false
        CHANGING
          file_table              = lt_file_table
          rc                      = lv_return_code
*         user_action             =
*         file_encoding           =
        EXCEPTIONS
          file_open_dialog_failed = 1
          cntl_error              = 2
          error_no_gui            = 3
          not_supported_by_gui    = 4
          OTHERS                  = 5.
      IF sy-subrc <> 0.
        RAISE EXCEPTION TYPE zcx_ab_k2_service
          EXPORTING
            textid = zcx_ab_k2_service=>upload_file_failed.
      ELSE.
        lv_file_name = lt_file_table[ 1 ].
      ENDIF.

    ENDIF.

    CLASS cl_abap_char_utilities DEFINITION LOAD.
    DATA(lv_separator) = cl_abap_char_utilities=>horizontal_tab.

    IF lo_application-header = abap_false
      OR lo_application-handle = -1.
      CREATE OBJECT lo_application 'Excel.Application'.
    ENDIF.

    CALL METHOD OF lo_application 'Workbooks' = lo_workbook.

    "必须参考RLGRAP-FILENAME
    DATA(lv_excel_name) = CONV localfile( lv_file_name ).
    CALL METHOD OF lo_workbook 'Open' EXPORTING #1 = lv_file_name.

    IF iv_sheet_name IS INITIAL.
*  set property of application 'Visible' = 1.
      GET PROPERTY OF  lo_application 'ACTIVESHEET' = lo_worksheet.
    ELSE.
      CALL METHOD OF lo_application 'WORKSHEETS' = lo_worksheet
      EXPORTING #1 = iv_sheet_name.

      CALL METHOD OF lo_worksheet 'Activate'.
    ENDIF.

* mark whole spread sheet
    CALL METHOD OF lo_worksheet 'Cells' = lo_cell
        EXPORTING #1 = iv_begin_row #2 = iv_begin_colomn.

    CALL METHOD OF lo_worksheet 'Cells' = lo_cell_1
        EXPORTING #1 = iv_end_row #2 = iv_end_colomn.

    CALL METHOD  OF lo_worksheet 'RANGE' = lo_range
                   EXPORTING #1 = lo_cell #2 = lo_cell_1.

    CALL METHOD OF lo_range 'SELECT'.

* copy marked area (whole spread sheet) into Clippboard
    CALL METHOD OF lo_range 'COPY'.

* read clipboard into ABAP
    CALL METHOD cl_gui_frontend_services=>clipboard_import
      IMPORTING
        data                 = lt_excel_tab
      EXCEPTIONS
        cntl_error           = 1
        error_no_gui         = 2
        not_supported_by_gui = 3
        OTHERS               = 4.
    IF sy-subrc <> 0.
      RAISE EXCEPTION TYPE zcx_ab_k2_service
        EXPORTING
          textid = zcx_ab_k2_service=>upload_file_failed.
    ENDIF.

    IF lt_excel_tab IS NOT INITIAL.
      PERFORM separated_to_intern_convert IN PROGRAM saplalsmex
                                          TABLES lt_excel_tab rt_internal_table
                                          USING  lv_separator.

* clear clipboard
      REFRESH lt_excel_tab.
      CALL METHOD cl_gui_frontend_services=>clipboard_export
        IMPORTING
          data                 = lt_excel_tab
        CHANGING
          rc                   = lv_return_code
        EXCEPTIONS
          cntl_error           = 1
          error_no_gui         = 2
          not_supported_by_gui = 3
          OTHERS               = 4.
      IF sy-subrc NE 0.
        RAISE EXCEPTION TYPE zcx_ab_k2_service
          EXPORTING
            textid = zcx_ab_k2_service=>upload_file_failed.
      ENDIF.
    ENDIF.

* quit Excel and free ABAP Object - unfortunately, this does not kill
* the Excel process
    CALL METHOD OF lo_workbook 'CLOSE'.
    CALL METHOD OF lo_application 'QUIT'.

* >>>>> Begin of change note 575877
* to kill the Excel process it's necessary to free all used objects
    FREE OBJECT lo_cell.
    FREE OBJECT lo_cell_1.
    FREE OBJECT lo_range.
    FREE OBJECT lo_worksheet.
    FREE OBJECT lo_workbook.
    FREE OBJECT lo_application.
* <<<<< End of change note 575877
  ENDMETHOD.

http://www.lryc.cn/news/574118.html

相关文章:

  • 基于 BERT 与语义角色标注的细粒度中文仇恨言论检测
  • 剑指offer40_数字序列中某一位的数字
  • 中国风国潮通用PPT模版
  • 【项目管理】项目管理资料文档模板(ZIP,PPT,WORD)
  • 榕壹云无人售货机管理系统:开源架构赋能私有化部署,打造智能零售技术解决方案
  • AI 领航设计模式学习:飞算 JavaAI 解锁单例模式实践新路径
  • 在测试中,如何判断是前端 Bug 还是后端 Bug?
  • 错误: 程序包androidx.fragment.app不存在 import android
  • 实现 el-table 中键盘方向键导航功能vue2+vue3(类似 Excel)
  • Flutter ListTile 徽章宽度自适应的真正原因与最佳实践
  • iOS 为图片添加水印
  • 基于openfeign拦截器RequestInterceptor实现的微服务之间的夹带转发
  • react快速开始项目模板
  • Web基础 -SpringBoot入门 -HTTP-分层解耦 -三层架构
  • Protobuf 深度解析:从基础语法到高级应用
  • 【目标检测】图像处理基础:像素、分辨率与图像格式解析
  • “自动化失败归因”测试集-WhoWhen
  • 在大数据求职面试中如何回答分布式协调与数据挖掘问题
  • 云原生 CAD 让制造业设计协同更便捷
  • 3D模式格式转换工具HOOPS Exchange如何将3D PDF转换为STEP格式?
  • 【实时Linux实战系列】使用定时器实现定时任务
  • 计算机网络:(六)超详细讲解数据链路层 (附带图谱表格更好对比理解)
  • docker镜像中集成act工具
  • 刀客doc:阿里巴巴集团品牌部划归集团公关管理
  • Java基础(三):逻辑运算符详解
  • P3258 [JLOI2014] 松鼠的新家
  • (LeetCode 面试经典 150 题) 27.移除元素
  • PR出书启动
  • ✨通义万相2.1深度解析:AI视频生成引擎FLF2V-14B全流程指南(命令行参数+模型架构+数据流)
  • VTK.js