ABAP SMW0下载Excel模板并填充&&剪切板方式粘贴

配合SMW0使用,先下载模板并填充;

EXCEL的模板是可以合并单元格的,程序中的列是EXCEL真实的列,不是合并单元格之后的列;

1.下载模板

css 复制代码
DATA: lv_destination LIKE rlgrap-filename."模板导出路径
 DATA: ls_objdata LIKE wwwdatatab,
        lv_objid   TYPE wwwdatatab-objid,
        lv_rc      TYPE sy-subrc.
  CLEAR: lv_destination.
  PERFORM frm_get_savefullpath USING text-017 'XLS' CHANGING lv_destination."备件交货单
  CHECK lv_destination IS NOT INITIAL.
  CLEAR:ls_objdata,lv_objid,lv_rc.
  SELECT SINGLE relid objid
    FROM wwwdata
    INTO CORRESPONDING FIELDS OF ls_objdata
    WHERE srtf2 = 0
    AND objid = 'ZSD0GHW'                        "导入模板时输入的对象名称
    AND relid = 'MI'.
  IF sy-subrc = 0.
    CLEAR: lv_rc.
    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'                     "#EC *
      EXPORTING
        key         = ls_objdata
        destination = lv_destination
      IMPORTING
        rc          = lv_rc.
    IF lv_rc NE 0.
      MESSAGE text-014 TYPE 'E'."该数据模板不存在!
    ELSE.
      MESSAGE text-015 TYPE 'S'."模板下载成功
    ENDIF.
  ELSE.
    MESSAGE text-014 TYPE 'E'."该数据模板不存在!
  ENDIF.
FORM frm_get_savefullpath USING filename TYPE string
                            extension TYPE string
                       CHANGING destination LIKE rlgrap-filename.
  DATA:
    lv_fullpath    TYPE string,
    lv_user_action TYPE i,
    lv_path        TYPE string,
    lv_filename    TYPE string.
  CLEAR: destination.
* 获取模板保存路径
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
*     window_title         =
      default_extension    = extension
      default_file_name    = filename
*     with_encoding        =
*     file_filter          =
      initial_directory    = lv_path
*     prompt_on_overwrite  = 'X'
    CHANGING
      filename             = lv_filename
      path                 = lv_path
      fullpath             = lv_fullpath
      user_action          = lv_user_action
*     file_encoding        =
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
       WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    IF lv_user_action <> 9.
      destination = lv_fullpath.
    ENDIF.
  ENDIF.
ENDFORM.    

2.填充

替换代码中路径:C:\test.xlsx 即可;

css 复制代码
DATA: excelobj  TYPE ole2_object,
      wbookobj  TYPE ole2_object,
      wsheetobj TYPE ole2_object,
      cellobj   TYPE ole2_object,
      sheetobj  TYPE ole2_object,
      cell      TYPE ole2_object,
      sheet(30) TYPE c.

sheet = 'Sheet1'.
CREATE OBJECT excelobj 'Excel.Application'.
IF sy-subrc NE 0.
  WRITE: / 'Excel 初始化失败,错误码是 ', sy-subrc.
  EXIT.
ELSE.
* Set excel visible
  SET PROPERTY OF excelobj 'Visible' = 1.
* Create workbook object
  CALL METHOD OF
      excelobj
      'Workbooks' = wbookobj.
  CALL METHOD OF
      wbookobj
      'Open'   = wbookobj
    EXPORTING
      #1       = 'C:\test.xlsx'.
* Create wsheet object
  CALL METHOD OF
      wbookobj
      'Worksheets' = wsheetobj
    EXPORTING
      #1           = sheet.
  CALL METHOD OF
      wsheetobj
      'Activate'.

  PERFORM frm_fill_xls  USING 1 1 '11'.
  PERFORM frm_fill_xls  USING 1 2 '12'.
  PERFORM frm_fill_xls  USING 2 1 '21'.
  PERFORM frm_fill_xls  USING 2 2 '22'.

  FREE OBJECT wsheetobj.
  FREE OBJECT wbookobj.
  FREE OBJECT excelobj.
ENDIF.
*----------------------------------------------------------------------*
*      -->PR_ROW  行号
*      -->PR_COL  列号
*      -->PR_DAT  数值
*----------------------------------------------------------------------*
FORM frm_fill_xls USING value(pr_row)
                    value(pr_col)
                    value(pr_dat).
  CALL METHOD OF
      wsheetobj
      'Cells'   = cellobj
    EXPORTING
      #1        = pr_row
      #2        = pr_col.
  SET PROPERTY OF cellobj 'value' = pr_dat.
ENDFORM.                    "frm_fill_xls

剪切板方式填充案例--速度明显提升

