ftp服务器生成xml文件,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_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上。完成数据的上传。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成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、付费专栏及课程。

余额充值