【ABAP系列】SAP ABAP DOI展示EXCEL或WORD

公众号: SAP Technical
本文作者: matinal
 

 

前言部分

大家可以关注我的公众号,公众号里的排版更好,阅读更舒适。

正文部分

DOI技术算是比较老的技术了

用来直接调用office展示结果

可以是EXCEL也可以是WORD

​
data: begin of s_fal.
        include structure faglflext.
data: end of s_fal.
data: i_fal like table of s_fal.
data: ok_code like sy-ucomm.
type-pools: soi,sbdst,abap.
class c_oi_errors definition load.

data control type ref to i_oi_container_control.
data retcode  type  soi_ret_string.

data: container type ref to cl_gui_custom_container.

data: document type ref to i_oi_document_proxy.
data: error        type ref to        i_oi_error.
data: errors type ref to i_oi_error occurs 0.

data spreadsheet type ref to i_oi_spreadsheet.
data sheetname(20) type c.
select * from faglflext into corresponding fields of table i_fal where rbukrs = '9900' and ryear = '2008' and racct = '0020110101'.


call screen 100.
*&---------------------------------------------------------------------*
*&      Module  status_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
module status_0100 output.
  set pf-status '100'.


  call method c_oi_container_control_creator=>get_container_control
    importing
      control = control
      retcode = retcode.


  create object container
    exporting
      container_name = 'DOI_PARENT'."100屏幕上的控件名.

  call method control->init_control
    exporting
      r3_application_name = 'Demo Document Container'
      inplace_enabled     = 'X'
      parent              = container
    importing
      retcode             = retcode.

  call method control->get_document_proxy
    exporting
      document_type   = 'Excel.Sheet.8'
      document_format = 'OLE'
    importing
      document_proxy  = document
      retcode         = retcode.

  call method document->create_document
    exporting
      create_view_data = 'X'
      open_inplace     = 'X'
    importing
      retcode          = retcode.
  call method document->get_spreadsheet_interface
    exporting
      no_flush        = ' '
    importing
      sheet_interface = spreadsheet
      error           = error.
  call method spreadsheet->get_active_sheet
    exporting
      no_flush  = ''
    importing
      sheetname = sheetname
      error     = error
      retcode   = retcode.
  call method spreadsheet->add_sheet
    exporting
      name     = '年度报表'
      no_flush = ''
    importing
      error    = error
      retcode  = retcode.
  call method spreadsheet->delete_sheet
    exporting
      name     = sheetname
      no_flush = ''
    importing
      error    = error
      retcode  = retcode.
  call method spreadsheet->select_sheet
    exporting
      name     = '年度报表'
      no_flush = ''
    importing
      error    = error
      retcode  = retcode.

  data: rows like sy-tabix.
  data: field_count type i.
  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.
  field-symbols: <field> type any,
                 <wa> type any.
  field_count = 1.
  do.
    assign component field_count of structure s_fal to <field>."assign成功subrc = 0.
    if sy-subrc <> 0.
      exit.
    endif.
    add 1 to field_count.
  enddo.
  field_count = field_count - 1.
  describe table i_fal lines rows.
  call method spreadsheet->insert_range_dim
    exporting
      name     = 'CELL'
      no_flush = 'X'
      top      = 1
      left     = 1
      rows     = rows
      columns  = field_count
    importing
      error    = error.

  clear rangeitem.
  refresh ranges.
  rangeitem-name = 'CELL'.
  rangeitem-columns = field_count.
  rangeitem-rows = rows.
  append rangeitem to ranges.
  call method spreadsheet->set_font
    exporting
      rangename = 'CELL'
      family    = 'Times New Roman'
      size      = 9
      bold      = 0
      italic    = 0
      align     = 0
    importing
      error     = error
      retcode   = retcode.
  call method spreadsheet->set_format
    exporting
      rangename = 'CELL'
      typ       = 0
      currency  = 'RMB'
    importing
      error     = error
      retcode   = retcode.

  refresh excel_input.

  data: field_value type string.
  loop at i_fal assigning <wa>.
    rows = sy-tabix.
    field_count = 1.
    do.
      assign component field_count of structure <wa> to <field>."assign成功subrc = 0.
      if sy-subrc <> 0.
        exit.
      endif.
      clear excel_input_wa.
      excel_input_wa-column = field_count.
      excel_input_wa-row = rows.
      field_value = <field>.
      excel_input_wa-value = field_value.
      append excel_input_wa to excel_input.
      add 1 to field_count.
    enddo.
  endloop.
* set data
  call method spreadsheet->set_ranges_data
    exporting
      ranges   = ranges
      contents = excel_input
      no_flush = 'X'
    importing
      error    = error.
