zoukankan      html  css  js  c++  java
  • 多sheet页 Excel文件上传

    DATA lv_filename TYPE string.
    TYPES:BEGIN OF ty_excel,
            werks TYPE marc-werks,
            bwart TYPE matdoc-bwart,
            cpudt TYPE matdoc-cpudt, "凭证日期
            budat TYPE matdoc-budat, "过账日期
            hsdat TYPE matdoc-hsdat, "生产日期
            lifnr TYPE matdoc-lifnr, "供应商 20181031
            lgort TYPE matdoc-lgort,
            insmk TYPE matdoc-insmk, "库存类型
            matnr TYPE matdoc-matnr,
            erfmg TYPE matdoc-erfmg,
            charg TYPE matdoc-charg,
            erfme TYPE matdoc-erfme,
            exbwr TYPE matdoc-exbwr,
            zhxm  TYPE zmmb011_t-zhxm,
          END OF ty_excel.
    DATA: gt_excel   TYPE STANDARD TABLE OF ty_excel.
    PARAMETERS p_file TYPE rlgrap-filename MODIF ID imp.
    
    lv_filename = p_file.
    
    CALL FUNCTION 'ZBC_UPLOAD_EXCEL_OLE'
      EXPORTING
        pi_filename    = lv_filename
        pi_startline   = '2'
        pi_startcolumn = '1'
      TABLES
        pt_tab         = gt_excel
      EXCEPTIONS
        open_file_err  = 1
        OTHERS         = 2.
    IF sy-subrc <> 0.
      MESSAGE e003(zbc) WITH sy-msgv1 sy-msgv2.
    ELSE.
      SORT gt_excel.
    ENDIF.

    ZBC_UPLOAD_EXCEL_OLE

    都必输入

    FUNCTION zbc_upload_excel_ole.
    *"----------------------------------------------------------------------
    *"*"本地接口:
    *"  IMPORTING
    *"     REFERENCE(PI_FILENAME) TYPE  STRING
    *"     REFERENCE(PI_SHEETNAME) TYPE  STRING DEFAULT 'Sheet1'
    *"     REFERENCE(PI_STARTLINE) TYPE  I DEFAULT '1'
    *"     REFERENCE(PI_STARTCOLUMN) TYPE  I DEFAULT '1'
    *"     REFERENCE(PI_SKPCL_TBL) TYPE  I DEFAULT '0'
    *"  TABLES
    *"      PT_TAB
    *"  EXCEPTIONS
    *"      OPEN_FILE_ERR
    *"----------------------------------------------------------------------
    
      DATA:
        lt_tabc       TYPE STANDARD TABLE OF zchar30000,
        lw_tabc       TYPE zchar30000,
        lv_tabix      TYPE sy-tabix,
        lt_cell       TYPE STANDARD TABLE OF string,
        lw_cell       TYPE string,
        lv_cell_tabix TYPE sy-tabix.
    
      DATA:
        lv_column_num TYPE i,
        lv_column_skp TYPE i,
        lw_tab_ref    TYPE REF TO data.
    
      DATA:
        lo_cx_root TYPE REF TO cx_root.
      DATA:
        lv_message TYPE string.
      DATA
      descr_ref TYPE REF TO cl_abap_structdescr.
    
      FIELD-SYMBOLS:
        <lw_tab>   TYPE any,
        <lv_value> TYPE any.
    
      CREATE DATA lw_tab_ref LIKE LINE OF pt_tab.
      ASSIGN lw_tab_ref->* TO <lw_tab>.
    
      lv_column_skp = pi_skpcl_tbl.
    
    *->把数据放到内表
      CALL FUNCTION 'ZBC_EXCEL_2_INNER_TABLE'
        EXPORTING
          pi_filename     = pi_filename
          pi_sheetname    = pi_sheetname
        TABLES
          pt_tab          = lt_tabc
        EXCEPTIONS
          file_open_error = 1
          OTHERS          = 2.
      IF sy-subrc <> 0.
        MESSAGE e000(zmm) WITH sy-msgv1 RAISING open_file_err. "&1&2&3&4
      ENDIF.
    
    *->把数据切割到内表
      LOOP AT lt_tabc INTO lw_tabc.
        lv_tabix = sy-tabix.
    
        CHECK lv_tabix >= pi_startline.
        CLEAR lt_cell.
    
        SPLIT lw_tabc AT cl_abap_char_utilities=>horizontal_tab INTO TABLE lt_cell.
    
        LOOP AT lt_cell INTO lw_cell.
          lv_cell_tabix = sy-tabix.
    
          lv_column_num = lv_cell_tabix - pi_startcolumn + 1 + lv_column_skp.
    
          CHECK lv_column_num > 0.
    
          ASSIGN COMPONENT lv_column_num OF STRUCTURE <lw_tab> TO <lv_value>.
          CHECK sy-subrc = 0.
          TRY.
              <lv_value> = lw_cell.
            CATCH cx_root INTO lo_cx_root.
              descr_ref ?= cl_abap_typedescr=>describe_by_data( pt_tab ).
              READ TABLE descr_ref->components INTO DATA(ls_name) INDEX lv_column_num.
              lv_message = '' && lv_tabix && '' && '' && lv_column_num && '列字段名为'&& ls_name-name && '错误的值为:' && lw_cell.
              MESSAGE e000(zmm) WITH lv_tabix lv_column_num lv_message RAISING open_file_err.
          ENDTRY.
        ENDLOOP.
        IF <lw_tab> IS NOT INITIAL.
          APPEND <lw_tab> TO pt_tab.
          CLEAR <lw_tab>.
        ENDIF.
    
      ENDLOOP.
    
    
    
    
    ENDFUNCTION.

    ZBC_EXCEL_2_INNER_TABLE

     其余必输入

    FUNCTION zbc_excel_2_inner_table.
    *"----------------------------------------------------------------------
    *"*"本地接口:
    *"  IMPORTING
    *"     VALUE(PI_FILENAME) TYPE  STRING
    *"     VALUE(PI_SHEETNAME) TYPE  STRING DEFAULT 'Sheet1'
    *"  TABLES
    *"      PT_TAB
    *"  EXCEPTIONS
    *"      FILE_OPEN_ERROR
    *"----------------------------------------------------------------------
    
      TYPE-POOLS:
          ole2.
    
      DATA:
        ole_excel      TYPE ole2_object,
        ole_workbooks  TYPE ole2_object,
        ole_workbook   TYPE ole2_object,
        ole_worksheets TYPE ole2_object,
        ole_worksheet  TYPE ole2_object,
        ole_cell_begin TYPE ole2_object,
        ole_cell_end   TYPE ole2_object,
        ole_range      TYPE ole2_object.
    
      DATA:
        lv_subrc     TYPE sy-subrc,
        lv_begin_col TYPE i,
        lv_end_col   TYPE i,
        lv_begin_row TYPE i,
        lv_end_row   TYPE i,
        lv_add_rows  TYPE i VALUE 3000.
    
      DATA:
        lt_excel_tab     TYPE STANDARD TABLE OF zchar30000,
        lw_excel_tab     TYPE zchar30000,
        lw_excel_tab_tmp TYPE zchar30000.
    
    
    *->生成Excel object
      CREATE OBJECT ole_excel 'Excel.Application'.
      IF sy-subrc <> 0.
        MESSAGE e001(zbc) RAISING file_open_error.
      ENDIF.
    
    *->
      SET PROPERTY OF ole_excel 'Visible' = 0.
    
      GET PROPERTY OF ole_excel 'Workbooks' = ole_workbooks.
    
      CALL METHOD OF
          ole_workbooks
          'Open'        = ole_workbook
        EXPORTING
          #1            = pi_filename.
    
    *->取得Sheet
      GET PROPERTY OF ole_workbook 'Worksheets' = ole_worksheets
        EXPORTING
          #1 = pi_sheetname.
    
      IF sy-subrc = 0.
        CALL METHOD OF
          ole_worksheets
          'Activate'.
      ELSE.
        CALL METHOD OF
          ole_excel
          'QUIT'.
        MESSAGE e000(zmm) WITH '打开Sheet页出错,请检查Sheet名称' RAISING file_open_error.
      ENDIF.
    
    *->把Sheet上数据Copy 到 ClipBoard
      lv_begin_col = 1.
      lv_end_col = 256.
      lv_begin_row = 0.
      lv_end_row = 0.
    
      WHILE lv_subrc IS INITIAL.
    
        IF lv_begin_row IS INITIAL.
          lv_begin_row = 1.
          lv_end_row   = lv_add_rows.
        ELSE.
          lv_begin_row = lv_begin_row + lv_add_rows.
          lv_end_row   = lv_end_row   + lv_add_rows.
        ENDIF.
    
        CALL METHOD OF
            ole_worksheets
            'Cells'        = ole_cell_begin
          EXPORTING
            #1             = lv_begin_row
            #2             = lv_begin_col.
    
        CALL METHOD OF
            ole_worksheets
            'Cells'        = ole_cell_end
          EXPORTING
            #1             = lv_end_row
            #2             = lv_end_col.
    
        CALL METHOD OF
            ole_worksheets
            'RANGE'        = ole_range
          EXPORTING
            #1             = ole_cell_begin
            #2             = ole_cell_end.
    
        CALL METHOD OF
          ole_range
          'SELECT'.
        IF sy-subrc <> 0.
          EXIT.
        ENDIF.
    
        CALL METHOD OF
          ole_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.
          CALL METHOD OF
            ole_excel
            'QUIT'.
          MESSAGE 'Error during import of clipboard contents' TYPE 'A'.
        ENDIF.
    
        lv_subrc = 4.
        LOOP AT lt_excel_tab INTO lw_excel_tab.
          lw_excel_tab_tmp = lw_excel_tab.
          REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>horizontal_tab IN lw_excel_tab_tmp WITH space.
          IF NOT ( lw_excel_tab_tmp = space OR lw_excel_tab_tmp IS INITIAL ).
            APPEND lw_excel_tab TO pt_tab.
            CLEAR lv_subrc.
          ENDIF.
        ENDLOOP.
    
        CLEAR lt_excel_tab.
    
      ENDWHILE.
    
      DATA:
        lv_rc TYPE i.
      CALL METHOD cl_gui_frontend_services=>clipboard_export
        IMPORTING
          data       = lt_excel_tab
        CHANGING
          rc         = lv_rc
        EXCEPTIONS
          cntl_error = 1
    *     ERROR_NO_GUI         = 2
    *     NOT_SUPPORTED_BY_GUI = 3
          OTHERS     = 4.
    
    *  CALL METHOD OF
    *    ole_worksheets
    *    'COLSE'.
    
    *  CALL METHOD OF
    *    ole_workbook
    *    'COLSE'.
    
    *  CALL METHOD OF
    *    ole_workbooks
    *    'CLOSE'.
    
    
    *  SET PROPERTY OF ole_excel 'DisplayAlerts' = 0.
    *前者并不会清空剪贴板,但是会让一些警告消息不再弹出
    *如果你对文件做了更改,不保存就关闭的话,会有提示是否关闭的对话框,
    *这个时候displayalerts = 0就起作用了,可以跳过这个关闭提示
     set property of ole_excel 'CutCopyMode' = 0.
    *或者这个
    
      CALL METHOD OF
        ole_excel
        'QUIT'.
      FREE OBJECT:
        ole_excel      ,
        ole_workbooks  ,
        ole_workbook   ,
        ole_worksheets ,
        ole_worksheet  ,
        ole_cell_begin ,
        ole_cell_end   ,
        ole_range      .
    
    
    ENDFUNCTION.
  • 相关阅读:
    保障升级:Splashtop 公布安全顾问委员会成员
    Android Studio gradle-5.4.1
    C++__静态成员
    网络嗅探及协议分析-wireshark
    网络嗅探及协议分析-tcpdump
    Linux基本安全防护技术
    C++__动态对象
    C++___深浅拷贝
    C++____函数重载
    C++__函数的默认参数和占位
  • 原文地址:https://www.cnblogs.com/ckstock/p/12003761.html
Copyright © 2011-2022 走看看