STRANS高效导出数据到WORD/EXCEL

在日常的报表开发中,经常会遇到数据导出到本地的需求,或是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

精选知识

生成XML文件ABAP程序 REPORT zams_xml_dom_create . TYPE-POOLS: ixml. CLASS cl_ixml DEFINITION LOAD. TYPES: BEGIN OF xml_line, data(256) TYPE x, END OF xml_line. DATA: l_ixml TYPE REF TO if_ixml, l_streamfactory TYPE REF TO if_ixml_stream_factory, l_ostream TYPE REF TO if_ixml_ostream, l_renderer TYPE REF TO if_ixml_renderer, l_document TYPE REF TO if_ixml_document. DATA:l_element_ArchiveBatch TYPE REF TO if_ixml_element, l_element_BatchNumber TYPE REF TO if_ixml_element, l_element_TotalFiles TYPE REF TO if_ixml_element, l_element_TotalVolumes TYPE REF TO if_ixml_element, l_element_TotalPieces TYPE REF TO if_ixml_element, l_element_Entries TYPE REF TO if_ixml_element, l_element_Entry TYPE REF TO if_ixml_element, l_element_RecordsCombiningType TYPE REF TO if_ixml_element, l_element_FilePath TYPE REF TO if_ixml_element, l_element_SourceFileName TYPE REF TO if_ixml_element, l_element_ClassificationCode TYPE REF TO if_ixml_element, l_element_ElectronicRecordCode TYPE REF TO if_ixml_element, l_value TYPE string, l_name type string. DATA: l_xml_table TYPE TABLE OF xml_line, l_xml_size TYPE i, l_rc TYPE i. START-OF-SELECTION. *Creating a ixml factory l_ixml = cl_ixml=>create( ). *Creating the dom object model l_document = l_ixml->create_document( ). *Fill root node with value ArchiveBatch l_element_ArchiveBatch = l_document->create_simple_element( name = 'ArchiveBatch' parent = l_document ). * clear l_value. * l_value = '"http://www.w3.org/2001/XMLSchema-instance"'. * l_rc = l_element_ArchiveBatch->set_attribute( name = 'xmlns: *xsi' * value = l_value ). * * clear l_value. * concatenate '"D:\dev\vs\projects\AMS\DotNet\Sinopec.Ams.' * 'Integration\bin\Debug\config\AmsIntegration.xsd"' * into l_value. * l_name = 'xsi:noNamespaceSchemaLocation'. * l_rc = l_element_ArchiveBatch->set_attribute( name = l_name *value = l_value ). *BatchNumber l_element_BatchNumber = l_document->create_simple_element( name = 'BatchNumber' value = '20100609001' parent = l_element_ArchiveBatch ). *TotalFiles l_element_TotalFiles = l_document->create_simple_element( name = 'TotalFiles' value = '5' parent = l_element_ArchiveBatch ). *TotalVolumes l_element_TotalVolumes = l_document->create_simple_element( name = 'TotalVolumes' value = '3' parent = l_element_ArchiveBatch ). *TotalPieces l_element_TotalPieces = l_document->create_simple_element( name = 'TotalPieces' value = '5' parent = l_element_ArchiveBatch ). *Entries l_element_Entries = l_document->create_simple_element( name = 'Entries' parent = l_element_ArchiveBatch ). *Entry1 l_element_Entry = l_document->create_simple_element( name = 'Entry' parent = l_element_Entries ). *Entry1下面的子项 *RecordsCombiningType l_element_RecordsCombiningType = l_document->create_simple_element( name = 'RecordsCombiningType' value = 'Volume' parent = l_element_Entry ). *FilePath l_element_FilePath = l_document->create_simple_element( name = 'FilePath' value = '全宗001/目录001/案卷001/档案一.docx' parent = l_element_Entry ). *SourceFileName l_element_SourceFileName = l_document->create_simple_element( name = 'SourceFileName' value = '档案一' parent = l_element_Entry ). *ClassificationCode l_element_ClassificationCode = l_document->create_simple_element( name = 'ClassificationCode' value = 'wenshu' parent = l_element_Entry ). *ElectronicRecordCode l_element_ElectronicRecordCode = l_document->create_simple_element( name = 'ElectronicRecordCode' value = 'BJSH-001' parent = l_element_Entry ). *Entry1 * Creating a stream factory l_streamfactory = l_ixml->create_stream_factory( ). * Connect internal XML table to stream factory l_ostream = l_streamfactory->create_ostream_itable( table = l_xml_table ). * Rendering the document l_renderer = l_ixml->create_renderer( ostream = l_ostream document = l_document ). l_rc = l_renderer->render( ). * Saving the XML document l_xml_size = l_ostream->get_num_written_raw( ). CALL METHOD cl_gui_frontend_services=>gui_download EXPORTING bin_filesize = l_xml_size filename = 'c:\temp\metas.xml' filetype = 'BIN' CHANGING data_tab = l_xml_table EXCEPTIONS OTHERS = 24. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值