开启掘金成长之旅!这是我参与「掘金日新计划 · 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等不同的需求.
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 激活
" 指定行列 赋值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月 ,加油小百里~