在日常的报表开发中,经常会遇到数据导出到本地的需求,或是EXCEL或是WORD,没有具体格式要求还好,但是用户经常会要求按照固定格式导出,这个时候通常使用OLE模板做导出。但是在数据量较大时,OLE的性能是令人堪忧的,况且,开发OLE导出也并不令人愉快。
其实SAP有自带一个STRANS模板导出,核心是通过把内表数据直接写入到EXCEL或WORD的XML代码中,然后直接将XML转换为EXCEL/WORD格式进行导出。对比OLE操作EXCEL的效率,提升还是很明显的。
下面以WORD为例,将STRANS导出的操作做一个简单的说明。
1 建一个word或者excel 模板
2 把word另存为xml格式
注意要选择2003的版本 sap和新版本的office软件兼容性不好
xml extensiable markuplanguage 可扩展标记语言
在XML语言中,它允许用户自定义标签。一个标签用于描述一段数据;一个标签可以分为开始标签和结束标签,在开始标签和结束标签之间,又可以使用其他标签描述其他数据,以此来实现数据关系的描述。)
3 打开xml文件
此处在Chrome中打开
4 打开sap 新建strans
t-code strans
建好后STRANS界面如下图
5 将打开的xml文件内容全部复制到新建的strans中并激活
6调用strans
下面贴出调用strans的一个demo
REPORT zstranstest.
TYPES: BEGIN OF ts_head_xml,
h1 TYPE string,
h2 TYPE string,
END OF ts_head_xml.
TYPES: tt_head_xml TYPE TABLE OF ts_head_xml.
TYPES: BEGIN OF ts_item_xml,
d1 TYPE string,
d2 TYPE string,
END OF ts_item_xml.
TYPES: tt_item_xml TYPE TABLE OF ts_item_xml.
DATA: ls_head TYPE ts_head_xml,
lt_head TYPE tt_head_xml,
ls_item TYPE ts_item_xml,
lt_item TYPE tt_item_xml.
DATA: xml_str TYPE string,
xml_tab TYPE TABLE OF char1024,
w_len TYPE i,
l_bindata TYPE xstring,
l_cntbin TYPE sdokcntbins.
DATA: l_filename TYPE string,
l_file_path TYPE string,
l_full_path TYPE string,
l_doc_name TYPE localfile.
DATA: lo_xml_doc TYPE REF TO cl_xml_document.
ls_head-h1 = '这是标题'.
ls_head-h2 = '这是副标题'.
ls_item-d1 = '我是内容1'.
ls_item-d2 = '我是内容2'.
APPEND ls_item TO lt_item.
ls_item-d1 = '我是内容α'.
ls_item-d2 = '我是内容β'.
APPEND ls_item TO lt_item.
CALL TRANSFORMATION zstranstest "调用 strans
SOURCE
gs_head = ls_head "抬头
gt_item = lt_item "行项目
RESULT XML xml_str.
*~~~~~~~~~~~~~~~~~~~~~从这里开始 固定格式~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = xml_str
* MIMETYPE = ' '
IMPORTING
buffer = l_bindata
EXCEPTIONS
failed = 1
OTHERS = 2.
IF sy-subrc = 0.
ENDIF.
CLEAR w_len.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = l_bindata
IMPORTING
output_length = w_len
TABLES
binary_tab = l_cntbin.
*~~~~~~~~~~~~~~~~~~~~到这里为止 固定格式~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
l_filename = 'TEST-STRANS'.
CALL METHOD cl_gui_frontend_services=>file_save_dialog "调用保存对话框
EXPORTING
default_extension = 'DOC' "把文件保存成.doc格式 (word文档) excel的是.xls
default_file_name = l_filename
CHANGING
filename = l_filename
path = l_file_path
fullpath = l_full_path
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc NE 0.
PERFORM sys_msg_raise.
ELSE.
l_doc_name = l_full_path.
CREATE OBJECT lo_xml_doc.
lo_xml_doc->parse_string( xml_str ).
lo_xml_doc->export_to_file( l_doc_name ).
ENDIF.
FORM sys_msg_raise RAISING zcx_exception.
DATA: lv_msg TYPE string.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_msg.
PERFORM raise_err USING lv_msg '' '' ''.
ENDFORM.
FORM raise_err USING u_msgv1
u_msgv2
u_msgv3
u_msgv4
RAISING zcx_exception.
RAISE EXCEPTION TYPE zcx_exception
EXPORTING
msg_v1 = |{ u_msgv1 }|
msg_v2 = |{ u_msgv2 }|
msg_v3 = |{ u_msgv3 }|
msg_v4 = |{ u_msgv4 }|.
7 strans中变量控制
在abap代码中call strans时,是可以导入内表和工作区数据的,且数量不受限制。
但是要注意abap代码中的变量要和strans中的顶一对应起来。
工作区中的字段变量替换:
将xml中
<w:t> </w:t>
之间字段的具体值替换为我们传入的变量
<w:t> <tt:value ref="GS_HEAD.H1"/> </w:t>
通过LOOP实现将内表中的变量填入
先LOOP 内表
<tt:loop ref=".GT_ITEM">
在LOOP中替换变量
<w:t><tt:value ref="$ref.D1"/></w:t>
结束LOOP
</tt:loop>
8 导出
运行刚刚的DEMO,导出WORD到本地。
快去试试吧~
今天的经验分享就到这里拉,小伙伴们学会了吗?赶快打开SAP试试看吧。觉得有用的小伙伴,还请多转发留言鼓励小菜哦。
-END-
更多经验请关注公众号“菜鸟之家”,每周分享顾问经验,绝对干货满满!
长按二维码关注我们,收获更多干货满满的SAP教学。
小手点一点关注,顾问路上不迷路!
扫描二维码或添加管理员微信号LH3577049加入顾问群
图文来源:Yannick
图文编辑:Yannick
精选知识