ABAP之 OLE2 的下载为EXCEL 的使用方式详解

举报
百里丶落云 发表于 2023/08/09 10:42:03 2023/08/09
【摘要】 序HELLO, 这里是百里,一个学习中的ABAPER,今天讲的内容是OLE2的使用方式.在SAP业务中,存在着很多需要导出为EXCEL的情况,当然本身SAP系统是存在支持导出为EXCEL的功能,也支持导出为txt等多种格式,但是导出的内容为全面内容, 即你看到的内容就是我导出的内容,没办法按照想要的格式进行导出.那么就触发了这项功能OLE2 . 什么是OLE2通俗的讲就是调用系统模块ole...

HELLO, 这里是百里,一个学习中的ABAPER,今天讲的内容是OLE2的使用方式.在SAP业务中,存在着很多需要导出为EXCEL的情况,当然本身SAP系统是存在支持导出为EXCEL的功能,也支持导出为txt等多种格式,但是导出的内容为全面内容, 即你看到的内容就是我导出的内容,没办法按照想要的格式进行导出.那么就触发了这项功能OLE2 .

什么是OLE2

通俗的讲就是调用系统模块ole2.dll 生成对应excel 的数据. 我们可以把自己定义的内容,按照自己逻辑,输出应有的格式以及做对应裁剪等操作.

前制动作及语法

在SAP中调用OLE2之前需要先上传对应的文件资源,即你的内容是在你上传的资源的基础上输出的内容,文字的各式大小排版可以提前设定好,当然代码中可以控制合并,居中,锁定单元格等动作,但是作为传统业务,我们其实用不到那些 .

上传文件到资源库

操作方式是 输入TCODE -->SMW0 ,进入下一层直接执行, 在进入下一层,点左上角创建内容, 输入对象名称, 及对应的描述内容,将已经设定好的模板,导入到资源库 .

image.png

image.png

image.png

语法

数据准备

在使用该程序时,需要将输出的数据已经封装到对应的内表数据中,然后定义OLE2 需要使用的共用数据结构.

data : msgxls TYPE string .  
*一、下载EXCEL模板FORM  
  DATA: lo_objdata     LIKE wwwdatatab,  
        lo_mime        LIKE w3mime,  
      "  lc_filename    TYPE string VALUE'测试.xlsx',  
        lc_filename    TYPE string ,  
        lc_fullpath    TYPE string , " VALUE'D:\test\' ,  
        lc_path        TYPE string , "  VALUE'D:\test\' ,  
        ls_destination LIKE rlgrap-filename,  
        fname          LIKE rlgrap-filename,  
        ls_objnam      TYPE string,  
        li_rc          LIKE sy-subrc,  
        ls_errtxt      TYPE string.  
  DATA:p_objid TYPE wwwdatatab-objid,  
       p_dest  LIKE sapb-sappfad.  
  p_objid = 'csmoban'. "此处为EXCEL模板名称d  
  
 msgxls =  '测试表.xls' .  
   lc_filename   =  msgxls .  
*      lc_path = P_FILENM.  
*      lc_filename = P_FILENM.

创建对象及对应的行列控制

通过创建对应,并且调用函数cl_gui_frontend_services=>file_save_dialog. 输入对应的 lc_filename 其中按照对应的用户操作分为,下载完打开excel, 关闭excel . 分成多个sheet等不同的需求.

CALL METHOD cl_gui_frontend_services=>file_save_dialog "调用保存对话框  
    EXPORTING  
      default_extension    = 'XLS'  
      default_file_name    = lc_filename  
    CHANGING  
      filename             = lc_filename  
      path                 = lc_path  
      fullpath             = lc_fullpath  
    EXCEPTIONS  
      cntl_error           = 1  
      error_no_gui         = 2  
      not_supported_by_gui = 3  
      OTHERS               = 4.  
  IF lc_fullpath = ''.  
    MESSAGE  '不能打开excel' TYPE 'E'.  
  ENDIF.  
  IF sy-subrc = 0.  
    p_dest = lc_fullpath.  
*    concatenate p_objid '.XLS' into ls_objnam.  
    CONDENSE ls_objnam NO-GAPS.  
    SELECT SINGLE relid objid FROM wwwdata INTO CORRESPONDING FIELDS OF lo_objdata  
           WHERE srtf2 = 0 AND relid = 'MI' AND objid = p_objid.  
  
*检查表wwwdata中是否存在所指定的模板文件  
    IF sy-subrc NE 0 OR lo_objdata-objid EQ space. "如果不存在,则给出错误提示  
      CONCATENATE '模板文件' ls_objnam '不存在' INTO ls_errtxt.  
      MESSAGE ls_errtxt TYPE 'I'.  
    ENDIF.  
    ls_destination = p_dest. "保存路径  
  
*如果存在,调用DOWNLOAD_WEB_OBJECT 函数下载模板到路径下  
    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'  
      EXPORTING  
        key         = lo_objdata  
        destination = ls_destination  
      IMPORTING  
        rc          = li_rc.  
    IF li_rc NE 0.  
      CONCATENATE '模板文件:' ls_objnam '下载失败' INTO ls_errtxt.  
      MESSAGE ls_errtxt TYPE 'E'.  
    ENDIF.  
    fname = ls_destination.  
  ENDIF.  


数据处理

创建CALL METHOD OF excel 进行创建sheet 的对应页签, 之后数行数列. 没错就是数行数列的方式.
如果是按照数据罗列递增的 可以创建宏或者子例程的方式循环增加 .其中 row 是行. col 是列 ,通过调用

