ABAP EXCEL导入与导出(二)

该文章介绍了如何在ABAP环境中通过OLE接口导出Excel文件,包括选择保存路径、下载模板、填充数据到Excel以及保存文件的过程。虽然OLE方法方便,但不能脱离GUI使用。文章还提及了其他导出方式如DOI和直接操作Excel文件(如ABAP2XLSX库),并指出在WPS环境下可能存在的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求场景:

上一篇博客记录按照EXCEL模板导入数据,这一片博客记录一下以EXCEL格式导出数据。
导出EXCEL的方式有多种,实现方式常见的有OLE,DOI和直接操作EXCEL文件(XML格式文件或者一般文本格式文件);OLE和DOI使用方便,但是缺点是不能脱离GUI使用;直接操作Excel文件方式适用性更强,常用在web端接口或者邮件发送,其中代表性的是ABAP2XLSX。
本篇主要是记录一下以OLE方式导出EXCEL文件的实现过程。

实现过程

  1. 选择保存路径
  2. 下载模板
  3. 打开EXCEL模板
  4. 把内表数据填充到EXCEL
  5. 保存EXCEL文件

关键代码

DATA: g_fullname TYPE string.

DATA:   go_excel  TYPE ole2_object,
        go_book   TYPE ole2_object,
        go_books  TYPE ole2_object,
        go_sheet  TYPE ole2_object,
        go_sheets TYPE ole2_object,
        go_cell   TYPE ole2_object,
        go_cells  TYPE ole2_object,
        go_cell1  TYPE ole2_object,
        go_cell2  TYPE ole2_object.

FORM frm_download_excel USING p_flag.
  DATA: l_err TYPE flag.
  DATA: l_objid LIKE wwwdata-objid."改为按模板下载数据,因此定义为全局变量

  l_objid = 'ZMMT001'.

  IF gt_output[] IS INITIAL.
    MESSAGE '没有数据' TYPE 'S' DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

  "选择保存路径
  PERFORM sub_get_save_file_path CHANGING l_err.
  CHECK l_err = space.  "check后面表达式为false时,跳出当前form

  "下载模板
  PERFORM sub_download_excel_template USING l_objid CHANGING l_err.
  IF l_err <> space.
    MESSAGE l_err TYPE 'S' DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

  "打开EXCEL模板
  PERFORM sub_open_excel_file.

  "把内表数据填充到EXCEL
  PERFORM sub_fill_data_to_excel USING p_flag.

  "保存EXCLE文件
  PERFORM sub_excel_save.
ENDFORM.                    " FRM_DOWNLOAD_EXCEL

"选择文件保存路径及文件名
FORM sub_get_save_file_path CHANGING l_err TYPE flag.
  DATA: l_filename TYPE string,
        l_path     TYPE string.

  CLEAR:l_filename, l_path, l_err ,g_fullname.

  l_filename = '国内对账单.xls'.

  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      default_extension    = 'XLSX'
      default_file_name    = l_filename
    CHANGING
      filename             = l_filename
      path                 = l_path
      fullpath             = g_fullname
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc <> 0.
    MESSAGE s001(00) DISPLAY LIKE 'E'.
  ENDIF.
  IF g_fullname = space.
    l_err = 'X'.
  ENDIF.
ENDFORM.                    " SUB_GET_SAVE_FILE_PATH

"下载EXCEL模板
FORM sub_download_excel_template USING p_objid  LIKE wwwdata-objid CHANGING p_error TYPE flag.
  DATA: ls_key        LIKE wwwdatatab,
        l_destination LIKE rlgrap-filename,
        l_rc          LIKE sy-subrc.
  DATA: l_exist TYPE flag.

  p_error = 'X'.

  CLEAR l_exist.
  PERFORM sub_check_template_exist USING p_objid CHANGING l_exist.
  CHECK l_exist = 'X'.

  CLEAR:p_error, ls_key,l_destination,l_rc.
  ls_key-relid = 'MI'.
  ls_key-objid = p_objid.
  l_destination = g_fullname.

  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      key         = ls_key
      destination = l_destination
    IMPORTING
      rc          = l_rc.

  IF l_rc = 0.
    CLEAR p_error.
  ENDIF.

