• SAP将内表生成XML作为excel保存到FTP


          最近遇到了一个需求,在sap后台按月将数据导入到ftp服务器上,并保存为excel文件。之前的做法是将文件生成到本地,然后上传到sap服务器上。但是sap服务器后台运行程序的时候并不存在本地路径,因此要求直接将内表保存为excel格式传输到ftp上。据我了解,sap并不支持ole的传输,于是就想到使用xml方式传输到ftp上,然后将扩展名保存为*.xls同样可以使用excel打开。于是对程序进行了如下的改写。

    1.创建XML文件

       l_ixml cl_ixml=>create).
    * Creating the dom object model
      l_document l_ixml->create_document).
    * Create root node 'Workbook'
      l_element_root  l_document->create_simple_element(
                  name 'Workbook'
    *              uri  = 'urn:schemas-microsoft-com:office:spreadsheet'
                  parent l_document ).
      l_element_root->set_attribute(
      name 'xmlns'
      value 'urn:schemas-microsoft-com:office:spreadsheet' ).
      ns_attribute l_document->create_namespace_decl(
                  name 'ss'
                  prefix 'xmlns'
                  uri 'urn:schemas-microsoft-com:office:spreadsheet' ).
      l_element_root->set_attribute_nodens_attribute ).
      ns_attribute l_document->create_namespace_decl(
                  name 'x'
                  prefix 'xmlns'
                  uri 'urn:schemas-microsoft-com:office:excel' ).
      l_element_root->set_attribute_nodens_attribute ).
    * Create node for document properties.
      r_element_properties l_document->create_simple_element(
                  name 'DocumentProperties'
                  parent l_element_root ).
      l_value sy-uname.
      l_document->create_simple_element(
                        name 'Author'
                        value l_value
                        parent r_element_properties  ).

     2.创建excel表名
      r_worksheet l_document->create_simple_element(
                     name 'Worksheet '
                     parent l_element_root ).
      r_worksheet->set_attribute_ns(
      name 'Name'
      prefix 'ss'
      value table_name ).
    * table
    * <Table ss:ExpandedColumnCount="3" ss:ExpandedRowCount="1" x:FullColumns="1" x:FullRows="1">
      r_table l_document->create_simple_element(
      name 'Table'
      parent r_worksheet ).

      3.创建column

        因为xml格式的excel为先column,然后再每个row下存在cell,所以先循环输出column。   

     LOOP AT i_table INTO wa_tab.
        r_column l_document->create_simple_element(
        name 'Column'
        parent r_table ).
      endloop.

        4.row和内容类型

            r_row l_document->create_simple_element(
                  name 'Row'
                  parent r_table ).
          r_cell l_document->create_simple_element(
              name 'Cell'
              parent r_row ).
          r_data l_document->create_simple_element(
                      name 'Data'
                      value '人员基本信息'
                      parent r_cell ).
          r_data->set_attribute_ns(
                              name 'Type'
                              prefix 'ss'
                              value 'String' ).

      将内表填写到excel表格内

       loop at i_table ASSIGNING <data_line>.
        i_index i_index + 1.
        l_index i_index.
        r_row l_document->create_simple_element(
                name 'Row'
                parent r_table ).
        r_cell l_document->create_simple_element(
                name 'Cell'
                parent r_row ).
        r_data l_document->create_simple_element(
                    name 'Data'
                    value l_index
                    parent r_cell ).
        r_data->set_attribute_ns(
                            name 'Type'
                            prefix 'ss'
                            value 'String' ).
        desc_struc ?= cl_abap_typedescr=>describe_by_datai_table )."因为内表的每列数据要填写到excel的每行内。所以使用该方法将内表转换。
    *  perform get_cell using t_itab-bukrs.
        loop at desc_struc->components ASSIGNING <field_name>.
          ASSIGN COMPONENT <field_name>-name OF STRUCTURE <data_line> TO <field>."动态绑定表格内容。
          CHECK sy-subrc IS INITIAL.
          r_cell l_document->create_simple_element(
                      name 'Cell'
                      parent r_row ).
          l_value <field_name>-name.
          l_type  <field_name>-type_kind.    "fieldname, scrtext_m etc.
          CASE l_type.
            WHEN 'I' OR 'P' OR 'F' OR 'N'.
              l_type 'String'.
              l_value <field>.
              CONDENSE l_value NO-GAPS.
            WHEN 'D' OR 'T'.
              l_type 'String'.
              WRITE <field> TO l_text.
              l_value l_text.
            WHEN OTHERS.
    *          l_value = <field>.    "Without conversion exit
              WRITE <field> TO l_text.
              SHIFT l_text LEFT DELETING LEADING space.
              l_value l_text.
              l_type 'String'.
          ENDCASE.
          r_data l_document->create_simple_element(
                    name 'Data'
                    value l_value
                    parent r_cell ).
          r_data->set_attribute_ns(
                            name 'Type'
                            prefix 'ss'
                            value l_type ).
        endloop.
      ENDLOOP.

     xml生成输出

        l_streamfactory l_ixml->create_stream_factory).
    *   Connect internal XML table to stream factory
      l_ostream l_streamfactory->create_ostream_itabletable l_xml_table ).
    *   rendering the document
      l_renderer l_ixml->create_rendererostream  l_ostream
                                            document l_document ).
      l_rc l_renderer->render).
    *   saving the xml document
      l_xml_size l_ostream->get_num_written_raw).

      最后 使用上传方法绑定内表名称,完成上传。

              CALL FUNCTION 'FTP_R3_TO_SERVER'
              EXPORTING
                handle      hdl
                fname       'Excle.xls'"此处将xml文件作为excel格式保存,不影响访问。

                blob_length l_xml_size          

              TABLES
                blob        l_xml_table.

    至此,通过xml完成直接将内表中的数据作为文件保存到ftp上。完成数据的上传。
          

  • 相关阅读:
    JMeter实现登录初始化(类似LR的init函数功能实现)
    修改ini文件的批处理
    pycharm-professional-2017.1.1.exe专业版激活方法
    loadrunner下的putty和plink
    Centos下安装LoadRunner负载机
    VMware安装操作系统提示 " Intel VT-x 处于禁用状态"解决方法
    mongodb中投票节点作用
    crunch创建自己的密码字典文件
    Nessus忘记密码的解决
    shell判断文件是否为空
  • 原文地址:https://www.cnblogs.com/purehunter/p/2113879.html
Copyright © 2020-2023  润新知