设为首页 收藏本站
查看: 3697|回复: 0

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

[复制链接]

尚未签到

发表于 2015-5-26 10:16:22 | 显示全部楼层 |阅读模式
  最近遇到了一个需求,在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_node( ns_attribute ).
  ns_attribute = l_document->create_namespace_decl(
              name = 'x'
              prefix = 'xmlns'
              uri = 'urn:schemas-microsoft-com:office:excel' ).
  l_element_root->set_attribute_node( ns_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
*
  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 .
    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_data( i_table )."因为内表的每列数据要填写到excel的每行内。所以使用该方法将内表转换。
*  perform get_cell using t_itab-bukrs.
    loop at desc_struc->components ASSIGNING .
      ASSIGN COMPONENT -name OF STRUCTURE  TO ."动态绑定表格内容。
      CHECK sy-subrc IS INITIAL.
      r_cell = l_document->create_simple_element(
                  name = 'Cell'
                  parent = r_row ).
      l_value = -name.
      l_type  = -type_kind.    "fieldname, scrtext_m etc.
      CASE l_type.
        WHEN 'I' OR 'P' OR 'F' OR 'N'.
          l_type = 'String'.
          l_value = .
          CONDENSE l_value NO-GAPS.
        WHEN 'D' OR 'T'.
          l_type = 'String'.
          WRITE  TO l_text.
          l_value = l_text.
        WHEN OTHERS.
*          l_value = .    "Without conversion exit
          WRITE  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_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 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上。完成数据的上传。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-70809-1-1.html 上篇帖子: 如何在Webstorm/Phpstorm中设置连接FTP,并快速进行文件比较,上传下载,同步等操作 下篇帖子: 免费开源FTP Server软件FileZilla Server
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表