本文主要是介绍SAP DOI,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
OLE是SAP早期的Office集成的工具,而DOI是它的替代技术。
首先将 Excel 模板文档放在应用程序服务器上,然后开发代码 调用DOI 打开这个文档,对文档进行操作和处理。
1: OAOR 上载EXCEL 模板
上载时注意,类名称和对象代码,后面代码要用它定位你上载的文件
2:写程序:
1)创建屏幕:0100,并激活之
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
*
PROCESS AFTER INPUT.
MODULE USER_COMMAND_0100.
2:创建PF-STATUS ,并分配OKOCDE和USER_COMMAND_0100匹配
SET PF-STATUS 'SA1'.
*&---------------------------------------------------------------------*
*& Report ZTEST_DOI01
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztest_doi01.
TABLES:mara.
TYPE-POOLS:vrm, sbdst, soi.
* SAP Desktop Office Integration Interfaces
DATA: cl_container TYPE REF TO cl_gui_container,
cl_splitter TYPE REF TO cl_gui_splitter_container,
cl_control TYPE REF TO i_oi_container_control,
cl_docu_proxy TYPE REF TO i_oi_document_proxy,
cl_spreadsheet TYPE REF TO i_oi_spreadsheet,
cl_error TYPE REF TO i_oi_error,
cl_errors TYPE REF TO i_oi_error OCCURS 0 WITH HEADER LINE.
* spreadsheet interface structures for Excel data input
DATA:wa_cellitem TYPE soi_generic_item,
wa_rangeitem TYPE soi_range_item,
gt_ranges TYPE soi_range_list,
gt_excel_input TYPE soi_generic_table,
wa_excel_input TYPE soi_generic_item,
g_initialized TYPE c,
g_retcode TYPE soi_ret_string,
gt_excel_format TYPE soi_format_table,
wa_format LIKE LINE OF gt_excel_format.
DATA:cl_bds_instance TYPE REF TO cl_bds_document_set,
gt_doc_signature TYPE sbdst_signature,
wa_doc_signature LIKE LINE OF gt_doc_signature,
gt_doc_components TYPE sbdst_components,
gt_doc_uris TYPE sbdst_uri,
wa_doc_uris LIKE LINE OF gt_doc_uris.
DATA:g_app TYPE vrm_id,
val(50),
g_url(256) TYPE c,
g_has_activex TYPE c,
g_excel TYPE text80 VALUE 'Excel.Sheet',
g_docu_type TYPE text80.
*the following variable is from screen 100
DATA: ok_code TYPE sy-ucomm,
save_ok TYPE sy-ucomm.
*output internal table
DATA: BEGIN OF itab OCCURS 0.
INCLUDE STRUCTURE makt.
DATA: END OF itab.
*Please import template file "ztest_doi1" to sap using Tcode:OAOR
DATA: g_classname TYPE sbdst_classname VALUE 'HRFPM_EXCEL_STANDARD', "SOFFICEINTEGRATION',
g_classtype TYPE sbdst_classtype VALUE 'OT',
g_object_key TYPE sbdst_object_key VALUE 'DEMO_DOI'. "variable
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK xavery WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: s_matnr FOR mara-matnr MEMORY ID mat.
SELECTION-SCREEN END OF BLOCK xavery.
************************************************************************
INITIALIZATION.
START-OF-SELECTION.
PERFORM get_data.
END-OF-SELECTION.
CALL SCREEN 0100.
*&---------------------------------------------------------------------*
*& Form sub_query_mara
*&---------------------------------------------------------------------*
* 从物料主数据表MARA中取数
*----------------------------------------------------------------------*
FORM get_data .
SELECT *
FROM makt UP TO 5 ROWS
INTO TABLE itab
WHERE makt~matnr IN s_matnr.
MOVE '10999999' TO itab-matnr.
APPEND itab.
ENDFORM. " sub_query_mara
************************************************************************
** Dialog Modules PBO and PAI
************************************************************************
MODULE status_0100 OUTPUT.
SET PF-STATUS 'SA1'.
PERFORM sub_create_basic_object.
PERFORM output_to_excel.
ENDMODULE. "status_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Dialog Modules PAI
*&---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
save_ok = ok_code.
CLEAR ok_code.
CASE save_ok.
WHEN 'STOP' .
IF NOT cl_docu_proxy IS INITIAL.
CALL METHOD cl_docu_proxy->close_document.
FREE cl_docu_proxy.
ENDIF.
IF NOT cl_control IS INITIAL.
CALL METHOD cl_control->destroy_control.
FREE cl_control.
ENDIF.
LEAVE PROGRAM.
WHEN 'BACK' .
IF NOT cl_docu_proxy IS INITIAL.
CALL METHOD cl_docu_proxy->close_document.
FREE cl_docu_proxy.
ENDIF.
IF NOT cl_control IS INITIAL.
CALL METHOD cl_control->destroy_control.
FREE cl_control.
ENDIF.
SET SCREEN 0. " quit the program
"set screen 1000.
ENDCASE.
ENDMODULE. "USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*& Form SUB_CREATE_BASIC_OBJECT
*&---------------------------------------------------------------------*
* 创建相关的对象
*----------------------------------------------------------------------*
FORM sub_create_basic_object .
CHECK g_initialized IS INITIAL.
CALL FUNCTION 'GUI_HAS_ACTIVEX'
IMPORTING
return = g_has_activex.
IF g_has_activex IS INITIAL.
MESSAGE e007(demoofficeintegratio).
ENDIF.
* first get the SAP DOI i_oi_container_control interface
CALL METHOD c_oi_container_control_creator=>get_container_control
IMPORTING
control = cl_control
error = cl_error.
* check no errors occur
CALL METHOD cl_error->raise_message
EXPORTING
type = 'E'.
* create container
CREATE OBJECT cl_splitter
EXPORTING
parent = cl_gui_container=>screen0
rows = 1
columns = 1.
CALL METHOD cl_splitter->set_border
EXPORTING
border = cl_gui_cfw=>false.
cl_container = cl_splitter->get_container( row = 1 column = 1 ).
* initialize the SAP DOI Container, tell it to run in the container
* specified above and tell it to run Excel in-place
CALL METHOD cl_control->init_control
EXPORTING
r3_application_name = 'RBasis'
inplace_enabled = 'X'
inplace_scroll_documents = 'X'
parent = cl_container
register_on_close_event = 'X'
register_on_custom_event = 'X'
no_flush = 'X'
IMPORTING
error = cl_errors.
* save error object in collection
APPEND cl_errors.
CALL METHOD cl_gui_cfw=>dispatch.
wa_doc_signature-prop_name = 'DESCRIPTION'.
g_app = 'excel'. "
IF g_app = 'excel'.
g_docu_type = g_excel.
wa_doc_signature-prop_value = 'Prop_REPORT'.
ELSE.
ENDIF.
APPEND wa_doc_signature TO gt_doc_signature.
CREATE OBJECT cl_bds_instance.
CALL METHOD cl_bds_instance->get_info
EXPORTING
classname = g_classname
classtype = g_classtype
object_key = g_object_key
CHANGING
components = gt_doc_components
signature = gt_doc_signature
EXCEPTIONS
nothing_found = 1
error_kpro = 2
internal_error = 3
parameter_error = 4
not_authorized = 5
not_allowed = 6.
CALL METHOD cl_bds_instance->get_with_url
EXPORTING
classname = g_classname
classtype = g_classtype
object_key = g_object_key
CHANGING
uris = gt_doc_uris
signature = gt_doc_signature.
FREE cl_bds_instance.
* ask the SAP DOI container for a i_oi_document_proxy for Excel
CALL METHOD cl_control->get_document_proxy
EXPORTING
document_type = 'Excel.Sheet'
no_flush = 'X'
* REGISTER_CONTAINER = 'X'
IMPORTING
document_proxy = cl_docu_proxy
error = cl_errors.
APPEND cl_errors.
* open a document saved in business document service.
* READ TABLE doc_uris INTO wa_doc_uris INDEX 1.
LOOP AT gt_doc_uris INTO wa_doc_uris.
g_url = wa_doc_uris-uri.
ENDLOOP.
CALL METHOD cl_docu_proxy->open_document
EXPORTING
open_inplace = 'X'
* NO_FLUSH = 'X'
document_url = g_url
IMPORTING
error = cl_errors.
DATA: has TYPE i.
CALL METHOD cl_docu_proxy->has_spreadsheet_interface
EXPORTING
no_flush = 'X'
IMPORTING
is_available = has
error = cl_errors.
APPEND cl_errors.
CALL METHOD cl_docu_proxy->get_spreadsheet_interface
EXPORTING
no_flush = 'X'
IMPORTING
sheet_interface = cl_spreadsheet
error = cl_errors.
APPEND cl_errors.
* Activate sheet 1
DATA: g_def_active_sheetname(50) VALUE 'Sheet1'.
CALL METHOD cl_spreadsheet->select_sheet
EXPORTING
name = g_def_active_sheetname
no_flush = ''
IMPORTING
error = cl_errors.
APPEND cl_errors.
LOOP AT cl_errors.
CALL METHOD cl_errors->raise_message
EXPORTING
type = 'E'.
ENDLOOP.
FREE cl_errors.
g_initialized = 'X'.
ENDFORM. " FRM_CREATE_BASIC_OBJECT
*&---------------------------------------------------------------------*
*& Form SUB_SET_CELL
*&---------------------------------------------------------------------*
* 根据数据设置 EXCEL 表的属性
*----------------------------------------------------------------------*
FORM fill_cell USING i j val..
DATA: columns_number TYPE i,
rows_number TYPE i.
columns_number = 1.
rows_number = 1.
CALL METHOD cl_spreadsheet->insert_range_dim
EXPORTING
name = 'cell'
no_flush = 'X'
top = i
left = j
rows = rows_number
columns = columns_number
IMPORTING
error = cl_errors.
APPEND cl_errors.
REFRESH: gt_ranges, gt_excel_input.
wa_rangeitem-name = 'cell'.
wa_rangeitem-columns = 1.
wa_rangeitem-rows = 1.
APPEND wa_rangeitem TO gt_ranges.
wa_excel_input-column = 1.
wa_excel_input-row = 1.
wa_excel_input-value = val.
APPEND wa_excel_input TO gt_excel_input.
* set data
CALL METHOD cl_spreadsheet->set_ranges_data
EXPORTING
ranges = gt_ranges
contents = gt_excel_input
no_flush = 'X'
IMPORTING
error = cl_errors.
APPEND cl_errors.
* set FRAME.
CALL METHOD cl_spreadsheet->set_frame
EXPORTING
rangename = 'cell'
typ = '127'
color = '1'
no_flush = 'X'
IMPORTING
error = cl_errors.
* ??
CALL METHOD cl_spreadsheet->fit_widest
EXPORTING
name = space
no_flush = 'X'.
REFRESH: gt_ranges, gt_excel_input.
ENDFORM. " SUB_SET_CELL
*&---------------------------------------------------------------------*
*& Form sub_process_excel
*&---------------------------------------------------------------------*
* 处理结果内表
*----------------------------------------------------------------------*
FORM output_to_excel .
DATA num TYPE i VALUE 1.
*&test info
PERFORM fill_cell USING 3 1 'May 2012'.
PERFORM fill_cell USING 3 2 'July 2012'.
LOOP AT itab.
num = 3 + sy-tabix.
PERFORM fill_cell USING num 1 itab-matnr.
PERFORM fill_cell USING num 2 itab-maktx.
PERFORM fill_cell USING num 3 itab-maktg.
ENDLOOP.
*&test info
PERFORM fill_cell USING 15 1 '轿车'.
PERFORM fill_cell USING 16 1 '卡车'.
PERFORM fill_cell USING 17 1 '自行车'.
PERFORM fill_cell USING 15 2 '67'.
PERFORM fill_cell USING 16 2 '89'.
PERFORM fill_cell USING 17 2 '12'.
* change the name of worksheet "sheet1"
CALL METHOD cl_spreadsheet->set_sheet_name
EXPORTING
newname = '物料主数据清单'
oldname = 'Sheet1'
IMPORTING
error = cl_errors.
* activate worksheet
CALL METHOD cl_spreadsheet->select_sheet
EXPORTING
name = 'Sheet2'
IMPORTING
error = cl_errors.
APPEND cl_errors.
* run macro
CALL METHOD cl_docu_proxy->execute_macro
EXPORTING
* SCRIPT_NAME = 'test1'
macro_string = '模块1.test1'
* param1 = ''
* param_count = 1
IMPORTING
error = cl_errors.
ENDFORM. " sub_process_excel
*CALL METHOD spreadsheet->set_format_string
*EXPORTING rangename = rangename
*formatstring = formatstring
*no_flush = no_flush
*IMPORTING error = error
*retcode = retcode.
*
*formatstring = '0.00_ ;[红色]-0.00'
*or formatstring = '0.00_ ;[RED]-0.00'
这篇关于SAP DOI的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!