
那如何实现:
1.OAOR事务码
首先这个和SWM0有点区别,这个将弄好的EXCEL模板传到SAP端用的事务码OAOR。
类名:HRFPM_EXCEL_STANDARD
类型:OT
Object key: 输入自己要导入的模板名称
点击执行。
2.选择创建,选择表模板并双击,就会提示你导入电脑本地的EXCEL文件,选择即可
3.接下来就是代码部分了
TYPE-POOLS: sbdst, abap.
TYPE-POOLS kcde .
DATA: input TYPE kcde_intern_struc OCCURS 0 WITH HEADER LINE.“存放上传EXCEL数据
CONSTANTS:
gc_classname TYPE sbdst_classname VALUE 'HRFPM_EXCEL_STANDARD',
gc_classtype TYPE sbdst_classtype VALUE 'OT',
gc_objectkey TYPE sbdst_object_key VALUE 'ZFI_0406',
DATA: ok_code TYPE syucomm.
DATA: gr_container TYPE REF TO cl_gui_container,
gr_splitter TYPE REF TO cl_gui_splitter_container,
gr_control TYPE REF TO i_oi_container_control,
gr_document TYPE REF TO i_oi_document_proxy,
gr_spreadsheet TYPE REF TO i_oi_spreadsheet.
* business document system
DATA: gr_bds_documents TYPE REF TO cl_bds_document_set,
g_doc_components TYPE sbdst_components,
g_doc_signature TYPE sbdst_signature.
* template url
DATA: gt_bds_uris TYPE sbdst_uri,
g_template_url TYPE bds_uri.
* Required for writing data to Excel
DATA: gt_ranges TYPE soi_range_list,
gt_contents TYPE soi_generic_table.
DATA: gt_out TYPE TABLE OF ts_struct.
DATA: container TYPE REF TO cl_gui_custom_container,
control TYPE REF TO i_oi_container_control,
document TYPE REF TO i_oi_document_proxy,
spreadsheet TYPE REF TO i_oi_spreadsheet,
error TYPE REF TO i_oi_error,
errors TYPE REF TO i_oi_error OCCURS 0 WITH HEADER LINE.
DATA: template TYPE REF TO cl_bds_document_set,
retcode TYPE soi_ret_string.
TYPES: BEGIN OF ty_line,
key TYPE rf011z-ergso, "报表版本行号
stext LIKE rf011q-txt45, "报表版本
row TYPE n LENGTH 3, "行号
level LIKE rf011p-stufe, " Hierarchy level
begin LIKE glt0-tsl01, "期初余额
bcredit LIKE glt0-tsl01, "当前期间借方余额
bdebit LIKE glt0-tsl01, "当前期间贷方余额
end LIKE glt0-tslvt, "期末余额
ecredit LIKE glt0-tslvt, "期末累计借方余额
edebit LIKE glt0-tslvt, "期末累计贷方余额
sort(03) TYPE n, "排序字段
END OF ty_line.
TYPES: ty_lines TYPE ty_line OCCURS 0.
FIELD-SYMBOLS:
<ln> TYPE ty_line.
TYPES: c10 TYPE c LENGTH 10.
DATA: g_lines TYPE ty_lines,
gs_lines1 LIKE LINE OF g_lines,
gs_lines2 LIKE LINE OF g_lines,
g_year TYPE bkpf-gjahr,
g_period TYPE bkpf-monat,
g_sum_b LIKE glt0-tsl01,
g_sum_e LIKE glt0-tsl01,
g_sum_key LIKE rf011q-ergsl,
g_line TYPE ty_line,
g_cn_year TYPE c10,
g_butxt TYPE t001-butxt.
DATA: ranges TYPE soi_range_list.
DATA: excel_input TYPE soi_generic_table.
DATA: rangeitem TYPE soi_range_item.
DATA: excel_input_wa TYPE soi_generic_item.
以上全是定义的东西,下面开始实现
START-OF-SELECTION.
PERFORM frm_get_dbdata.
PERFORM get_template_url.
CALL SCREEN 0100.
1.取数 把要放在EXCEL的数据取出来。(略)
2.取模板的路径
DATA: ls_bds_url TYPE bapiuri.
CREATE OBJECT gr_bds_documents.
CALL METHOD gr_bds_documents->get_info
EXPORTING
classname = gc_classname
classtype = gc_classtype
object_key = gc_objectkey
CHANGING
components = g_doc_components
signature = g_doc_signature.
CALL METHOD gr_bds_documents->get_with_url
EXPORTING
classname = gc_classname
classtype = gc_classtype
object_key = gc_objectkey
CHANGING
uris = gt_bds_uris
signature = g_doc_signature.
FREE gr_bds_documents.
READ TABLE gt_bds_uris INTO ls_bds_url INDEX 1.
IF sy-subrc = 0.
g_template_url = ls_bds_url-uri.
ENDIF.
ENDFORM. "
3.开始CALL屏幕,存放该路径下的模板那
CALL SCREEN 0100.

