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

2022-12-05 08:37:35 浏览数 (2)


开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情

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

什么是OLE2

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

前制动作及语法

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

上传文件到资源库

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

语法

数据准备

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

代码语言:javascript复制
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等不同的需求.

代码语言:javascript复制
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 ,其中设计到拼接, 循环追加内容. 合并单元个的动作. 内容不难 .

代码语言:javascript复制
*二、下载完模板后,打开模板文件,填入数据  
  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 激活  
  
  
  
  
  
  
  
  
  
  " 指定行列 赋值EXCEL 值  
  DEFINE  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 的方式.

技术总结

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

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

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

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

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

0 人点赞