ABAP DOI格式输出 案例

事务: OAOR :上传模板

在这里插入图片描述

abap案例

gui:STA_0100
在这里插入图片描述

屏幕: 100

在这里插入图片描述

效果:
在这里插入图片描述

TYPE-POOLS: slis,
ole2,
vrm.

DATA: go_container   TYPE REF TO cl_gui_container,
      go_splitter    TYPE REF TO cl_gui_splitter_container,
      go_control     TYPE REF TO i_oi_container_control,
      go_document    TYPE REF TO i_oi_document_proxy,
      go_spreadsheet TYPE REF TO i_oi_spreadsheet,
      go_error       TYPE REF TO i_oi_error.

CONSTANTS: gc_classname    TYPE sbdst_classname  VALUE 'SOFFICEINTEGRATION',
           gc_classtype    TYPE sbdst_classtype  VALUE 'OT',
           gc_object_key   TYPE sbdst_object_key VALUE 'DOITEST',
           gc_pwd          TYPE char30 VALUE 'DOITEST',
           gc_top          TYPE i VALUE 6,  "数据开始行
           gc_column_left  TYPE i VALUE 4,  "固定列
           gc_column_right TYPE i VALUE 9.  "固定列

DATA: gs_handle     TYPE cntl_handle,
      gs_sheet      TYPE ole2_object,
      gs_rows       TYPE ole2_object,
      gs_rows1      TYPE ole2_object,
      gs_columns    TYPE ole2_object,
      gs_columns1   TYPE ole2_object,
      gs_cells      TYPE ole2_object,
      gs_cells1     TYPE ole2_object,
      gs_range      TYPE ole2_object,
      gs_validation TYPE ole2_object.

DATA: gv_code   TYPE sy-ucomm,
      ok_code   TYPE sy-ucomm,
      gv_mode   TYPE flag,
      gv_return TYPE flag.

DATA: gs_error LIKE go_error,
      gt_error LIKE TABLE OF go_error.

START-OF-SELECTION.

  CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  DATA: lt_extab TYPE slis_t_extab,
        lv_title TYPE string.

  SET PF-STATUS 'STA_0100' EXCLUDING lt_extab.
  SET TITLEBAR 'TIT_0100' WITH lv_title.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module PBO_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE pbo_0100 OUTPUT.
  IF go_spreadsheet IS INITIAL.
    PERFORM progress_indicator USING 60 '正在打开Excel......' .

    PERFORM create_doi. "创建DOI对象

    PERFORM progress_indicator USING 80 '正在向Excel中写入数据......' .

    PERFORM fill_sheet. "填写SHEET数据

    PERFORM progress_indicator USING 90 '正在显示Excel......' .
  ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  EXIT_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE exit_0100 INPUT.
  IF go_spreadsheet IS NOT INITIAL.
    CALL METHOD go_spreadsheet->clear_all_ranges( ).
    FREE go_spreadsheet.
  ENDIF.

  IF NOT go_document IS INITIAL.
    CALL METHOD go_document->close_document.
    CALL METHOD go_document->release_document.
    FREE go_document.
  ENDIF.

  IF NOT go_control IS INITIAL.
    CALL METHOD go_control->release_all_documents.
    CALL METHOD go_control->destroy_control.
    FREE go_control  .
  ENDIF.

  IF go_container IS NOT INITIAL.
    CALL METHOD go_container->free.
    FREE go_container.
  ENDIF.

  IF go_splitter IS NOT INITIAL.
    CALL METHOD go_splitter->free.
    FREE go_splitter.
  ENDIF.

  FREE: gt_error.

  LEAVE TO SCREEN 0.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  DATA: lv_answer TYPE char01.

  CLEAR: gv_code.

  gv_code = ok_code.

  CASE gv_code.
    WHEN 'EXPORT'.  "导出
      PERFORM unprotect.
      PERFORM export_data USING '导出表格'.
      PERFORM protect.
    WHEN '&F03' OR '&F12' OR '&F15'.
      LEAVE TO SCREEN 0.
    WHEN OTHERS.
  ENDCASE.

  CLEAR: ok_code.
