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

什么是OLE2

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

前制动作及语法

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

上传文件到资源库

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

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

ABAP之 OLE2 的下载为EXCEL 的使用方式详解_前端_02

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

语法

数据准备

在使用该程序时,需要将输出的数据已经封装到对应的内表数据中,然后定义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 激活









" 指定行列 赋值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 的方式.

ABAP之 OLE2 的下载为EXCEL 的使用方式详解_数据_04


技术总结

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

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

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

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

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

ABAP之 OLE2 的下载为EXCEL 的使用方式详解_后端_05