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的区别点:

相关推荐
俺不要写代码16 小时前
数据库:约束
数据库·mysql
小龙报16 小时前
【Coze-AI智能体平台】低代码省时高效:Coze 应用开发全流程指南
java·人工智能·python·深度学习·低代码·chatgpt·交互
KmSH8umpK16 小时前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案进阶第四篇
数据库·redis·分布式
陈随易16 小时前
bun将会支持Bun.image,你怎么看?
前端·后端·程序员
勿忘初心122116 小时前
【Java实战】SpringBoot 集成 freemarker 导出 Word 模板
java·spring boot·freemarker·模板引擎·word导出·后端实战
jingqingdai316 小时前
别用正则格式化 HTML!我用 DOM 遍历实现零风险本地格式化,老项目重构效率直接拉满
前端·重构·html
绿草在线16 小时前
SpringBoot项目实战:从零搭建高效开发环境
java·spring boot·后端
J2虾虾17 小时前
Java Lambda 表达式详解文档
java·开发语言
木斯佳17 小时前
前端八股文面经大全:腾讯前端实习二、三OC面(2026-04-27)·面经深度解析
前端·状态模式
longxibo17 小时前
【第1章 环境搭建与项目结构解析】
java·后端·流程图