ABAP-DOI导出EXCEL

1.输入事务代码OAOR

 2.选择表模板

 3.选择文件路径

 4.如下图就可以了

5.要在程序中创建屏幕,如图

 最后附上源代码,可以直接复制运行

  1 REPORT y4_b4_test6.
  2 
  3 TABLES : ekko.
  4 
  5 *-->控件及界面定义
  6 DATA: gv_container  TYPE scrfname VALUE 'ALV_CON',  "ALV控键定义
  7       g_cust_con    TYPE REF TO cl_gui_custom_container,
  8       g_container   TYPE REF TO cl_gui_container,
  9       g_control     TYPE REF TO i_oi_container_control,
 10       g_document    TYPE REF TO i_oi_document_proxy,
 11       g_spreadsheet TYPE REF TO i_oi_spreadsheet.
 12 
 13 *-->类型池定义
 14 DATA: g_bds_documents      TYPE REF TO cl_bds_document_set,
 15       gv_classname         TYPE sbdst_classname,
 16       gv_classtype         TYPE sbdst_classtype,
 17       gv_objectkey         TYPE sbdst_object_key,
 18       gv_doc_components    TYPE sbdst_components,
 19       gv_doc_signature     TYPE sbdst_signature,
 20       gt_bds_uris          TYPE sbdst_uri,
 21       gs_bds_url           LIKE LINE OF gt_bds_uris,
 22       gv_template_url(256) TYPE c.    "模板url存储
 23 
 24 *-->定义写入excel时需要的ranges和contents
 25 DATA: gt_ranges   TYPE soi_range_list,
 26       gs_range    TYPE soi_range_item,
 27       gt_contents TYPE soi_generic_table,
 28       gs_content  TYPE soi_generic_item.
 29 
 30 *-->内表定义
 31 DATA : BEGIN OF gw_ekko,
 32          ebeln TYPE ekko-ebeln,
 33          bsart TYPE ekko-bsart,
 34          aedat TYPE ekko-aedat,
 35          lifnr TYPE ekko-lifnr,
 36        END OF gw_ekko.
 37 DATA : gt_ekko LIKE TABLE OF gw_ekko.
 38 
 39 *-->辅助字段定义
 40 DATA : ok_code TYPE sy-ucomm.
 41 
 42 *-->选择屏幕定义
 43 SELECTION-SCREEN BEGIN OF BLOCK blc_01 WITH FRAME TITLE TEXT-001.
 44   SELECT-OPTIONS : s_ebeln FOR ekko-ebeln.
 45 SELECTION-SCREEN END OF BLOCK blc_01.
 46 
 47 INITIALIZATION.
 48   "为参数赋值,此处对应事务码OAOR上传的文档信息
 49   gv_classname = 'HRFPM_EXCEL_STANDARD'.
 50   gv_classtype = 'OT'.
 51   gv_objectkey = 'ZDOITEST'.
 52 
 53 START-OF-SELECTION.
 54 
 55   PERFORM frm_get_data.
 56 
 57   PERFORM frm_deal_data.
 58 
 59   CALL SCREEN 100.
 60 
 61 END-OF-SELECTION.
 62 
 63 FORM frm_get_data .
 64   SELECT ebeln
 65          bsart
 66          aedat
 67          lifnr
 68     FROM ekko
 69     INTO TABLE gt_ekko
 70     WHERE ebeln IN s_ebeln.
 71 ENDFORM.
 72 
 73 FORM frm_deal_data .
 74 
 75 ENDFORM.
 76 
 77 MODULE status_0100 OUTPUT.
 78   SET PF-STATUS '100'.
 79   SET TITLEBAR '100'.
 80   PERFORM frm_excel_output.
 81 ENDMODULE.
 82 
 83 MODULE user_command_0100 INPUT.
 84 
 85   CASE ok_code.
 86     WHEN '&F03' OR '&F12' OR '&F15'.
 87       "退出前进行对象的释放
 88       PERFORM release_objects.
 89       LEAVE TO SCREEN 0.
 90   ENDCASE.
 91 
 92 ENDMODULE.
 93 
 94 FORM frm_excel_output .
 95 
 96   DATA: gv_available TYPE i.
 97   DATA: gv_row       TYPE i.  "计算内表有多少行
 98   DATA: gv_col       TYPE i.  "计算内表有多少列
 99   DATA: row_index    TYPE i.  "数据写入时的行