ENDMODULE.

FORM export_data  USING  pa_fname.
  DATA: lv_filename     TYPE string,
        lv_path         TYPE string,
        lv_fullpath     TYPE string,
        lv_file_name    TYPE char256,
        lv_desktop_path TYPE char100.

  " 获取桌面信息
  CALL FUNCTION 'GUI_GET_DESKTOP_INFO'
    EXPORTING
      type   = 11
    CHANGING
      return = lv_desktop_path.

  lv_path = lv_desktop_path.

  lv_filename = |{ pa_fname }.XLS|.

  " 获取保存文件路径
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      file_filter          = cl_gui_frontend_services=>filetype_excel
      initial_directory    = lv_path
      default_file_name    = lv_filename
    CHANGING
      filename             = lv_filename
      path                 = lv_path
      fullpath             = lv_fullpath
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.

  IF lv_fullpath IS INITIAL.
    MESSAGE s000(zfi01) WITH '您已取消操作'.
    RETURN.
  ENDIF.

  lv_file_name = lv_fullpath.

  go_document->save_as(
    EXPORTING
      file_name = lv_file_name
      no_flush  = ''
    IMPORTING
      error     = go_error ).

  MESSAGE s000(zfi01) WITH '导出成功'.

ENDFORM.

FORM protect .

  CALL METHOD OF
    gs_sheet
    'PROTECT'
    EXPORTING
      #1  = gc_pwd
      #2  = 1
      #3  = 1
      #4  = 1
      #5  = 1
      #6  = 1
      #7  = 1
      #8  = 1
      #9  = 0
      #10 = 0
      #11 = 0
      #12 = 0
      #13 = 0
      #14 = 0
      #15 = 0.

ENDFORM.

FORM unprotect .

  CALL METHOD OF
    gs_sheet
    'UNPROTECT'
    EXPORTING
      #1 = gc_pwd.

ENDFORM.

FORM create_doi .

  DATA: lv_available TYPE i,
        lv_url       TYPE text256.

  "创建DOI CONTROL
  c_oi_container_control_creator=>get_container_control(
    IMPORTING
      control = go_control
      error   = go_error ).

  "CHECK NO ERRORS OCCURED
  go_error->raise_message( type = 'E' ).

  "创建CONTIANER
  CREATE OBJECT go_splitter
    EXPORTING
      parent  = cl_gui_container=>screen0
      rows    = 1
      columns = 1.

  go_splitter->set_border( border = cl_gui_cfw=>false ).

  go_container = go_splitter->get_container( row = 1 column = 1 ).

  go_control->init_control(
    EXPORTING
      r3_application_name      = 'DOITEST'
*     r3_application_name      = 'TEST'
      inplace_enabled          = 'X'
      inplace_scroll_documents = 'X'
      parent                   = go_container
      register_on_close_event  = 'X'
      register_on_custom_event = 'X'
      no_flush                 = 'X'
    IMPORTING
      error                    = go_error ).

  APPEND go_error TO gt_error.
  CALL METHOD cl_gui_cfw=>dispatch.

  PERFORM doi_get_template CHANGING lv_url.

  "获得EXCEL应用
  go_control->get_document_proxy(
    EXPORTING
      document_type      = 'EXCEL.SHEET'
      no_flush           = 'X'
      register_container = 'X'
    IMPORTING
      document_proxy     = go_document
      error              = go_error ).

  APPEND go_error TO gt_error.

