【SAP ABAP】OLE批量下载文件

该文章介绍了一种在SAP环境下,利用OAOR功能和COM对象技术批量下载文件的方法。通过调用DOWNLOAD_WEB_OBJECT函数从SMW0事务码的模板中下载文件,并结合用户选择的路径,实现了文件的批量下载。然而,当下载数量较大时,可能会导致电脑性能下降甚至卡死。
摘要由CSDN通过智能技术生成

@SAP ABAP OLE批量下载文件

目前在做DOI的程序,发现OAOR与SMW0有相似之处。OAOR可以单独获取文件夹地址与目标文件名拼接下载。但是之前OLE下载方式都是针对一个文件的,现在摸索出了批量方式(有限制

  1. 这里将先将主要代码粘贴进来。(可先看后面
  DATA:lv_index TYPE i.
  DATA: BEGIN OF ls_data ,
          path TYPE char300,
        END OF ls_data.
  DATA:lt_data LIKE TABLE OF ls_data.
  DATA: wg_downf(128) TYPE c,  "下载模板名称
        c_temp        TYPE wwwdatatab.

  READ TABLE gt_data INTO gs_data WITH  KEY message = '' sel = 'X'.
  IF sy-subrc <> 0.
    MESSAGE '有错误行' TYPE 'S' DISPLAY LIKE  'E'.
    RETURN.
  ENDIF.
  
* 文件路径选择
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_filename     = 'EXPROT'
      def_path         = 'C:\'
      mask             = ',EXCEL文件(*.XLSX),*.xlsx,*.*,'
      mode             = 'S'
      title            = '请选择文件路径'
    IMPORTING
      filename         = g_path
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.
  IF sy-subrc = '3'.      "点取消退回
    MESSAGE '用户取消保存' TYPE 'S'.
    RETURN.
  ENDIF.

  CHECK NOT g_path IS INITIAL.

* 下载EXCEL模板
*使用事物码SMW0上传好模版之后 此参数可以在WWWDATA表中查询到
  c_temp-relid = 'MI'.
  c_temp-objid = cs_objname. // SMW0模板名称

”循环选中行数据
  LOOP AT gt_data INTO gs_data WHERE sel = 'X' AND message = ''.

    CLEAR:lt_data,lv_index.
    
    SPLIT g_path AT '\' INTO TABLE lt_data."将地址按照 \ 进行拆分
    lv_index = lines( lt_data )."获取拆分表的行数
    
   "读取最后一行,也就是  文件名.XLS
    READ TABLE lt_data INTO ls_data INDEX lv_index.
    IF sy-subrc = 0.
    "将文件名替换为  自定义名称.XLSX
      REPLACE  ls_data-path IN g_path WITH gs_data-zname && gs_data-zid && '.XLSX' IN  CHARACTER MODE.
      CLEAR:ls_data.
    ENDIF.
    
    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        key         = c_temp 
        destination = g_path.
    IF sy-subrc <> 0.
      MESSAGE '下载模板失败' TYPE 'S' DISPLAY LIKE 'E'.
      RETURN.
    ENDIF.
    PERFORM expot_excel USING g_path. // OLE填充数据 
  ENDLOOP.

下面是 FORM expot_excel 的代码


  INCLUDE ole2incl.
  DATA: g_excel TYPE ole2_object,
        g_wbook TYPE ole2_object,
        g_sheet TYPE ole2_object,
        g_range TYPE ole2_object.
  DATA: g_visible TYPE i VALUE 0.

  DATA:lv_txtpost TYPE string.
  DATA:lv_code  TYPE char30.



  lv_code = gs_data-zid && '/' && '15972279761'.

  PERFORM sub_initialization USING g_excel
                                    g_wbook
                                    l_file
                                    g_sheet
                                    g_visible.
."岗位获取 ,项目特有,粘贴时请忽略
  PERFORM frm_post_txt USING gs_data-zpostlv CHANGING lv_txtpost

  PERFORM sub_write_cell USING:
        g_sheet 1  2 gs_data-zname,
        g_sheet 1 5  gs_data-zid,
        g_sheet 2  5 '宇宙CTRL商务局',
        g_sheet 4 2 '男',
        g_sheet 4 5  gs_data-zyear,
        g_sheet 7 2 lv_txtpost,
        g_sheet 10 2 '123123123123',
        g_sheet 10 5 '32132131@qq.com',
        g_sheet 5 7  lv_code.

  PERFORM sub_save_excel USING  g_excel
        g_wbook
        l_file
        g_visible.

  CLEAR:g_excel,g_wbook,g_sheet,g_range,g_visible,lv_txtpost,lv_code.

下面是 FORM sub_save_excel 的代码

 SET PROPERTY OF excel 'DisplayAlerts' = 0.
  CALL METHOD OF wbook 'SAVEAS'
    EXPORTING
      #1 = filename.
      
  IF visible EQ 0.
    CALL METHOD OF wbook 'Close'.
    CALL METHOD OF excel 'QUIT'.
  ENDIF.
  
  FREE OBJECT wbook. "释放工作簿
  FREE OBJECT excel.

  WAIT UP TO '0.2' SECONDS.

其实最主要的就是在 DOWNLOAD_WEB_OBJECT,这是从SMW0中下载模板到本地。我们获取文件地址时并不能选中文件夹,而是需要给出一个文件名,所以这里默认了一个文件名’EXPORT’,其实文件名是什么都无所谓,最后都会被替换掉。

    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        key         = c_temp 
        destination = g_path.

替换时是无法确定用户的文件夹层级有多少的,所以就需要按照 ‘\’ 切割,获取最后一行的数据,即文件名.XLS,再替换即可。

缺点

不知道是哪里没有清空或者释放,在文件下载到一定数量时,会使电脑卡顿,再到一定数量时开始黑屏卡死。
建议

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值