—————————————————————————————————-
&——————————————————————————————————-
*& DOI 相关的变量
&——————————————————————————————————-
CONSTANTS: cinplace VALUE ‘X’, “决定是否在GUi中打开,还是在windows中打开 c_excel(80) VALUE ‘Excel.Sheet’.
DOI变量申明
DATA: g_active_sheet(20) TYPE c VALUE ‘CONFIRMATION’. “在哪个sheet中写入内容
DATA: zcl_container TYPE REF TO cl_gui_docking_container, “容器 zcl_control TYPE REF TO i_oi_container_control, “DOI实例 zcl_document TYPE REF TO i_oi_document_proxy, “用来打开BDS上文件的类 zcl_spreadsheet TYPE REF TO i_oi_spreadsheet, “用来操作EXCEL的接口 zcl_errors TYPE REF TO i_oi_error OCCURS 0 WITH HEADER LINE, “用来存储各个方法中产生的错误 wa_range TYPE soi_range_item, “用来确定excel填充值范围的工作区 it_range TYPE soi_range_list, “用来确定excel填充值范围的内表 it_excel_input TYPE soi_generic_table, “用来存放填充到excel值的内表 wa_excel_input TYPE soi_generic_item, “用来存放填充到excel值的工作区 g_retcode TYPE soi_ret_string, “存放调用DOI方法之后的返回值 zcl_bds_instance TYPE REF TO cl_bds_document_set, “获取上传的文档 it_doc_signature TYPE sbdst_signature, “存放signature属性的内表 wa_doc_signature LIKE LINE OF it_doc_signature. “存放signature属性的工作区
“如下三变量用来处理模板在BDS上的URL地址
DATA: g_item_url(256) TYPE c, it_doc_uris TYPE sbdst_uri, wa_doc_uris LIKE LINE OF it_doc_uris.
如下三个值确定模板在BDS上的位置_
DATA: g_doc_classname TYPE sbdst_classname VALUE ‘ZZGRG’, g_doc_classtype TYPE sbdst_classtype VALUE ‘OT’, g_doc_object_key TYPE sbdst_object_key VALUE ‘ZZGRG’.
—————————————————————————————————-
“创建DOI实例 PERFORM frm_create_doi.
—————————————————————————————————-
CHECK zclcontainer IS INITIAL.
CALL METHOD c_oi_container_control_creator=>get_container_control
IMPORTING control = zcl_control
error = zcl_errors. APPEND zcl_errors.
实例化容器实例 CREATE OBJECT zcl_container
EXPORTING repid = sy-repid
dynnr = ‘100’ side = cl_gui_docking_container=>dock_at_top
ratio = 95 “占屏幕的比例 lifetime = cntl_lifetime_dynpro “容器实例生命周期 EXCEPTIONS cntl_error = 1 cntl_system_error = 2 create_error = 3 lifetime_error = 4 lifetime_dynpro_dynpro_link = 5 OTHERS = 6. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.
“初始化CONTROL FREE zcl_errors. CALL METHOD zcl_control->init_control
EXPORTING r3_application_name = ‘’ inplace_enabled = c_inplace “决定是否在GUI中打开,还是在windows中打开 inplace_scroll_documents = ‘X’
inplaceshow_toolbars = ‘’
* inplace_resize_documents = ‘’ parent = zclcontainer “EXCEL存放的容器,此处为空,未创建 register_on_close_event = ‘X’ register_on_custom_event = ‘X’ no_flush = ‘X’ IMPORTING error = zcl_errors.
APPEND zcl_errors.
CLEAR g_item_url. FREE it_doc_signature. “用来确定节点下的那个EXCEL模板 wa_doc_signature-prop_name = ‘DESCRIPTION’. “signature中的(系统默认) “DESCRIPTION属性 wa_doc_signature-prop_value = ‘文档名’. “DESCRIPTION属性的值(TCODE:OAOR中维护)
“因为之后调用的时候,是以表的形式,所以添加到内表中 APPEND wa_doc_signature TO it_doc_signature. “可以操作BDS的类 CREATE OBJECT zcl_bds_instance. “得到模板的URL FREE it_doc_uris. “重要:此处记得一定要清空,如果不清空,将会导致模板调用出错
CALL METHOD zcl_bds_instance->get_with_url
EXPORTING classname = g_doc_classname
classtype = g_doc_classtype
object_key = g_doc_object_key
CHANGING uris = it_doc_uris
signature = it_doc_signature. “释放类 FREE zcl_bds_instance.
READ TABLE it_doc_uris INTO wa_doc_uris INDEX 1. “保存EXCEL模板的URL到变量中 g_item_url = wa_doc_uris-uri.
**
生成文件时,此部分在循环中
**
创建ioi_document_proxy实例,类型为EXCEL FREE zclerrors. CALL METHOD zcl_control->get_document_proxy
EXPORTING document_type = c_excel “常量 no_flush = ‘’ IMPORTING document_proxy = zcl_document
error = zcl_errors.
CALL METHOD zcl_errors->raise_message
EXPORTING type = ‘E’.
根据获取的URL打开BDS上面对应的文件 FREE zcl_errors. CALL METHOD zcl_document->open_document
EXPORTING open_inplace = c_inplace
document_url = g_item_url
IMPORTING error = zcl_errors.
CALL METHOD zcl_errors->raise_message
EXPORTING type = ‘E’.
FREE zcl_errors.
创建spreadsheet接口,用于操作excel CALL METHOD zcl_document->get_spreadsheet_interface
EXPORTING no_flush = ‘’ IMPORTING sheet_interface = zcl_spreadsheet
error = zcl_errors.
CALL METHOD zcl_errors->raise_message
EXPORTING type = ‘E’.
FREE zcl_errors.
* 选择对哪一个sheet操作_ CALL METHOD zcl_spreadsheet->select_sheet
EXPORTING name = g_active_sheet
no_flush = ‘’ IMPORTING error = zcl_errors.
CALL METHOD zcl_errors->raise_message
EXPORTING type = ‘E’.
FREE zcl_errors.
—————————————————————————————————-
“设置用于填充模板的数据
PERFORM frm_set_excel_data.
—————————————————————————————————-
**
* 抬头
**
* Buyer: lvname = ‘HEAD1’. lv_top = 8. lv_left = 1. CONCATENATE ‘Buyer:’ wa_excel_head-name1 INTO lv_value. PERFORM frm_range_data USING lv_name lv_top lv_left lv_value. “_ CLEAR: lv_name,lv_top,lv_left,lv_value.
**
* 行项目
** REFRESH it_item.
PERFORM frmexcel_input USING: start_row1 1 wa_item-stawn, “HS Code_
CALL METHOD zcl_spreadsheet->set_ranges_data
EXPORTING ranges = it_range
contents = it_excel_input
no_flush = ‘’ IMPORTING error = zcl_errors
retcode = g_retcode. CALL METHOD zcl_errors->raise_message
EXPORTING type = ‘E’.
FREE zcl_errors. CLEAR:it_excel_input,wa_excel_input.
FORM frmrange_data USING p_name
p_top
p_left
p_value.
FREE: it_range. CLEAR: wa_range. wa_range-name = p_name. “抬头数据区域1,大小:2行1列 wa_range-rows = 1. wa_range-columns = 1. APPEND wa_range TO it_range.
确定选定指定大小区域在模板中的位置 FREE zcl_errors. CLEAR: zcl_errors. CALL METHOD zcl_spreadsheet->insert_range_dim
EXPORTING name = p_name
no_flush = ‘’ top = p_top
left = p_left
rows = 1 “选择区域 行总数 同warange-rows的值 updating = 1 columns = 1 “选择区域 列总数 同wa_range-columns的值 IMPORTING error = zclerrors.
CALL METHOD zcl_errors->raise_message
EXPORTING type = ‘E’.
FREE zcl_errors.
获取选定区域对应的值 CLEAR:wa_excel_input.
wa_excel_input-row = 1. wa_excel_input-column = 1. wa_excel_input-value = p_value. APPEND wa_excel_input TO it_excel_input.
* 为range填充值 CLEAR:g_retcode,zcl_errors.
CALL METHOD zcl_spreadsheet->set_ranges_data
EXPORTING ranges = it_range
contents = it_excel_input
no_flush = ‘’ IMPORTING error = zcl_errors
retcode = g_retcode. CALL METHOD zcl_errors->raise_message
EXPORTING type = ‘E’.
FREE zcl_errors.
CLEAR:it_excel_input,wa_excel_input.
ENDFORM. “ FRMRANGE_DATA
FORM frmexcel_input USING start_row1
value(p_col) p_value.
DATA: l_value TYPE string.
CLEAR:wa_excel_input,l_value. l_value = p_value. wa_excel_input-row = start_row1. wa_excel_input-column = p_col. wa_excel_input-value = l_value. APPEND wa_excel_input TO it_excel_input.
ENDFORM. “ FRMEXCEL_INPUT