100 
101   DEFINE add_content.
102     gs_content-row    = &1.
103     gs_content-column = &2.
104     gs_content-value  = &3.
105     APPEND gs_content TO gt_contents.
106     CLEAR gs_content.
107   END-OF-DEFINITION.
108 ******************************开始*****************************************
109 *屏幕大小固定
110 **-->创建容器 create container control
111 *  CALL METHOD c_oi_container_control_creator=>get_container_control
112 *    IMPORTING
113 *      control = g_control.
114 *
115 *  IF g_cust_con IS INITIAL.
116 *    CREATE OBJECT g_cust_con
117 *      EXPORTING
118 *        container_name = gv_container.
119 *  ENDIF.
120 *
121 *  CALL METHOD g_control->init_control
122 *    EXPORTING
123 *      inplace_enabled          = 'X '
124 *      inplace_scroll_documents = 'X'
125 *      register_on_close_event  = 'X'
126 *      register_on_custom_event = 'X'
127 *      r3_application_name      = 'JYH test doi'
128 *      parent                   = g_cust_con.
129 *******************************结束*******************************************
130 
131 *******************************开始*******************************************
132 *屏幕大小随窗口大小动态变化
133   CALL METHOD c_oi_container_control_creator=>get_container_control
134     IMPORTING
135       control = g_control.
136 
137   DATA: container TYPE REF TO cl_gui_docking_container.
138   CREATE OBJECT container
139     EXPORTING
140       repid                       = sy-repid
141       dynnr                       = sy-dynnr
142       extension                   = 2050
143       side                        = cl_gui_docking_container=>property_floating
144     EXCEPTIONS
145       cntl_error                  = 1
146       cntl_system_error           = 2
147       create_error                = 3
148       lifetime_error              = 4
149       lifetime_dynpro_dynpro_link = 5.
150   IF sy-subrc NE 0.
151 
152   ENDIF.
153 
154 *-->初始化
155   CALL METHOD g_control->init_control
156     EXPORTING
157       inplace_enabled          = 'X '
158       inplace_scroll_documents = 'X'
159       register_on_close_event  = 'X'
160       register_on_custom_event = 'X'
161       r3_application_name      = 'JYH test doi'
162       parent                   = container.
163 ********************************结束************************************
164 
165 *-->url获取
166   CREATE OBJECT g_bds_documents.
167   CALL METHOD cl_bds_document_set=>get_info
168     EXPORTING
169       classname  = gv_classname  "initialization位置下定义
170       classtype  = gv_classtype  "initialization位置下定义
171       object_key = gv_objectkey  "initialization位置下定义
172     CHANGING
173       components = gv_doc_components
174       signature  = gv_doc_signature.
175 
176   CALL METHOD cl_bds_document_set=>get_with_url
177     EXPORTING
178       classname  = gv_classname
179       classtype  = gv_classtype
180       object_key = gv_objectkey
181     CHANGING
182       uris       = gt_bds_uris
183       signature  = gv_doc_signature.
184 
185   FREE g_bds_documents.
186 
187   "读取
188   READ TABLE gt_bds_uris INTO gs_bds_url INDEX 1.
189   gv_template_url = gs_bds_url-uri.
190 
191 *-->打开上传的excel文档
192   "
193   CALL METHOD g_control->get_document_proxy
194     EXPORTING
195       document_type      = 'Excel.Sheet'
196       no_flush           = 'X'
197       register_container = 'X'
198     IMPORTING
199       document_proxy     = g_document.
200 
201   CALL METHOD g_document->open_document
202     EXPORTING
203       open_inplace = 'X'
204       document_url = gv_template_url.
205 
206   CALL METHOD g_document->has_spreadsheet_interface
207     EXPORTING
208       no_flush     = 'X'
209     IMPORTING
210       is_available = gv_available.
211 
212   CALL METHOD g_document->get_spreadsheet_interface
213     EXPORTING
214       no_flush        = 'X'
215     IMPORTING
216       sheet_interface = g_spreadsheet.
217 
218   "选择展示的sheet页
219   CALL METHOD g_spreadsheet->select_sheet
220     EXPORTING
221       name     = 'Sheet1'
222       no_flush = 'X'.
223 
224 *-->往excel中写入数据
225   "检查内表是否有数据
226   CHECK gt_ekko IS NOT INITIAL.
227 
228   "获取内表的行数和列数
229   PERFORM frm_get_line_col USING gv_row gv_col.
230 
231   CALL METHOD g_spreadsheet->insert_range_dim
232     EXPORTING
233       name     = 'cell'
234       no_flush = 'X'
235       top      = 3        "从第几行开始
236       left     = 1        "从第几列考试
237       rows     = gv_row   "写几行
238       columns  = gv_col.  "写几列
239 
240   "根据行列填充ranges
241   CLEAR :gs_range,gt_ranges.
242   gs_range-name = 'cell'.
243   gs_range-rows = gv_row.
244   gs_range-columns = gv_col.
245   gs_range-code = 4.
246   APPEND gs_range TO gt_ranges.
247 
248   "批量的把数据写入
249   CLEAR row_index .
250   row_index = '1'.
251 
252   "把值精确到每一行每一列的单元格
253   LOOP AT gt_ekko INTO gw_ekko.
254     CLEAR gs_content.
255     add_content row_index 1 gw_ekko-ebeln.
256     add_content row_index 2 gw_ekko-bsart.
257     add_content row_index 3 gw_ekko-aedat.
258     add_content row_index 4 gw_ekko-lifnr.
259     row_index = row_index + 1.
260   ENDLOOP.
261 
262   CALL METHOD g_spreadsheet->set_ranges_data
263     EXPORTING
264       ranges   = gt_ranges
265       contents = gt_contents
266       no_flush = 'X'.
267 
268   "把数据精确写入到某一行某一列
269 
270   PERFORM frm_write_single USING '1' '7' sy-uname.
271   PERFORM frm_write_single USING '2' '7' sy-datum.
272 
273 ENDFORM.
274 
275 FORM frm_get_line_col  USING p_row p_col.
276   CLEAR : p_row,p_col.
277   FIELD-SYMBOLS <fs>.
278   "获取行数
279   p_row = lines( gt_ekko ).
280   "获取列数
281   DO.
282     ASSIGN COMPONENT sy-index OF STRUCTURE gw_ekko TO <fs>.
283     IF sy-subrc IS INITIAL.
284       p_col = p_col + 1.
285     ELSE.
286       EXIT.
287     ENDIF.
288   ENDDO.
289 ENDFORM.
290 
291 FORM release_objects .
292 
293   IF NOT g_document IS INITIAL.
294     CALL METHOD g_document->close_document.
295     FREE g_document.
296   ENDIF.
297 
298   IF NOT g_control IS INITIAL.
299     CALL METHOD g_control->destroy_control.
300     FREE g_control.
301   ENDIF.
302 
303   IF g_container IS NOT INITIAL.
304     CALL METHOD g_container->free.
305   ENDIF.
306 
307 
308 ENDFORM.
309 
310 FORM frm_write_single  USING  p_row p_col p_value.
311   DATA : lt_ranges   TYPE soi_range_list,
312          ls_ranges   TYPE soi_range_item,
313          lt_contents TYPE soi_generic_table,
314          ls_contents TYPE soi_generic_item.
315 
316   CLEAR :lt_ranges,ls_ranges,lt_contents,ls_contents.
317   "ranges中只存储一行一列
318   ls_ranges-name = 'cell' .
319   ls_ranges-columns = 1.
320   ls_ranges-rows = 1.
321   ls_ranges-code = 4.
322   APPEND ls_ranges TO lt_ranges.
323   "写入数据也只存一个值
324   ls_contents-column = 1.
325   ls_contents-row = 1.
326   ls_contents-value = p_value.
327   APPEND ls_contents TO lt_contents.
328 
329   "每次只写一行一列
330   CALL METHOD g_spreadsheet->insert_range_dim
331     EXPORTING
332       name     = 'cell'
333       no_flush = 'X'
334       top      = p_row
335       left     = p_col
336       rows     = 1
337       columns  = 1.
338 
339   CALL METHOD g_spreadsheet->set_ranges_data
340     EXPORTING
341       ranges   = lt_ranges
342       contents = lt_contents
343       no_flush = 'X'.
344 ENDFORM.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值