ENDFORM.

FORM sub_open_excel_file .
  CREATE OBJECT go_excel 'EXCEL.APPLICATION' ."创建EXCEL对象
  SET PROPERTY OF go_excel 'VISIBLE' = 0."设置EXCEL属性可视
  CALL METHOD OF go_excel 'WORKBOOKS' = go_book. "激活工作簿

  CALL METHOD OF go_book 'OPEN'
    EXPORTING
      #1 = g_fullname. "打开指定路径EXCEL工作簿

  CALL METHOD OF go_excel 'WORKSHEETS' = go_sheet
    EXPORTING
    #1 = 1.

  CALL METHOD OF go_sheet 'SELECT'.

  CALL METHOD OF go_sheet 'ACTIVATE'. "sheet 激活
ENDFORM.                    " SUB_OPEN_EXCEL_FILE

FORM sub_fill_data_to_excel USING p_flag.
  DATA: l_row  TYPE i,
        l_row2 TYPE i,
        l_no   TYPE i.
  DATA: l_val TYPE char30.
  DATA: l_mseh6 LIKE t006a-mseh6.
  DATA: l_jyxm TYPE char200.
  DATA:lv_dzqj     TYPE string,
       lv_line(8)  TYPE n,
       lv_text(20).

  DATA:BEGIN OF ls_slhj,
         zfretax LIKE zmmtydanf-zfretax,
         zfreje  LIKE zmmtydanf-zfreje,
       END OF ls_slhj,
       lt_slhj LIKE TABLE OF ls_slhj.

  CONCATENATE gv_date_begin+0(4) '年' gv_date_begin+4(2) '月' gv_date_begin+6(2) '日' '-' gv_date_end+0(4) '年' gv_date_end+4(2) '月' gv_date_end+6(2) '日' INTO lv_dzqj.
  "填充抬头
  PERFORM sub_fill_range USING 3 2 gv_name1.
  PERFORM sub_fill_range USING 4 2 gv_lifadr.
  PERFORM sub_fill_range USING 3 13 gv_butxt.
  PERFORM sub_fill_range USING 4 13 gv_tyfadr.
  PERFORM sub_fill_range USING 5 2 gv_vtext.
  PERFORM sub_fill_range USING 5 5 gv_fktj.
  PERFORM sub_fill_range USING 5 8 lv_dzqj.
  "填充项目
  l_row = 7.
  LOOP AT gt_output INTO DATA(ls_output).
    IF l_row > 14. "如果超过8行数据,自动插入新行处理
      PERFORM excel_row_insert USING l_row.
    ENDIF.

    PERFORM sub_fill_range USING l_row 1 ls_output-ztydanno.
    PERFORM sub_fill_range USING l_row 2 ls_output-wadat.
    PERFORM sub_fill_range USING l_row 3 ls_output-shdhs.
    PERFORM sub_fill_range USING l_row 4 ls_output-sortls.
    PERFORM sub_fill_range USING l_row 5 ls_output-zfrename.
    IF p_flag = '1'.
      PERFORM sub_fill_range USING l_row 11 ls_output-zjz.
      PERFORM sub_fill_range USING l_row 12 ls_output-zfresl.
      PERFORM sub_fill_range USING l_row 13 ls_output-zfredj.
      PERFORM sub_fill_range USING l_row 14 ls_output-zfretax.
      PERFORM sub_fill_range USING l_row 15 ls_output-zfreje.
    ENDIF.
    PERFORM sub_fill_range USING l_row 16 ls_output-remrk.
    PERFORM sub_fill_range USING l_row 6 ls_output-zwzc_t.
    PERFORM sub_fill_range USING l_row 7 ls_output-zwxp_t.
    PERFORM sub_fill_range USING l_row 8 ls_output-zarea_t.
    PERFORM sub_fill_range USING l_row 9 ls_output-zcity_t.
    PERFORM sub_fill_range USING l_row 10 ls_output-zcountry_t.

    ADD 1 TO l_row.
    CLEAR:ls_output.
  ENDLOOP.
  "填充合计
  IF p_flag = '1'.
    REFRESH:lt_slhj.

    LOOP AT gt_output INTO ls_output.
      MOVE-CORRESPONDING ls_output TO ls_slhj.
      COLLECT ls_slhj INTO lt_slhj.
      CLEAR:ls_output.
    ENDLOOP.

    CLEAR:lv_line,l_row2.
    lv_line = lines( gt_output ).
    IF lv_line > 8.
      l_row2 = 15 + lv_line - 8.
    ELSE.
      l_row2 = 15.
    ENDIF.

    l_row = l_row2.
    LOOP AT lt_slhj INTO ls_slhj.
      IF l_row > l_row2.
        PERFORM excel_row_insert USING l_row.
      ENDIF.
      CLEAR:lv_text.
      CONCATENATE '本月合计(税率 ' ls_slhj-zfretax '%)' INTO lv_text.
      PERFORM sub_fill_range USING l_row 1 lv_text.
      PERFORM sub_fill_range USING l_row 3 ls_slhj-zfreje.
      ADD 1 TO l_row.
      CLEAR:ls_slhj.
    ENDLOOP.
  ENDIF.