*  SET PROPERTY OF gs_handle-obj 'VISIBLE' = 0.
  "打开EXCEL
  go_document->open_document(
    EXPORTING
      open_inplace = 'X'
      no_flush     = 'X'
      document_url = lv_url
    IMPORTING
      error        = go_error ).

  APPEND go_error TO gt_error.

  go_document->has_spreadsheet_interface(
    EXPORTING
      no_flush     = 'X'
    IMPORTING
      is_available = lv_available
      error        = go_error ).

  APPEND go_error TO gt_error.

  go_document->get_spreadsheet_interface(
    EXPORTING
      no_flush        = ''
    IMPORTING
      sheet_interface = go_spreadsheet
      error           = go_error ).

  APPEND go_error TO gt_error.

  go_document->get_document_handle(
    EXPORTING
      no_flush = 'X'
    IMPORTING
      handle   = gs_handle
      error    = go_error ).
  APPEND go_error TO gt_error.

*  SET PROPERTY OF gs_handle-obj 'VISIBLE' = 0.

  LOOP AT gt_error INTO gs_error.
    gs_error->raise_message( type = 'E' ).
    CLEAR: gs_error.
  ENDLOOP.

  IF go_spreadsheet IS INITIAL.
    MESSAGE '打开EXCEL失败,请删除任务管理器中的EXCEL进程再执行' TYPE 'S' DISPLAY LIKE 'E'.
    REJECT.
  ENDIF.

ENDFORM.

FORM doi_get_template  CHANGING pc_url TYPE text256.
  DATA: ls_uri  TYPE bapiuri,
        lt_uris TYPE sbdst_uri.

  cl_bds_document_set=>get_with_url(
    EXPORTING
      classname  = gc_classname
      classtype  = gc_classtype
      object_key = gc_object_key
    CHANGING
      uris       = lt_uris ).

  SORT lt_uris BY doc_count DESCENDING.
  READ TABLE lt_uris INTO ls_uri INDEX 1.

  pc_url = ls_uri-uri.

ENDFORM.

FORM fill_sheet .

  "SHEET1.资产负债
  PERFORM select_sheet USING 'Sheet1'.
  "填充数据
  PERFORM frm_write_single USING '1' '7' sy-uname.
  PERFORM frm_write_single USING '2' '7' sy-datum.


  "SHEET2.利润
  PERFORM select_sheet USING 'Sheet2'.
  "填充数据
  PERFORM frm_write_single USING '2' '7' sy-datum.

  "锁
  PERFORM protect.

ENDFORM.

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.

  "写入数据
  ls_contents-column = 1.
  ls_contents-row = 1.
  ls_contents-value = p_value.
  APPEND ls_contents TO lt_contents.
  
  "ranges
  ls_ranges-name = 'cell' .//自定义名称
  ls_ranges-columns = 1. //和lt_contents列数相关
  ls_ranges-rows = 1.//和lt_contents行数相关
  ls_ranges-code = 4.//固定
  APPEND ls_ranges TO lt_ranges.

  "每次只写一行一列
  CALL METHOD go_spreadsheet->insert_range_dim
    EXPORTING
      name     = 'cell'
      no_flush = 'X'
      top      = p_row //从第几行开始
      left     = p_col //从第几列开始
      rows     = 1 //有多少行
      columns  = 1.//有多少列

//写入
  CALL METHOD go_spreadsheet->set_ranges_data
    EXPORTING
      ranges   = lt_ranges
      contents = lt_contents
      no_flush = 'X'.
ENDFORM.

FORM progress_indicator  USING  pa_percentage
      pa_text.

  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = pa_percentage
      text       = pa_text.

ENDFORM.

FORM select_sheet  USING  pa_sheet_name.

  go_spreadsheet->select_sheet(
    EXPORTING
      name  = pa_sheet_name
    IMPORTING
      error = go_error ).

  GET PROPERTY OF gs_handle-obj 'ACTIVESHEET' =  gs_sheet.

ENDFORM.

tips:

多个sheet的写入:这里的 sheet页名 = OAOR上传模板的sheet页名
在这里插入图片描述

居中:

 go_spreadsheet->fit_widest(
    EXPORTING
      no_flush = 'X'
      name     = ''
    IMPORTING
      error    = go_error ).

写入:

尽量分区域填充;

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值