css 复制代码
DATA: lv_destination LIKE rlgrap-filename."模板导出路径

DEFINE cut_downexcel.
  call method cl_gui_frontend_services=>clipboard_export
    importing
      data                 = lt_cutdata_rows
    changing
      rc                   = t_rc
    exceptions
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      others               = 4.

*选择其开始粘贴的单元格
  call method of wsheetobj 'cells' = cellobj
    exporting
    #1 = g_begin_row  "Row
    #2 = 1. "Column
*粘贴剪贴板
  call method of cellobj 'SELECT'.
  call method of wsheetobj 'PASTE'.
  clear: ls_cutdata, lt_cutdata_rows[].
  free lt_cutdata_rows.
END-OF-DEFINITION.

DATA: excelobj  TYPE ole2_object,
      wbookobj  TYPE ole2_object,
      wsheetobj TYPE ole2_object,
      cellobj   TYPE ole2_object,
      sheetobj  TYPE ole2_object,
      cell      TYPE ole2_object,
      sheet(30) TYPE c VALUE 'Sheet1'.

DATA:g_begin_row TYPE i,
     t_row     TYPE i,
     t_rc      TYPE i,
     t_cutrow TYPE i.

CONSTANTS: c_cutdata_len TYPE i VALUE 2000. "下载EXCEL每行所有字段总长度
TYPES: BEGIN OF cutdata_t,
         cutdata TYPE c LENGTH c_cutdata_len,
       END OF cutdata_t.
DATA: lt_cutdata      TYPE STANDARD TABLE OF cutdata_t,
      lt_cutdata_rows TYPE STANDARD TABLE OF cutdata_t,
      ls_cutdata      TYPE cutdata_t.
DATA: t_char200(200)."下载时兼容数字字段的字符串拼接

START-OF-SELECTION.
  "先下载模板
  PERFORM frm_down_temp.
  "向模板里填充数据
  PERFORM frm_export_temp.


*&---------------------------------------------------------------------*
*&      Form  frm_down_temp
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_down_temp.
  DATA: ls_objdata LIKE wwwdatatab,
        lv_objid   TYPE wwwdatatab-objid,
        lv_rc      TYPE sy-subrc.
  CLEAR: lv_destination.

  PERFORM frm_get_savefullpath USING 'test' 'xlsx' CHANGING lv_destination."开票信息导出

  CHECK lv_destination IS NOT INITIAL.
  CLEAR:ls_objdata,lv_objid,lv_rc.
  SELECT SINGLE relid objid
    FROM wwwdata
    INTO CORRESPONDING FIELDS OF ls_objdata
    WHERE srtf2 = 0
    AND objid = 'ZYSZK02'                     "导入模板时输入的对象名称
    AND relid = 'MI'.
  IF sy-subrc = 0.
    CLEAR: lv_rc.
    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'                     "#EC *
      EXPORTING
        key         = ls_objdata
        destination = lv_destination
      IMPORTING
        rc          = lv_rc.
    IF lv_rc NE 0.
      MESSAGE '该数据模板不存在' TYPE 'E'.
    ELSE.
      MESSAGE '模板下载成功' TYPE 'S'.
    ENDIF.
  ELSE.
    MESSAGE '该数据模板不存在' TYPE 'E'.
  ENDIF.
ENDFORM.                    "frm_down_temp

*&---------------------------------------------------------------------*
*&      Form  frm_export_temp
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_export_temp.
  DATA: l_row TYPE i VALUE 3."excel输出的行号
  CREATE OBJECT excelobj 'Excel.Application'.
  IF sy-subrc NE 0.
    MESSAGE text-042 TYPE 'E'."Excel初始化失败
    EXIT.
  ELSE.
    CALL METHOD OF
        excelobj
        'Workbooks' = wbookobj.

    "新建excel  不是使用模版
*    CALL METHOD OF
*        wbookobj
*        'Add'    = wbookobj.

    "打开下载的模版
    CALL METHOD OF
        wbookobj
        'Open'   = wbookobj
      EXPORTING
        #1       = lv_destination.

    SET PROPERTY OF excelobj  'VISIBLE' = 0.         "不显示窗口

    GET PROPERTY OF excelobj 'ACTIVESHEET' = wsheetobj.

    "剪贴板方式下载数据
