@SAP ABAP OLE批量下载文件
目前在做DOI的程序,发现OAOR与SMW0有相似之处。OAOR可以单独获取文件夹地址与目标文件名拼接下载。但是之前OLE下载方式都是针对一个文件的,现在摸索出了批量方式(有限制
- 这里将先将主要代码粘贴进来。(可先看后面
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,再替换即可。
缺点
不知道是哪里没有清空或者释放,在文件下载到一定数量时,会使电脑卡顿,再到一定数量时开始黑屏卡死。
建议