CALL METHOD OF excel 'CELLS' = cell EXPORTING #1 = &1 #2 = &2.     SET PROPERTY OF cell 'VALUE' = &3. 赋值对应数据. 以下 是我的一个demo ,其中设计到拼接, 循环追加内容. 合并单元个的动作. 内容不难 .

*二、下载完模板后,打开模板文件,填入数据  
  DATA: excel    TYPE ole2_object,  
        workbook TYPE ole2_object,  
        sheet    TYPE ole2_object,  
        cell     TYPE ole2_object,  
        cell1    TYPE ole2_object,  
        column   TYPE ole2_object,  
        range    TYPE ole2_object,  
        borders  TYPE ole2_object,  
        button   TYPE ole2_object,  
        int      TYPE ole2_object,  
        font     TYPE ole2_object,  
        lc_range TYPE ole2_object.  
  DATA: application TYPE ole2_object,  
        book        TYPE ole2_object,  
        books       TYPE ole2_object.  
  DATA: ole_book    TYPE ole2_object.  
  DATA: sheetname(10).  
  DATA:  
    row        TYPE i,  
    col1        TYPE i,  
    col2        TYPE i,  
  
    f_row      TYPE i,  
    singleFlag TYPE i VALUE 1.  
  CREATE OBJECT excel 'EXCEL.APPLICATION'.  "Create EXCEL OBJECT  
  IF sy-subrc NE 0.  
    EXIT.  
  ENDIF.  
 SET PROPERTY OF excel 'Visible' = 0.  "1/0 是否显示EXCEL  
  
  
  
  
  
 CALL METHOD OF excel 'Workbooks' = workbook.  
  
  
 CALL METHOD OF workbook 'Open' = workbook  
  EXPORTING  
    #1 = fname. "打开上面下载路径下的excel文件  
  
  
  
  CALL METHOD OF excel '表1' = sheet.  
  "CALL METHOD OF excel  '报表'  .  
  
  "--  CALL METHOD OF sheet 'Select'.  
  
  CALL METHOD OF sheet 'ACTIVATE'."sheet 激活  
  
  
  
  
  
  
  
  
  
  " 指定行列 赋值EXCELDEFINE  add_data.  
    CALL METHOD OF excel 'CELLS' = cell EXPORTING #1 = &1 #2 = &2.  
    SET PROPERTY OF cell 'VALUE' = &3.  
  END-OF-DEFINITION.  
  
  
data : lt_msg TYPE char20  .  
  
" 抬头  
  
row =  3  .  
col1 = 1 .  
  
  
SELECT  SINGLE  BUTXT  from  T001 where bukrs = @s_RBUKRS  into @data(ls_butxt) .  
  
lt_msg =    '公司名称:     ' && ls_butxt  .  
  
add_data  row col1  lt_msg.  
  
CLEAR lt_msg .  
  
row =  3  .  
col1 = 2 .  
  
lt_msg =    p_FISC-low   && '-'   &&  p_FISC-high   .  " p_GJAHR-low  && '年'   &&  p_POPER && '月'      .  
  
add_data  row col1  lt_msg   .  
CLEAR lt_msg .  
  
  
" 处理数据  
  
  
col1 = 3 .  
col2 = 4 .  
row =  5 .  
  
  
  
  
" 处理数据 如果金额为0  那么不显示。  
LOOP AT gt_Data INTO gs_Data  where  dmbtr1 =  0  or  dmbtr2 = 0.  
IF gs_Data-dmbtr1 = 0.  
gs_Data-dmbtr1 = '' .  
  
ENDIF.  
  
IF gs_Data-dmbtr2 = 0 .  
  gs_Data-dmbtr2 = '' .  
  
ENDIF.  
  
MODIFY gt_Data from gs_Data.  
  
ENDLOOP.  
  
  
  
  
LOOP AT  gt_Data into  gs_Data .  
  
  
IF  row  < 54 .  
"  3  
add_data  row col1 gs_Data-dmbtr1 .  
  
  
" 4  
add_data  row col2 gs_Data-dmbtr2 .  
ENDIF.  
  
  
row = row + 1 .  
  
  
  
  
ENDLOOP.  
  
  
  
  
  
  
SET PROPERTY OF excel 'Visible' = 0.  "1/0 是否显示EXCEL  
  
  GET PROPERTY OF excel 'ActiveSheet' = sheet. "获取活动SHEET  
  
  GET PROPERTY OF excel 'ActiveWorkbook' = workbook.  
  CALL METHOD OF workbook 'SAVE'.  
  
 CALL METHOD OF workbook 'CLOSE'.                   "关闭工作簿  
"  CALL METHOD OF workbook 'OPEN'.                   "打开工作簿  
 CALL METHOD OF excel 'QUIT'.                    "关闭EXCEL程序(仅限程序创建的活动)  
  
  FREE OBJECT sheet.  
  FREE OBJECT workbook.  
  FREE OBJECT excel.  
  
  
  


结果

把功能封装到按钮上,数据对应的数据结果,并下载成excel ,采取非直接打开excel 的方式.

image.png

image.png

技术总结

本篇文章讲述的是如何将数据,通过调用OLE2 的函数将数据按照用户逻辑, 下载成excel 到电脑中.
在实际业务中,SD ,fico ,采购单,订购单等业务数据均会出现对应的需求业务, 如采购核对订单, 月结季度表等等,都是需要从系统中导出对应数据, 对比sap 自带的 导出excel 增加了部分客制化的优点 .

少年易老学难成,一寸光阴不可轻 .

这里是百里,一个努力的学习者,

.努力学习好好记录,点滴进步,就是成功.

秋天的雪比冬天早一点, 比秋天晚一点, 你好12月 ,加油小百里~

微信图片_20221202230917.jpg

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。