ENDFORM.                    " SUB_FILL_DATA_TO_EXCEL

FORM sub_fill_range USING p_row p_col p_value.
  DATA:l_row TYPE i,
       l_col TYPE i.
  l_row = p_row.
  l_col = p_col.

  CALL METHOD OF go_excel 'CELLS' = go_cell
    EXPORTING
    #1 = l_row
    #2 = l_col.

  CALL METHOD OF go_cell 'Select'.

  SET PROPERTY OF go_cell 'VALUE' = p_value.
ENDFORM.

FORM excel_row_insert  USING p_row TYPE i.
  DATA lo_range TYPE ole2_object.
  DATA: l_row TYPE i.

  l_row = p_row - 1.
  CALL METHOD OF go_sheet 'Rows' = lo_range    "call method
    EXPORTING #1 = l_row.

  CALL METHOD OF lo_range 'Copy'.

  ADD 1 TO l_row.
  CALL METHOD OF go_sheet 'Rows' = lo_range
    EXPORTING #1 = l_row.

  CALL METHOD OF lo_range 'Insert'.

  CALL METHOD OF go_sheet 'Rows' = lo_range
     EXPORTING #1 = l_row.

  CALL METHOD OF lo_range 'ClearContents'. "清空Cell
ENDFORM.                    " EXCEL_ROW_INSERT

FORM sub_excel_save .
*  CALL METHOD OF go_excel 'Run'
*    EXPORTING
*      #1 = 'setApp2'.

  GET PROPERTY OF go_excel 'ActiveSheet' = go_sheet. "获取活动SHEET
  GET PROPERTY OF go_excel 'ActiveWorkbook' = go_book.
  CALL METHOD OF go_book 'SAVE'.

  SET PROPERTY OF go_excel 'Visible' = 1.  "是否显示EXCEL 此处显示不退出

  FREE OBJECT go_sheet.
  FREE OBJECT go_book.
  FREE OBJECT go_excel.
ENDFORM.                    " SUB_EXCEL_SAVE

遇到的问题

因为公司内部在推行WPS,但是使用OLE这种方式导出的话可能会存在空白情况。