*    LOOP AT gt_zyszk02.
*      CONCATENATE ls_cutdata gt_zyszk02-zgj INTO ls_cutdata SEPARATED BY cl_abap_char_utilities=>horizontal_tab.
*      CONCATENATE ls_cutdata gt_zyszk02-zxyz INTO ls_cutdata SEPARATED BY cl_abap_char_utilities=>horizontal_tab.
*      CONCATENATE ls_cutdata gt_zyszk02-zxq INTO ls_cutdata SEPARATED BY cl_abap_char_utilities=>horizontal_tab.
*
*      SHIFT  ls_cutdata BY 1 PLACES LEFT.
*      APPEND ls_cutdata TO lt_cutdata.
*      CLEAR  ls_cutdata.
*    ENDLOOP.
    DO 2 TIMES.
      CONCATENATE ls_cutdata 'name' INTO ls_cutdata SEPARATED BY cl_abap_char_utilities=>horizontal_tab.
      CONCATENATE ls_cutdata 'value' INTO ls_cutdata SEPARATED BY cl_abap_char_utilities=>horizontal_tab.

      SHIFT  ls_cutdata BY 1 PLACES LEFT.
      APPEND ls_cutdata TO lt_cutdata.
      CLEAR  ls_cutdata.
    ENDDO.

    t_row = 1."内容从第三行开始插入
    g_begin_row = 2.
    LOOP AT lt_cutdata INTO ls_cutdata.
      t_row = t_row + 1.
      t_cutrow = t_cutrow + 1.
      APPEND ls_cutdata TO lt_cutdata_rows.
      IF t_cutrow = 10000.
        cut_downexcel.
        g_begin_row = t_row + 1.
        t_cutrow = 0.
      ENDIF.
    ENDLOOP.
    "粘贴剩下不超过1W的数据
    IF lt_cutdata_rows[] IS NOT INITIAL.
      cut_downexcel.
    ENDIF.

    "打开下载的模版
    CALL METHOD OF wbookobj 'Save'                   "工作簿保存
    "新建excel  不是使用模版
    "CALL METHOD OF wbookobj 'SaveAS'                   "工作簿保存
       EXPORTING
         #1 = lv_destination
         #2 = 1.

    SET PROPERTY OF excelobj 'DisplayAlerts' = 'false'. "屏蔽是否另存为提示框

    CALL METHOD OF wbookobj 'CLOSE'.                   "关闭工作簿
    CALL METHOD OF excelobj 'QUIT'.                   "

    FREE OBJECT wsheetobj.
    FREE OBJECT wbookobj.
    FREE OBJECT excelobj.
  ENDIF.
ENDFORM.                    "frm_export_temp

*&---------------------------------------------------------------------*
*&      Form  frm_get_savefullpath
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->FILENAME     text
*      -->EXTENSION    text
*      -->DESTINATION  text
*----------------------------------------------------------------------*
FORM frm_get_savefullpath USING filename TYPE string
                            extension TYPE string
                       CHANGING destination LIKE rlgrap-filename.
  DATA:
    lv_fullpath    TYPE string,
    lv_user_action TYPE i,
    lv_path        TYPE string,
    lv_filename    TYPE string.
  CLEAR: destination.
* 获取模板保存路径
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
*     window_title         =
      default_extension    = extension
      default_file_name    = filename
*     with_encoding        =
*     file_filter          =
      initial_directory    = lv_path
*     prompt_on_overwrite  = 'X'
    CHANGING
      filename             = lv_filename
      path                 = lv_path
      fullpath             = lv_fullpath
      user_action          = lv_user_action
*     file_encoding        =
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
       WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    IF lv_user_action <> 9.
      destination = lv_fullpath.
    ENDIF.
  ENDIF.
ENDFORM.                    "frm_get_savefullpath

tips

1.xls格式最大行项目是65536行,256列 ; xlsx最大行项目是1048576行,16384列

2.使用模板和新建Excel的区别点:

相关推荐
SELSL2 小时前
SQLite3的API调用实战例子
linux·数据库·c++·sqlite3·sqlite实战
洲覆2 小时前
Redis 核心数据类型:从命令、结构到实战应用
服务器·数据库·redis·缓存
傻啦嘿哟2 小时前
Python SQLite模块:轻量级数据库的实战指南
数据库·python·sqlite
维尔切2 小时前
HAProxy 负载均衡器
linux·运维·数据库·负载均衡
什么半岛铁盒3 小时前
C++项目:仿muduo库高并发服务器-------Channel模块实现
linux·服务器·数据库·c++·mysql·ubuntu
倔强的石头_3 小时前
【金仓数据库产品体验官】Windows 安装 KingbaseES V9R1C10 与 Oracle 兼容特性实战
数据库
北风朝向3 小时前
Spring Boot参数校验8大坑与生产级避坑指南
java·spring boot·后端·spring
闭着眼睛学算法3 小时前
【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】
java·c语言·javascript·c++·python·算法·华为od
山海不说话3 小时前
Java后端面经(八股——Redis)
java·开发语言·redis