ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ABAP-ecc后台把内表生成XML作为excel保存到FTP

2021-08-17 11:31:27  阅读:200  来源: 互联网

标签:XML FTP ecc TYPE create element document DATA


参考了https://www.cnblogs.com/purehunter/archive/2011/07/22/2113879.html

遇到的需求是有6个内表需要导出数据到一个excel里,分成6个sheet,按月导出,后台处理,针对楼上老哥的代码做了些小改动,hana的话应该还可以用abap2xlsx来做。

  1 REPORT y_xb_test3.
  2 
  3 DATA:gt_sflight TYPE TABLE OF sflight.
  4 DATA:gt_t001l TYPE TABLE OF t001l.
  5 
  6 START-OF-SELECTION.
  7 
  8   DATA: l_user(30) TYPE c VALUE 'admin',           "用户名
  9         l_pwd(30)  TYPE c VALUE '1234test',        "密码
 10         l_host(64) TYPE c VALUE '192.1.XX.XX',     "FTP服务器地址
 11         l_path(64) TYPE c VALUE '/',       "路径
 12         l_rc(1),
 13         l_dest     TYPE rfcdes-rfcdest VALUE 'SAPFTP'. "前端:sapftp   后台运行:sapftpa.
 14 
 15   DATA: l_handle       TYPE i,
 16         l_command(255) TYPE c,
 17         l_result       TYPE TABLE OF txmisporow,
 18         l_filename     TYPE rlgrap-filename,
 19         l_pwdlength    TYPE i,
 20         l_length       TYPE i,
 21         l_ftppwd(255)  TYPE c,
 22         l_key          TYPE i VALUE 26101957,
 23         l_encoding     TYPE abap_encoding VALUE '8400'.
 24 
 25   DATA: l_binary_tab LIKE TABLE OF solix.
 26 
 27   SELECT *
 28     FROM sflight
 29     INTO TABLE gt_sflight.
 30 
 31   SELECT *
 32     FROM t001l
 33     INTO TABLE gt_t001l
 34    UP TO 10 ROWS.
 35 
 36   l_pwdlength = strlen( l_pwd ).
 37 
 38 
 39   IF sy-batch = 'X'.
 40     l_dest = 'SAPFTPA'.
 41   ELSE.
 42     l_dest = 'SAPFTP'.
 43   ENDIF.
 44 *****************开始FTP传输数据**********
 45   CALL FUNCTION 'HTTP_SCRAMBLE' "密码加密
 46     EXPORTING
 47       source      = l_pwd
 48       sourcelen   = l_pwdlength
 49       key         = l_key
 50     IMPORTING
 51       destination = l_ftppwd.
 52 
 53   "创建FTP连接
 54 
 55   CALL FUNCTION 'FTP_CONNECT'
 56 
 57     EXPORTING
 58       user            = l_user
 59       password        = l_ftppwd
 60       host            = l_host
 61       rfc_destination = l_dest
 62     IMPORTING
 63       handle          = l_handle
 64     EXCEPTIONS
 65       not_connected   = 1
 66       OTHERS          = 2.
 67 
 68   IF sy-subrc <> 0.
 69     MESSAGE 'FTP path error' TYPE 'S' DISPLAY LIKE 'E'.
 70     LEAVE LIST-PROCESSING.
 71   ENDIF.
 72 
 73   l_rc = COND #( WHEN l_path+(1) = '/' THEN ' ' ELSE ' /' ).
 74   CONCATENATE 'cd' l_path INTO l_command SEPARATED BY l_rc. "拼接FTP命令,这里是打开文件夹地址
 75 
 76   CALL FUNCTION 'FTP_COMMAND' "执行FTP命令
 77     EXPORTING
 78       handle        = l_handle
 79       command       = l_command
 80     TABLES
 81       data          = l_result
 82     EXCEPTIONS
 83       tcpip_error   = 1
 84       command_error = 2
 85       data_error    = 3
 86       OTHERS        = 4.
 87 
 88   IF sy-subrc <> 0.
 89 *    PERFORM ftp_disconnect USING l_handle l_dest.
 90     MESSAGE 'FTP path error' TYPE 'E'.
 91   ENDIF.
 92 
 93   CONCATENATE 'TEST' sy-datum  '.xls' INTO l_filename.
 94 
 95 
 96   DATA(l_ixml) = cl_ixml=>create( ).
 97 * Creating the dom object model   创建dom对象模型
 98   DATA(l_document) = l_ixml->create_document( ).
 99 * Create root node 'Workbook'  创建根节点
