*DOI技术是调用上传到SAP的EXCEL模板,然后通过行列控制输出数据的,下面共享一段源代码
REPORT Z_DOI.
*使用到相关类型池
TYPE-POOLS: vrm,sbdst, soi.
"document_name为通过TCODE:OAER上传到SAP的EXCEL模板,该模板中可以设置格式。
*CONSTANTS document_name(30) VALUE 'TEST-SPC汇总新增需求'. 客户帐龄分析表 "
CONSTANTS document_name(30) VALUE '客户帐龄分析表'.
DATA: doc_classname TYPE sbdst_classname VALUE 'PICTURES', "oaer中的class name
doc_classtype TYPE sbdst_classtype VALUE 'OT', "oaer中的class type
doc_object_key TYPE sbdst_object_key VALUE 'ZEXCEL'. "oaer中的object key 该key值用户可以指定
*以下变量声明部分无需改动
*--------------------------------------------------------------------*>>
DATA: flag .
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.
CONTROLS: exceldata TYPE TABLEVIEW USING SCREEN 0100.
DATA: okcode(15).
* spreadsheet interface structures for Excel data input
DATA: rangeitem TYPE soi_range_item.
DATA: ranges TYPE soi_range_list.
DATA: excel_input TYPE soi_generic_table.
DATA: excel_input_wa TYPE soi_generic_item.
DATA: initialized(1), retcode TYPE soi_ret_string.
DATA: item_url(256), already_done, newname(40).
DATA document_type(80).
DATA: app TYPE vrm_id, applist TYPE vrm_values.
DATA: excel(80) VALUE 'Excel.Sheet'.
*--------------------------------------------------------------------*<<
**选择屏幕
SELECTION-SCREEN BEGIN OF BLOCK block1
WITH FRAME
TITLE text-001.
PARAMETERS: p_input1 TYPE i .
SELECTION-SCREEN END OF BLOCK block1.
START-OF-SELECTION.
**取数据
PERFORM getdata.
CALL SCREEN 100."需创建屏幕号为100的屏幕 并在屏幕中拖出一个名称为CONTAINER的容器
*----------------------------------------------------------------------*
* MODULE OUTPUT_TO_EXCEL OUTPUT
*----------------------------------------------------------------------*
* SCREEN 100 PBO MODULE
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'STATS100'."需创建,设置工具条
IF flag = space .
"根据文档的描述名称,加载文档
PERFORM create_basic_objects USING '' '' '' '' document_name.
"通过行 列控制excel输出
PERFORM output_to_excel.
ENDIF.
ENDMODULE. "OUTPUT_TO_EXCEL OUTPUT
*----------------------------------------------------------------------*
* MODULE EXIT INPUT
*----------------------------------------------------------------------*
* SCREEN 100 PAI MODULE
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
flag = 'X'.
CASE okcode.
WHEN 'EXIT' .
IF NOT document IS INITIAL.
CALL METHOD document->close_document.
FREE document.
ENDIF.
IF NOT control IS INITIAL.
CALL METHOD control->destroy_control.
FREE control.
ENDIF.
LEAVE PROGRAM.
WHEN 'BACK' .
IF NOT document IS INITIAL.
CALL METHOD document->close_document.
FREE document.
ENDIF.
IF NOT control IS INITIAL.
CALL METHOD control->destroy_control.
FREE control.
ENDIF.
SET SCREEN 0. " quit the program
ENDCASE.
ENDMODULE. " EXIT INPUT
*&---------------------------------------------------------------------*
*& Form create_basic_objects
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_APP_NAME text
* -->P_CLASSNAME text
* -->P_CLASSTYPE text
* -->P_OBJ_KEY text
* -->P_DOCNAME text
*----------------------------------------------------------------------*
FORM create_basic_objects USING p_app_name
p_classname
p_classtype
p_obj_key
p_docname.
CHECK initialized IS INITIAL.
* first get the SAP DOI i_oi_container_control interface
CALL METHOD
c_oi_container_control_creator=>get_container_control
IMPORTING
control = control
error = error.
* check no errors occured
CALL METHOD error->raise_message
EXPORTING
type = 'E'.
CREATE OBJECT container
EXPORTING
container_name = 'CONTAINER' . "CONTAINER 容器名称
DATA l_app_name(200).
IF p_app_name IS INITIAL.
l_app_name = document_name.
ELSE.
l_app_name = p_app_name.
ENDIF.
CALL METHOD control->init_control
EXPORTING
r3_application_name = l_app_name
inplace_enabled = 'X'
inplace_scroll_documents = 'X'
parent = container
register_on_close_event = 'X'
register_on_custom_event = 'X'
no_flush = 'X'
IMPORTING
error = errors.
* save error object in collection
APPEND errors.
CLEAR item_url.
DATA: bds_instance TYPE REF TO cl_bds_document_set.
DATA: doc_signature TYPE sbdst_signature,
wa_doc_signature LIKE LINE OF doc_signature,
doc_components TYPE sbdst_components,
doc_uris TYPE sbdst_uri,
wa_doc_uris LIKE LINE OF doc_uris.
wa_doc_signature-prop_name = 'DESCRIPTION'.
app = 'excel'.
IF app = 'excel'.
document_type = excel.
wa_doc_signature-prop_value = p_docname.
ELSE.
ENDIF.
APPEND wa_doc_signature TO doc_signature.
CREATE OBJECT bds_instance.
CALL METHOD bds_instance->get_info
EXPORTING
classname = doc_classname
classtype = doc_classtype
object_key = doc_object_key
CHANGING
components = doc_components
signature = doc_signature.
CALL METHOD bds_instance->get_with_url
EXPORTING
classname = doc_classname
classtype = doc_classtype
object_key = doc_object_key
CHANGING
uris = doc_uris
signature = doc_signature.
FREE bds_instance.
* open a document saved in business document service.
CALL METHOD document->open_document
EXPORTING
open_inplace = 'X'
document_url = item_url.
DATA: has TYPE i.
CALL METHOD document->has_spreadsheet_interface
EXPORTING
no_flush = ''
IMPORTING
is_available = has
error = errors.
APPEND errors.
CALL METHOD document->get_spreadsheet_interface
EXPORTING
no_flush = ' '
IMPORTING
sheet_interface = spreadsheet
error = errors.
APPEND errors.
* Activate sheet 1
CALL METHOD spreadsheet->select_sheet
EXPORTING
name = 'Sheet1'
* NO_FLUSH = ' '
IMPORTING
error = errors.
* RETCODE =
.
APPEND errors.
*&---------------------------------------------------------------------*
*& Form getdata
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM getdata.
ENDFORM. "getdata
*&---------------------------------------------------------------------*
*& Form output_to_excel
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM output_to_excel.
PERFORM fill_cell USING 2 2 p_input1.
PERFORM fill_cell USING 2 11 p_input1.
ENDFORM. "output_to_excel
*&---------------------------------------------------------------------*
*& Form fill_cell
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->I text
* -->J text
* -->VAL text
*----------------------------------------------------------------------*
FORM fill_cell USING i j val.
DATA: columns_number TYPE i,
rows_number TYPE i.
columns_number = 1.
rows_number = 1.
CALL METHOD spreadsheet->insert_range_dim
EXPORTING
name = 'cell'
no_flush = 'X'
top = i
left = j
rows = rows_number
columns = columns_number
IMPORTING
error = errors.
APPEND errors.
REFRESH: ranges, excel_input.
rangeitem-name = 'cell'.
rangeitem-columns = 1.
rangeitem-rows = 1.
APPEND rangeitem TO ranges.
excel_input_wa-column = 1.
excel_input_wa-row = 1.
excel_input_wa-value = val.
APPEND excel_input_wa TO excel_input.
* set data
CALL METHOD spreadsheet->set_ranges_data
EXPORTING
ranges = ranges
contents = excel_input
no_flush = 'X'
IMPORTING
error = errors.
APPEND errors.
CALL METHOD spreadsheet->fit_widest
EXPORTING
name = space
no_flush = 'X'.
REFRESH: ranges, excel_input.
ENDFORM. "fill_cell
该贴已经同步到 SAPOK_ABAP的微博