<think>嗯,用户想知道如何在SAP ABAP中进行代码的导入导出。首先,我需要回忆一下相关的工具和方法。记得SAPLINK是一个常用的工具,可以用来导出导入ABAP对象。还有ABAP Git,这是一个版本控制工具,可能也涉及到代码的迁移。另外,用户提供的引用里提到了SAPLINK的详细使用方式,以及如何处理多sheet的Excel导入,不过这里的问题主要是代码的导入导出,所以可能需要专注于SAPLINK和ABAP Git。 首先,SAPLINK的使用步骤应该是怎样的呢?用户可能需要先安装SAPLINK插件,然后通过创建NUGG文件来打包对象,再导入到其他系统。引用1里提到了导入DDIC和ZTOAD的例子,这可能说明NUGG文件的结构和使用方法。需要详细说明安装步骤、导出导入的具体操作,比如事务代码和注意事项。 然后是ABAP Git,这个工具允许将ABAP代码Git仓库同步,适合团队协作和版本控制。引用3提到了项目主页和讨论组,可能需要说明如何安装ABAP Git,如何连接仓库,以及推送和拉取代码的步骤。 另外,用户可能想知道标准传输请求的方式,也就是用SE10和STMS来导出导入传输请求。这部分需要解释传输请求的创建、释放,以及如何在目标系统导入。 可能需要注意权限问题,比如安装SAPLINK或ABAP Git是否需要额外权限,或者传输请求需要传输密钥。还有不同系统版本之间的兼容性问题,比如SAPLINK是否支持最新的NetWeaver版本。 用户可能还会关心这些方法的优缺点,比如SAPLINK适合单个对象,ABAP Git适合版本控制,而传输请求适合大规模迁移。需要比较这些方法,帮助用户选择最合适的。 此外,引用2提到了处理多sheet Excel的方法,但当前问题不涉及Excel,所以可能不需要深入,但可以提醒用户如果有数据导入的需求可以参考相关引用。 最后,生成相关问题的时候,要围绕用户可能遇到的后续问题,比如权限、处理依赖项、不同工具的比较,以及处理对象类型限制等。</think>### SAP ABAP代码导入导出方法教程 #### 一、使用SAPLINK工具 1. **安装SAPLINK插件** - 通过事务代码`SE38`导入程序`ZSAPLINK`和`Z_NUGG_SAPLINK_DDIC`[^1] - 需要 BASIS 权限支持,部分系统需申请传输密钥 2. **导出代码步骤** ```abap 事务代码 SE80 -> 右键对象 -> SAPlink -> Nugget File ``` - 支持导出程序/函数组/类/数据字典等对象 - 生成`.nugg`文件包含对象元数据源代码 3. **导入代码步骤** ```abap 事务代码 SA38 -> 运行ZSAPLINK -> 上传.nugg文件 ``` - 需检查系统版本兼容性 - 支持对象覆盖依赖关系检查 #### ABAP Git方案 1. **环境配置** - 通过`https://github.com/larshp/abapGit`获取最新版本 - 安装ZABAPGIT程序包 2. **代码同步** ```abap 事务代码 ZABAPGIT -> 新建仓库 -> 配置.git文件 ``` - 支持GitHub/GitLab等平台对接 - 提供版本对比/冲突解决功能[^3] #### 三、标准传输请求方式 1. **创建传输请求** ```abap 事务代码 SE10 -> 创建工作台请求 ``` - 添加需要导出的开发对象 - 通过`Release`生成`.KTP`文件 2. **跨系统迁移** ```abap 事务代码 STMS -> 导入队列管理 ``` - 需配置传输路径(TMS) - 支持批量导入日志分析 #### 四、注意事项对比表 | 方法 | 适用场景 | 对象限制 | 系统要求 | |------------|-------------------|------------------|--------------| | SAPLINK | 单个对象快速迁移 | 不支持生产对象 | NW7.0+ | | ABAP Git | 团队协作开发 | 需HTTPS访问权限 | Unicode系统 | | 传输请求 | 正式系统部署 | 完整包结构要求 | TMS配置完成 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值