ABAP DOI技术

您所在的位置:网站首页 腾达ac9如何区分8m和16m ABAP DOI技术

ABAP DOI技术

2023-03-24 22:28| 来源: 网络整理| 查看: 265

DOI也不算是特别新的技术了,相对于OLE来说,DOI的速度还是可以的,因为OLE对于有特定格式要求的EXCEL来说写入是按照单元格逐个填充的。DOI可以根据RANGES和CONTENT实现一次写入。

下文将介绍DOI开发的全部过程:

一、OAOR模板导入:

与SMW0差不多.

类名称:系统里随便找一个

分类类型:随意

点击新建按钮,然后下方出现一个文件夹,单击下面的文档类型,DEMO里选择是"EXCEL",当然也可以选择"WORD",但是实现的代码不一样。

二 、代码实现

*&---------------------------------------------------------------------* *& Report Y_DOI_TEST *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT zfi0060.*&---------------------------------------------------------------------* *& Report Z_JYH_DOI *&---------------------------------------------------------------------* *& 本程序是DOI的demo测试程序,用excel展示内表的数据 *&---------------------------------------------------------------------*TABLES : zzpiccl1a.*-->控件及界面定义 DATA: gv_container TYPE scrfname VALUE 'ALV_CON', "ALV控键定义g_cust_con TYPE REF TO cl_gui_custom_container,g_container TYPE REF TO cl_gui_container,g_control TYPE REF TO i_oi_container_control,g_document TYPE REF TO i_oi_document_proxy,g_spreadsheet TYPE REF TO i_oi_spreadsheet.DATA: gr_splitter TYPE REF TO cl_gui_splitter_container.*-->类型池定义 DATA: g_bds_documents TYPE REF TO cl_bds_document_set,gv_classname TYPE sbdst_classname,gv_classtype TYPE sbdst_classtype,gv_objectkey TYPE sbdst_object_key,gv_doc_components TYPE sbdst_components,gv_doc_signature TYPE sbdst_signature,gt_bds_uris TYPE sbdst_uri,gs_bds_url LIKE LINE OF gt_bds_uris,gv_template_url(256) TYPE c. "模板url存储*-->定义写入excel时需要的ranges和contents DATA: gt_ranges TYPE soi_range_list,gs_range TYPE soi_range_item,gt_contents TYPE soi_generic_table,gs_content TYPE soi_generic_item.*-->内表定义 DATA : BEGIN OF gw_data,xnegp TYPE bseg-xnegp, "反记账标识rzzxz TYPE zzpiccl1a-rzzxz,"险种bezek TYPE t25a2-bezek, "险种描述xl2 TYPE t25a2-bezek, "险类2ls TYPE char2, "长短期险xl TYPE t25a2-bezek, "系列xl1 TYPE t25a2-bezek, "险类1dj_lj TYPE zzpiccl1a-hsl, "趸交累计snsq_lj TYPE zzpiccl1a-hsl, "首年首期累计snxq_lj TYPE zzpiccl1a-hsl, "首年续期累计xnxq_lj TYPE zzpiccl1a-hsl, "续年续期累计sum_lj TYPE zzpiccl1a-hsl, "累计汇总dj_tq TYPE zzpiccl1a-hsl, "趸交同期snsq_ljtq TYPE zzpiccl1a-hsl, "首年续期snxq_ljtq TYPE zzpiccl1a-hsl, "首年续期xnxq_ljtq TYPE zzpiccl1a-hsl, "续年续期同期sum_ljtq TYPE zzpiccl1a-hsl, "累计同期合计dj_dq TYPE zzpiccl1a-hsl,snsq_dq TYPE zzpiccl1a-hsl,snxq_dq TYPE zzpiccl1a-hsl,xnxq_dq TYPE zzpiccl1a-hsl,sum_dq TYPE zzpiccl1a-hsl,dj_dqtq TYPE zzpiccl1a-hsl,snsq_dqtq TYPE zzpiccl1a-hsl,snxq_dqtq TYPE zzpiccl1a-hsl,xnxq_dqtq TYPE zzpiccl1a-hsl,sum_dqtq TYPE zzpiccl1a-hsl,END OF gw_data. DATA : gt_data LIKE TABLE OF gw_data.DATA : BEGIN OF gw_comp,bukrs TYPE t001-bukrs,butxt TYPE t001-butxt,rzzxz TYPE zzpiccl1a-rzzxz,"险种bezek TYPE t25a2-bezek, "险种描述dj_lj TYPE zzpiccl1a-hsl, "趸交累计snsq_lj TYPE zzpiccl1a-hsl, "首年首期累计snxq_lj TYPE zzpiccl1a-hsl, "首年续期累计xnxq_lj TYPE zzpiccl1a-hsl, "续年续期累计sum_lj TYPE zzpiccl1a-hsl, "累计汇总dj_tq TYPE zzpiccl1a-hsl, "趸交同期snsq_ljtq TYPE zzpiccl1a-hsl, "首年续期snxq_ljtq TYPE zzpiccl1a-hsl, "首年续期xnxq_ljtq TYPE zzpiccl1a-hsl, "续年续期同期sum_ljtq TYPE zzpiccl1a-hsl, "累计同期合计dj_dq TYPE zzpiccl1a-hsl,snsq_dq TYPE zzpiccl1a-hsl,snxq_dq TYPE zzpiccl1a-hsl,xnxq_dq TYPE zzpiccl1a-hsl,sum_dq TYPE zzpiccl1a-hsl,dj_dqtq TYPE zzpiccl1a-hsl,snsq_dqtq TYPE zzpiccl1a-hsl,snxq_dqtq TYPE zzpiccl1a-hsl,xnxq_dqtq TYPE zzpiccl1a-hsl,sum_dqtq TYPE zzpiccl1a-hsl,END OF gw_comp. DATA : gt_comp LIKE TABLE OF gw_comp."辅助核算表 DATA:gt_l1t TYPE TABLE OF zzpiccl1t,gw_l1t TYPE zzpiccl1t,gt_l1a_tmp TYPE TABLE OF zzpiccl1a.*-->辅助字段定义 DATA : ok_code TYPE sy-ucomm,g_year TYPE gjahr.*-->选择屏幕定义 SELECTION-SCREEN BEGIN OF BLOCK blc_01 WITH FRAME TITLE text-001. PARAMETERS:p_gjahr TYPE zzpiccl1a-ryear OBLIGATORY DEFAULT sy-datum+0(4). PARAMETERS:p_monat TYPE zzpiccl1a-poper OBLIGATORY DEFAULT sy-datum+4(2). SELECTION-SCREEN END OF BLOCK blc_01.INITIALIZATION."为参数赋值,此处对应事务码OAOR上传的文档信息gv_classname = 'HRFPM_EXCEL_STANDARD'.gv_classtype = 'OT'.gv_objectkey = 'ZFI0060'.START-OF-SELECTION.PERFORM frm_get_data.PERFORM frm_deal_data.CALL SCREEN 100.END-OF-SELECTION. *&---------------------------------------------------------------------* *& Form frm_get_data *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& screen0rows = 1columns = 1.CALL METHOD gr_splitter->set_borderEXPORTINGborder = cl_gui_cfw=>false.gr_container = gr_splitter->get_container( row = 1 column = 1 ).*-->创建容器 create container controlCALL METHOD c_oi_container_control_creator=>get_container_controlIMPORTINGcontrol = g_control.*-->初始化CALL METHOD g_control->init_controlEXPORTINGinplace_enabled = 'X 'inplace_scroll_documents = 'X'register_on_close_event = 'X'register_on_custom_event = 'X'r3_application_name = 'doi'parent = gr_container.*-->url获取ICREATE OBJECT g_bds_documents.CALL METHOD cl_bds_document_set=>get_infoEXPORTINGclassname = gv_classname "initialization位置下定义classtype = gv_classtype "initialization位置下定义object_key = gv_objectkey "initialization位置下定义CHANGINGcomponents = gv_doc_componentssignature = gv_doc_signature.CALL METHOD cl_bds_document_set=>get_with_urlEXPORTINGclassname = gv_classnameclasstype = gv_classtypeobject_key = gv_objectkeyCHANGINGuris = gt_bds_urissignature = gv_doc_signature.FREE g_bds_documents."读取READ TABLE gt_bds_uris INTO gs_bds_url INDEX 1.gv_template_url = gs_bds_url-uri.*-->打开上传的excel文档"CALL METHOD g_control->get_document_proxyEXPORTINGdocument_type = 'Excel.Sheet'no_flush = 'X'register_container = 'X'IMPORTINGdocument_proxy = g_document.CALL METHOD g_document->open_documentEXPORTINGopen_inplace = 'X'document_url = gv_template_url.CALL METHOD g_document->has_spreadsheet_interfaceEXPORTINGno_flush = 'X'IMPORTINGis_available = gv_available.CALL METHOD g_document->get_spreadsheet_interfaceEXPORTINGno_flush = 'X'IMPORTINGsheet_interface = g_spreadsheet."选择展示的sheet页CALL METHOD g_spreadsheet->select_sheetEXPORTINGname = '险种维度'no_flush = 'X'.*-->往excel中写入数据"检查内表是否有数据CHECK gt_data IS NOT INITIAL."获取内表的行数和列数PERFORM frm_get_line_col USING gv_row gv_col.CALL METHOD g_spreadsheet->insert_range_dimEXPORTINGname = 'cell'no_flush = 'X'top = 3 "从第几行开始left = 1 "从第几列考试rows = gv_row "写几行columns = gv_col. "写几列"根据行列填充rangesCLEAR :gs_range,gt_ranges.gs_range-name = 'cell'.gs_range-rows = gv_row.gs_range-columns = gv_col.gs_range-code = 4.APPEND gs_range TO gt_ranges."批量的把数据写入CLEAR row_index .row_index = '1'.FIELD-SYMBOLS: TYPE any."把值精确到每一行每一列的单元格LOOP AT gt_data INTO gw_data.CLEAR gs_content.DO gv_col TIMES.ASSIGN COMPONENT sy-index OF STRUCTURE gw_data TO .add_content row_index sy-index .ENDDO.row_index = row_index + 1.ENDLOOP.CALL METHOD g_spreadsheet->set_ranges_dataEXPORTINGranges = gt_rangescontents = gt_contentsno_flush = 'X'."处理公司维度CLEAR:gv_row,gv_col,gt_ranges,gt_contents.CALL METHOD g_spreadsheet->select_sheetEXPORTINGname = '公司维度'no_flush = 'X'.CHECK gt_comp IS NOT INITIAL."获取行数lv_row = lines( gt_comp )."获取列数DO.ASSIGN COMPONENT sy-index OF STRUCTURE gw_comp TO .IF sy-subrc IS INITIAL.lv_col = lv_col + 1.ELSE.EXIT.ENDIF.ENDDO."批量的把数据写入CLEAR:row_index,lv_top."把值精确到每一行每一列的单元格LOOP AT gt_comp INTO gw_comp.CLEAR:gs_content,gt_ranges[].row_index = row_index + 1.DO gv_col TIMES.ASSIGN COMPONENT sy-index OF STRUCTURE gw_comp TO .add_content row_index sy-index .ENDDO.IF row_index EQ 9000.lv_top = sy-tabix + 1.PERFORM frm_fill_ranges_data USING lv_top '1' '9000' lv_col.CLEAR row_index.ENDIF.AT LAST.IF lv_row < 9000.lv_top = sy-tabix + 1.PERFORM frm_fill_ranges_data USING '2' '1' row_index lv_col.ELSE.lv_top = row_index + 1.PERFORM frm_fill_ranges_data USING lv_top '1' row_index lv_col.ENDIF.ENDAT.ENDLOOP.lv_index = lv_index + lv_rows.IF lv_row = 0.EXIT.ENDIF.ENDFORM. "frm_excel_output *&---------------------------------------------------------------------* *& Form frm_get_line_col *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> P_ *& --> GV_LINE *& --> GV_COL *&---------------------------------------------------------------------* FORM frm_get_line_col USING p_row p_col.CLEAR : p_row,p_col.FIELD-SYMBOLS ."获取行数p_row = lines( gt_data )."获取列数DO.ASSIGN COMPONENT sy-index OF STRUCTURE gw_data TO .IF sy-subrc IS INITIAL.p_col = p_col + 1.ELSE.EXIT.ENDIF.ENDDO. ENDFORM. "frm_get_line_col *&---------------------------------------------------------------------* *& Form release_objects *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& close_document.FREE g_document.ENDIF.IF NOT g_control IS INITIAL.CALL METHOD g_control->destroy_control.FREE g_control.ENDIF.IF g_container IS NOT INITIAL.CALL METHOD g_container->free.ENDIF.ENDFORM. "release_objects *&---------------------------------------------------------------------* *& Form frm_write_single *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> P_ *& --> P_ *& --> SY_UNAME *&---------------------------------------------------------------------* FORM frm_write_single USING p_row p_col p_value.DATA : lt_ranges TYPE soi_range_list,ls_ranges TYPE soi_range_item,lt_contents TYPE soi_generic_table,ls_contents TYPE soi_generic_item.CLEAR :lt_ranges,ls_ranges,lt_contents,ls_contents."ranges中只存储一行一列ls_ranges-name = 'cell' .ls_ranges-columns = 1.ls_ranges-rows = 1.ls_ranges-code = 4.APPEND ls_ranges TO lt_ranges."写入数据也只存一个值ls_contents-column = 1.ls_contents-row = 1.ls_contents-value = p_value.APPEND ls_contents TO lt_contents."每次只写一行一列CALL METHOD g_spreadsheet->insert_range_dimEXPORTINGname = 'cell'no_flush = 'X'top = p_rowleft = p_colrows = 1columns = 1.CALL METHOD g_spreadsheet->set_ranges_dataEXPORTINGranges = lt_rangescontents = lt_contentsno_flush = 'X'.ENDFORM. "frm_write_single *&---------------------------------------------------------------------* *& Form FRM_FILL_RANGES_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_LV_TOP text * -->P_LV_LEFT text * -->P_LV_ROW text * -->P_LV_COL text *----------------------------------------------------------------------* FORM frm_fill_ranges_data USING pv_toppv_leftpv_rowpv_col.CALL METHOD g_spreadsheet->insert_range_dimEXPORTINGname = 'cell'no_flush = 'X'top = pv_top "从第几行开始left = pv_left "从第几列开始rows = pv_row "写几行columns = pv_col. "写几列"根据行列填充rangesCLEAR :gs_range,gt_ranges.gs_range-name = 'cell'.gs_range-rows = pv_row.gs_range-columns = pv_col.gs_range-code = 4.APPEND gs_range TO gt_ranges.CALL METHOD g_spreadsheet->set_ranges_dataEXPORTINGranges = gt_rangescontents = gt_contentsno_flush = 'X'.ENDFORM. " FRM_FILL_RANGES_DATA

三、注意事项

由于soi_range_item的行只有4位,意味者只能一次性只能写入9999行。如果要写入的数据大于9999行,需要进行拆分分包写入。insert_range和set_ranges需要配合使用,正确确认好每次写入的

top(起始行)以及row(写入)行数是代码关键地方。上文给出的代码不是最终版,需要微调才能跑出来。

(注意用spliter创建容器的方法可以使EXCEL容器自适应屏幕,实现全屏效果。不需要单独创建屏幕容器。)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3