*get desktop directory
  data: desktop_directory type string.
  call method cl_gui_frontend_services=>get_sapgui_workdir
    changing
      sapworkdir            = desktop_directory
    exceptions
      get_sapworkdir_failed = 1
      cntl_error            = 2
      error_no_gui          = 3
      not_supported_by_gui  = 4
      others                = 5.
  if sy-subrc <> 0.
    message id sy-msgid type sy-msgty number sy-msgno
               with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  endif.

  if desktop_directory is initial.
    desktop_directory = 'C:'.
  endif.
  concatenate desktop_directory '\' '年度报表.xls' into desktop_directory.

  data: result type abap_bool.
  call method cl_gui_frontend_services=>file_exist
    exporting
      file                 = desktop_directory
    receiving
      result               = result
    exceptions
      cntl_error           = 1
      error_no_gui         = 2
      wrong_parameter      = 3
      not_supported_by_gui = 4
      others               = 5.
  if sy-subrc <> 0.
    message id sy-msgid type sy-msgty number sy-msgno
               with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  endif.
  data: rc type i.
  if result = 'X'.
    call method cl_gui_frontend_services=>file_delete
      exporting
        filename             = desktop_directory
      changing
        rc                   = rc
      exceptions
        file_delete_failed   = 1
        cntl_error           = 2
        error_no_gui         = 3
        file_not_found       = 4
        access_denied        = 5
        unknown_error        = 6
        not_supported_by_gui = 7
        wrong_parameter      = 8
        others               = 9.
    if sy-subrc <> 0.
      message id sy-msgid type sy-msgty number sy-msgno
                 with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    endif.
  endif.
  data:file_name(250) type c.
  file_name = desktop_directory.
  call method document->save_as
    exporting
      file_name   = file_name
      prompt_user = ''
    importing
      error       = error
      retcode     = retcode.
*放到FTP
*.............................
*.............................
*在这里写放到FTP上的语句.
endmodule.                 " status_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  user_command_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
module user_command_0100 input.
  case ok_code.
    when 'EXIT' or 'BACK'.
      leave to screen 0.
  endcase.
endmodule.                 " user_command_0100  INPUT

​

 

转载于:https://www.cnblogs.com/SAPmatinal/p/11183210.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ABAP是一种SAP系统的编程语言,SAP DOI(Document Object Infrastructure)是SAP系统的一个组件,用于处理文档对象。其中,I_OI_SPREADSHEET接口可用于读取和写入Excel电子表格数据。 以下是使用I_OI_SPREADSHEET接口读取Excel数据的简单示例: ``` DATA: lr_spreadsheet TYPE REF TO i_oi_spreadsheet, lr_worksheet TYPE REF TO i_oi_spreadsheet_worksheet, lr_cell TYPE REF TO i_oi_spreadsheet_cell, lv_value TYPE string. * 创建电子表格对象 CREATE OBJECT lr_spreadsheet TYPE cl_oi_spreadsheet. * 打开Excel文件 lr_spreadsheet->open_file( 'C:\data\example.xlsx' ). * 获取第一个工作表 lr_worksheet = lr_spreadsheet->get_worksheet( 1 ). * 逐个读取单元格数据 DO 10 TIMES. lr_cell = lr_worksheet->get_cell( sy-index, 1 ). IF lr_cell IS BOUND. lv_value = lr_cell->get_value( ). WRITE: / lv_value. ENDIF. ENDDO. ``` 以上代码会逐行读取Excel文件的第一个工作表的第一列数据,并输出到屏幕上。 如果希望写入Excel数据,可以使用类似以下的代码: ``` DATA: lr_spreadsheet TYPE REF TO i_oi_spreadsheet, lr_worksheet TYPE REF TO i_oi_spreadsheet_worksheet, lr_cell TYPE REF TO i_oi_spreadsheet_cell. * 创建电子表格对象 CREATE OBJECT lr_spreadsheet TYPE cl_oi_spreadsheet. * 打开Excel文件 lr_spreadsheet->open_file( 'C:\data\example.xlsx' ). * 获取第一个工作表 lr_worksheet = lr_spreadsheet->get_worksheet( 1 ). * 写入数据到单元格 lr_cell = lr_worksheet->get_cell( 1, 1 ). IF lr_cell IS BOUND. lr_cell->set_value( 'Hello World!' ). ENDIF. * 保存Excel文件 lr_spreadsheet->save( ). ``` 以上代码会将字符串“Hello World!”写入Excel文件的第一个工作表的第一个单元格,并保存文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值