100   DATA(l_element_root)  = l_document->create_simple_element(
101               name = 'Workbook'
102 *              uri  = 'urn:schemas-microsoft-com:office:spreadsheet'
103               parent = l_document ).
104   l_element_root->set_attribute(
105   name = 'xmlns'
106   value = 'urn:schemas-microsoft-com:office:spreadsheet' ).
107   DATA(ns_attribute) = l_document->create_namespace_decl(
108               name = 'ss'
109               prefix = 'xmlns'
110               uri = 'urn:schemas-microsoft-com:office:spreadsheet' ).
111   l_element_root->set_attribute_node( ns_attribute ).
112   ns_attribute = l_document->create_namespace_decl(
113               name = 'x'
114               prefix = 'xmlns'
115               uri = 'urn:schemas-microsoft-com:office:excel' ).
116   l_element_root->set_attribute_node( ns_attribute ).
117 * Create node for document properties. 为文档属性创建节点
118   DATA(r_element_properties) = l_document->create_simple_element(
119               name = 'DocumentProperties'
120               parent = l_element_root ).
121   DATA:l_value TYPE string.
122   DATA:lv_sname TYPE string.
123   l_value = sy-uname.
124   l_document->create_simple_element(
125                     name = 'Author'
126                     value = l_value
127                     parent = r_element_properties  ).
128 
129   FIELD-SYMBOLS:
130     <lft_dyntab> TYPE ANY TABLE.
131  "2.创建excel表名和sheet数据
132 
133   ASSIGN gt_sflight TO <lft_dyntab>.
134   lv_sname = '航班'.
135 
136   PERFORM frm_create_sheetdata USING <lft_dyntab>
137                                      l_document
138                                      l_element_root
139                                      lv_sname.
140 
141   lv_sname = '仓储地点'.
142   ASSIGN gt_t001l TO <lft_dyntab>.
143   PERFORM frm_create_sheetdata USING <lft_dyntab>
144                                      l_document
145                                      l_element_root
146                                      lv_sname.
147 
148  "xml生成输出
149 
150   DATA(l_streamfactory) = l_ixml->create_stream_factory( ).
151 *   Connect internal XML table to stream factory
152   DATA(l_ostream) = l_streamfactory->create_ostream_itable( table = l_binary_tab ).
153 *   rendering the document
154   DATA(l_renderer) = l_ixml->create_renderer( ostream  = l_ostream
155                                         document = l_document ).
156   l_rc = l_renderer->render( ).
157 *   saving the xml document
158   l_length = l_ostream->get_num_written_raw( ).
159 
160   "刚刚已经用FTP命令打开的文件夹,现在可以直接把二进制文件传至服务器了。
161   CALL FUNCTION 'FTP_R3_TO_SERVER'
162     EXPORTING
163       handle         = l_handle
164       fname          = l_filename
165       blob_length    = l_length
166       character_mode = ' '
167     TABLES
168       blob           = l_binary_tab
169     EXCEPTIONS
170       tcpip_error    = 1
171       command_error  = 2
172       data_error     = 3
173       OTHERS         = 4.
174 
175   CASE sy-subrc.
176     WHEN 0.
177       MESSAGE 'Upload FTP Success' TYPE 'S'.
178     WHEN 1.
179       MESSAGE 'Upload FTP Failure (Tcpip_error)' TYPE 'S' DISPLAY LIKE 'E'.EXIT.
180     WHEN 2.
181       MESSAGE 'Upload FTP Failure (Command_error)' TYPE 'S' DISPLAY LIKE 'E'.EXIT.
182     WHEN 3.
183       MESSAGE 'Upload FTP Failure (Data_error)' TYPE 'S' DISPLAY LIKE 'E'.EXIT.
184     WHEN OTHERS.
185       MESSAGE 'Upload FTP Failure (Other)' TYPE 'S' DISPLAY LIKE 'E'.EXIT.
186   ENDCASE.
187 
188   "关闭FTP 连接
189   CALL FUNCTION 'FTP_DISCONNECT'
190     EXPORTING
191       handle = l_handle.
192 
193   CALL FUNCTION 'RFC_CONNECTION_CLOSE'
194     EXPORTING
195       destination          = l_dest
196     EXCEPTIONS
197       destination_not_open = 1
198       OTHERS               = 2.
199 *&---------------------------------------------------------------------*
200 *&      Form  FRM_CREATE_SHEETDATA
201 *&---------------------------------------------------------------------*
202 *       text
203 *----------------------------------------------------------------------*
204 *  -->  p1        text
205 *  <--  p2        text
206 *----------------------------------------------------------------------*
207 FORM frm_create_sheetdata USING lt_dyntab      TYPE ANY TABLE
208                                 l_document     TYPE REF TO if_ixml_document
209                                 l_element_root TYPE REF TO if_ixml_element
210                                 lv_sname       TYPE string.
211   DATA:l_value TYPE string.
212   DATA(r_worksheet) = l_document->create_simple_element(
213                  name = 'Worksheet '
214                  parent = l_element_root ).
215   r_worksheet->set_attribute_ns(
216   name = 'Name'
217   prefix = 'ss'
218   value = lv_sname ).
219 * table
220 * <Table ss:ExpandedColumnCount="3" ss:ExpandedRowCount="1" x:FullColumns="1" x:FullRows="1">
221   DATA(r_table) = l_document->create_simple_element(
222   name = 'Table'
223   parent = r_worksheet ).
224 
225   "3.创建column
226 
227     "因为xml格式的excel为先column,然后再每个row下存在cell,所以先循环输出column。
228 
229     DATA(r_column) = l_document->create_simple_element(
230     name = 'Column'
231     parent = r_table ).
232 
233     "4.row和内容类型
234 DATA:l_row  TYPE REF TO if_ixml_element,
235      l_cell TYPE REF TO if_ixml_element,
236      l_data TYPE REF TO if_ixml_element.
237 
238    "将内表填写到excel表格内
239    DATA:i_index TYPE sy-index.
240    DATA:l_index TYPE string.
241    DATA:l_text  TYPE char10.
242    DATA:l_type  TYPE string.
243    DATA:desc_struc TYPE REF TO cl_abap_structdescr.
244    FIELD-SYMBOLS:<lv_field> TYPE any.
245    LOOP AT lt_dyntab ASSIGNING FIELD-SYMBOL(<data_line>).
246     desc_struc ?= cl_abap_structdescr=>describe_by_data( <data_line> )."因为内表的每列数据要填写到excel的每行内。所以使用该方法将内表转换。
247     DATA(lt_fields) = desc_struc->get_ddic_field_list( ).
248 
249     AT FIRST.
250       l_row = l_document->create_simple_element(
251               name = 'Row'
252               parent = r_table ).
253       LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<data_fields>).
254 *        ASSIGN COMPONENT <data_fields>-fieldname OF STRUCTURE <data_line> TO <lv_field>."动态绑定表格内容。
255         CHECK sy-subrc IS INITIAL.
256         l_cell = l_document->create_simple_element(
257             name = 'Cell'
258             parent = l_row ).
259         l_value = <data_fields>-scrtext_l.
260         l_data = l_document->create_simple_element(
261                     name = 'Data'
262                     value = l_value
263                     parent = l_cell ).
264         l_data->set_attribute_ns(
265                             name = 'Type'
266                             prefix = 'ss'
267                             value = 'String' ).
268       ENDLOOP.
269     ENDAT.
270     l_row = l_document->create_simple_element(
271             name = 'Row'
272             parent = r_table ).
273 
274     LOOP AT lt_fields ASSIGNING <data_fields>.
275       ASSIGN COMPONENT <data_fields>-fieldname OF STRUCTURE <data_line> TO <lv_field>."动态绑定表格内容。
276       CHECK sy-subrc IS INITIAL.
277       l_cell = l_document->create_simple_element(
278                   name = 'Cell'
279                   parent = l_row ).
280       l_value = <lv_field>.
281       l_type  = <data_fields>-inttype.    "fieldname, scrtext_m etc.
282       CASE l_type.
283         WHEN 'I' OR 'P' OR 'F' OR 'N'.
284           l_type = 'String'.
285           l_value = <lv_field>.
286           CONDENSE l_value NO-GAPS.
287         WHEN 'D' OR 'T'.
288           l_type = 'String'.
289           WRITE <lv_field> TO l_text.
290           l_value = l_text.
291         WHEN OTHERS.
292 *          l_value = <field>.    "Without conversion exit
293           WRITE <lv_field> TO l_text.
294           SHIFT l_text LEFT DELETING LEADING space.
295           l_value = l_text.
296           l_type = 'String'.
297       ENDCASE.
298       l_data = l_document->create_simple_element(
299                 name = 'Data'
300                 value = l_value
301                 parent = l_cell ).
302       l_data->set_attribute_ns(
303                         name = 'Type'
304                         prefix = 'ss'
305                         value = l_type ).
306     ENDLOOP.
307   ENDLOOP.
308 ENDFORM.

 

标签:XML,FTP,ecc,TYPE,create,element,document,DATA
来源: https://www.cnblogs.com/liangliang245916893/p/15151576.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有