PROCESS BEFORE OUTPUT.
MODULE status_0100.
MODULE pbo_0100.
PROCESS AFTER INPUT.
MODULE pai_0100.
4 设置gui状态
MODULE status_0100 OUTPUT.
SET PF-STATUS 'STANDARD'.
SET TITLEBAR 'TITLE_01'.
ENDMODULE.
5.PBO里写获取模板的内容
MODULE pbo_0100 OUTPUT.
PERFORM main.
ENDMODULE.
FORM main .
IF gr_container IS BOUND.
RETURN.
ENDIF.
PERFORM get_dynamic_container.
PERFORM create_container_control.
PERFORM open_excel_doc.
PERFORM write_data_to_excel.
ENDFORM.
得到屏幕容器
FORM get_dynamic_container .
CREATE OBJECT gr_splitter
EXPORTING
parent = cl_gui_container=>screen0
rows = 1
columns = 1.
CALL METHOD gr_splitter->set_border
EXPORTING
border = cl_gui_cfw=>false.
gr_container = gr_splitter->get_container( row = 1 column = 1 ).
ENDFORM.
* create container control
CALL METHOD c_oi_container_control_creator=>get_container_control
IMPORTING
control = gr_control.
* initialize control
CALL METHOD gr_control->init_control
EXPORTING
inplace_enabled = 'X'
inplace_scroll_documents = 'X'
register_on_close_event = 'X'
register_on_custom_event = 'X'
r3_application_name = 'DOI'
parent = gr_container.
FORM open_excel_doc .
DATA: lv_available TYPE i,
lo_error TYPE REF TO i_oi_error.
CALL METHOD gr_control->get_document_proxy
EXPORTING
document_type = 'Excel.Sheet'
no_flush = 'X'
IMPORTING
document_proxy = gr_document.
CALL METHOD gr_document->open_document
EXPORTING
open_inplace = 'X'
document_url = g_template_url
protect_document = 'X'.
CALL METHOD gr_document->has_spreadsheet_interface
EXPORTING
no_flush = 'X'
IMPORTING
error = lo_error
is_available = lv_available.
CALL METHOD gr_document->get_spreadsheet_interface
EXPORTING
no_flush = 'X'
IMPORTING
error = lo_error
sheet_interface = gr_spreadsheet.
IF lv_available = 0.
lo_error->raise_message( type = 'E' ).
ENDIF.
ENDFORM. " OPEN_EXCEL_DOC
写入数据到EXCEL
DATA: lt_fields TYPE TABLE OF zsjr4038_field,
ls_field TYPE zsjr4038_field,
lt_out TYPE TABLE OF ts_struct,
ls_out TYPE ts_struct,
lv_top TYPE i,
lv_value TYPE char256.
FIELD-SYMBOLS:
<fs_content> TYPE soi_generic_item.
SORT gt_out BY zyuans.
CONCATENATE p_gjahr '年' p_monat '月' INTO lv_value.
PERFORM fill_cell USING 2 1 lv_value.
PERFORM write_company_desc.
ls_field-column = 1.
ls_field-fieldname = 'BYS'.
APPEND ls_field TO lt_fields.
ls_field-column = 2.
ls_field-fieldname = 'QMS'.
APPEND ls_field TO lt_fields.
ls_field-column = 3.
ls_field-fieldname = 'SNTQ'.
APPEND ls_field TO lt_fields.
" 1
PERFORM insert_range_dim USING 'cell1' 7 3 34 3.
PERFORM fill_ranges USING 'cell1' 34 3.
CLEAR lt_out.
LOOP AT gt_out INTO ls_out WHERE zyuans BETWEEN '02' AND '35'.
APPEND ls_out TO lt_out.
ENDLOOP.
PERFORM fill_contents TABLES lt_fields
lt_out.
CALL METHOD gr_spreadsheet->set_ranges_data
EXPORTING
ranges = gt_ranges
contents = gt_contents
no_flush = 'X'.
" 2
PERFORM insert_range_dim USING 'cell2' 43 3 4 3.
PERFORM fill_ranges USING 'cell2' 4 3.
CLEAR lt_out.
LOOP AT gt_out INTO ls_out WHERE zyuans BETWEEN '37' AND '40'.
APPEND ls_out TO lt_out.
ENDLOOP.
PERFORM fill_contents TABLES lt_fields
lt_out.
CALL METHOD gr_spreadsheet->set_ranges_data
EXPORTING
ranges = gt_ranges
contents = gt_contents
no_flush = 'X'.
" 3
PERFORM insert_range_dim USING 'cell3' 48 3 2 3.
PERFORM fill_ranges USING 'cell3' 2 3.
CLEAR lt_out.
LOOP AT gt_out INTO ls_out WHERE zyuans BETWEEN '42' AND '43'.
APPEND ls_out TO lt_out.
ENDLOOP.
PERFORM fill_contents TABLES lt_fields
lt_out.
CALL METHOD gr_spreadsheet->set_ranges_data
EXPORTING
ranges = gt_ranges
contents = gt_contents
no_flush = 'X'.
" 4
PERFORM insert_range_dim USING 'cell4' 7 8 34 3.
PERFORM fill_ranges USING 'cell4' 34 3.
CLEAR lt_out.
LOOP AT gt_out INTO ls_out WHERE zyuans BETWEEN '45' AND '77'.
APPEND ls_out TO lt_out.
ENDLOOP.
INSERT INITIAL LINE INTO lt_out INDEX 33.
PERFORM fill_contents TABLES lt_fields
lt_out.
CALL METHOD gr_spreadsheet->set_ranges_data
EXPORTING
ranges = gt_ranges
contents = gt_contents
no_flush = 'X'.
" 5
PERFORM insert_range_dim USING 'cell5' 44 8 6 3. “第八列开始数三列,44行开始数6行
PERFORM fill_ranges USING 'cell5' 6 3.
CLEAR lt_out.
LOOP AT gt_out INTO ls_out WHERE zyuans BETWEEN '80' AND '85'.
APPEND ls_out TO lt_out.
ENDLOOP.
PERFORM fill_contents TABLES lt_fields
lt_out.
CALL METHOD gr_spreadsheet->set_ranges_data
EXPORTING
ranges = gt_ranges
contents = gt_contents
no_flush = 'X'.
ENDFORM. " WRITE_DATA_TO_EXCEL
FORM fill_cell USING p_top p_left p_value.
DATA: ls_content TYPE soi_generic_item.
CLEAR gt_contents.
CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
CHANGING
value = p_value.
PERFORM insert_range_dim USING 'cell' p_top p_left 1 1.
PERFORM fill_ranges USING 'cell' 1 1.
ls_content-column = 1.
ls_content-row = 1.
ls_content-value = p_value.
APPEND ls_content TO gt_contents.
CALL METHOD gr_spreadsheet->set_ranges_data
EXPORTING
ranges = gt_ranges
contents = gt_contents
no_flush = 'X'.
ENDFORM.
FORM insert_range_dim USING p_name p_top p_left p_rows p_columns.
CALL METHOD gr_spreadsheet->insert_range_dim
EXPORTING
name = p_name
no_flush = 'X'
top = p_top
left = p_left
rows = p_rows
columns = p_columns.
ENDFORM.
FORM fill_ranges USING p_name p_rows p_columns.
DATA: ls_range TYPE soi_range_item.
CLEAR gt_ranges.
ls_range-name = p_name.
ls_range-rows = p_rows.
ls_range-columns = p_columns.
ls_range-code = 4.
APPEND ls_range TO gt_ranges.
ENDFORM.
FORM fill_contents TABLES lt_fields STRUCTURE zsjr4038_field
lt_table.
DATA: ls_content TYPE soi_generic_item,
lv_tabix TYPE sytabix.
FIELD-SYMBOLS:
<fs_line> TYPE ANY,
<fs_value> TYPE ANY,
<fs_field> TYPE zsjr4038_field.
CLEAR gt_contents.
LOOP AT lt_table ASSIGNING <fs_line>.
lv_tabix = sy-tabix.
LOOP AT lt_fields ASSIGNING <fs_field>.
ls_content-row = lv_tabix.
CONDENSE ls_content-row.
ls_content-column = <fs_field>-column.
CONDENSE ls_content-column.
ASSIGN COMPONENT <fs_field>-fieldname OF STRUCTURE <fs_line> TO <fs_value>.
IF sy-subrc = 0.
ls_content-value = <fs_value>.
CONDENSE ls_content-value.
IF zcl_fi_util=>is_number( <fs_value> ) = abap_true.
IF <fs_value> = 0.
CLEAR ls_content-value.
ENDIF.
IF <fs_value> < 0.
CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
CHANGING
value = ls_content-value.
ENDIF.
ENDIF.
CONDENSE ls_content-value.
APPEND ls_content TO gt_contents.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDFORM. " FILL_CONTENTS
`在这里插入代码片
MODULE pai_0100 INPUT.
CASE ok_code.
WHEN '&F03' OR '&F15' OR '&F12'.
PERFORM release_objects.
CLEAR ok_code.
LEAVE TO SCREEN 0.
WHEN 'UPLOAD'.
PERFORM upload.
CLEAR ok_code.
WHEN 'ZSAVE'.
PERFORM save.
CLEAR ok_code.
ENDCASE.
ENDMODULE.
下面是模板:

版权声明:本文为weixin_43885987原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。