ABAP DOI詳解(3)

這一篇解決上一篇的幾個(gè)遺留問(wèn)題:

  • 如何根據(jù)屏幕大小讓 Excel 自適應(yīng)
  • Excel 單個(gè)單元格寫入
  • 設(shè)置 Excel 屬性
  • 錯(cuò)誤處理

如何根據(jù)屏幕大小讓 Excel 自適應(yīng)

Dialog screen 中的 custom control 大小是固定的,比較難看。如果想讓 Excel 自適應(yīng)變更大小,需要用到 cl_gui_container 類。

增加一個(gè)新的子例程:

data: gr_container type ref to cl_gui_container,
      gr_splitter type ref to cl_gui_splitter_container,
     ...

form get_dynamic_container.
  create object gr_splitter
    exporting
      parent            = cl_gui_container=>screen0
      rows              = 1
      columns           = 1 .

  call method gr_splitter->set_border
    exporting
      border = cl_gui_cfw=>false.

  gr_container = gr_splitter->get_container( row = 1 column = 1 ).
endform.

同樣地,container control 初始化的時(shí)候,設(shè)定 parent 為 gr_container :

form create_container_control.
* create container control
  call method c_oi_container_control_creator=>get_container_control
    importing
      control = gr_control.

* initialize control
  call method gr_control->init_control
    exporting
      inplace_enabled          = 'X '
      inplace_scroll_documents = 'X'
      register_on_close_event  = 'X'
      register_on_custom_event = 'X'
      r3_application_name      = 'DOI demo by Stone Wang'
      parent                   = gr_container.
endform. 

這樣,Excel 就能根據(jù)屏幕變更大小,是不是漂亮多了呢?

Paste_Image.png

Excel 單個(gè)單元格寫入

單個(gè)單元格寫入的方法,同批量寫入一樣,使用 i_oi_spreadsheet 接口的set_range_dim 方法和 set_range_data 方法。區(qū)別在于 range 只包含一行一列:

form write_single_cell using p_row p_col p_value.
* define internal table for ranges and contents parameters
  data: lt_ranges type soi_range_list,
        ls_rangeitem type soi_range_item,
        lt_contents type soi_generic_table,
        ls_content type soi_generic_item.

* populate ranges
  clear ls_rangeitem.
  clear lt_ranges[].
  ls_rangeitem-name = 'cell' .
  ls_rangeitem-columns = 1.
  ls_rangeitem-rows = 1.
  ls_rangeitem-code = 4.
  append ls_rangeitem to lt_ranges.

* populate contents
  clear ls_content.
  clear lt_contents[].
  ls_content-column = 1.
  ls_content-row = 1.
  ls_content-value = p_value.
  append ls_content to lt_contents.

* 每次只寫一行一列
  call method gr_spreadsheet->insert_range_dim
    exporting
      name     = 'cell'
      no_flush = 'X'
      top      = p_row
      left     = p_col
      rows     = 1
      columns  = 1.

  call method gr_spreadsheet->set_ranges_data
    exporting
      ranges   = lt_ranges
      contents = lt_contents
      no_flush = 'X'.
endform.     

假如我們要把 gt_spfli 的數(shù)據(jù)寫入Excel,可以這樣:

form write_itab_to_excel_singlecell.
  data: row_index type i.

  check not gt_spfli is initial.

  clear gs_spfli.
  loop at gt_spfli into gs_spfli.
    row_index = sy-tabix + 1.

    perform write_single_cell using row_index 1 gs_spfli-carrid.
    perform write_single_cell using row_index 2 gs_spfli-connid.
    perform write_single_cell using row_index 3 gs_spfli-cityfrom.
    perform write_single_cell using row_index 4 gs_spfli-cityto.

    clear gs_spfli.
  endloop.

  row_index = row_index + 1.
  perform write_single_cell using row_index 1 sy-uname.
  perform write_single_cell using row_index 2 sy-datum.

endform.   

設(shè)置 Excel 屬性

我們剛剛把 spfli 的數(shù)據(jù)寫入到 Excel,假設(shè)我們想把工作表的名稱改為 spfli,并且將數(shù)據(jù)(注意我們寫入的時(shí)候定義了 range name為 cell )區(qū)設(shè)置邊框,列大小根據(jù)數(shù)據(jù)自適應(yīng)我們可以這樣:

form set_excel_attributes.
* change name of Sheet1 to 'spfli'
  call method gr_spreadsheet->set_sheet_name
    exporting
      newname = 'spfli'
      oldname = 'Sheet1'.

* set border line for range
  call method gr_spreadsheet->set_frame
    exporting
      rangename = 'cell'
      typ       = '127'
      color     = '1'
      no_flush  = 'X'.

* auto fit
  call method gr_spreadsheet->fit_widest
    exporting
      name     = space
      no_flush = 'X'.
endform.     

i_oi_spreadsheet 接口的方法和如何使用這些方法,請(qǐng)參考幫助:Using the spreadsheet interface。

錯(cuò)誤處理

與 Office 集成的錯(cuò)誤是非常復(fù)雜的,因?yàn)樯婕巴獠抠Y源的通訊和處理。調(diào)用 i_oi_spreadsheet 接口的方法后,必須弄清楚調(diào)用是否成功。前面幾篇的演示代碼特意沒(méi)有錯(cuò)誤的處理代碼,目的是為了讓代碼更容易理解。每一個(gè)方法都有一個(gè) ret_code 參數(shù),如果有錯(cuò)誤,返回錯(cuò)誤碼,沒(méi)有錯(cuò)誤則返回 OK。在程序中,開發(fā)人員可以用 c_oi_errors 類中定義的常量來(lái)代表這些錯(cuò)誤碼或者沒(méi)有錯(cuò)誤的 OK。請(qǐng)移步至 SAP help 了解這些常量:Error Messages and Their Meanings。

在程序中,通常有兩種方法來(lái)處理錯(cuò)誤,第一種方法:使用 c_oi_errors 的靜態(tài)方法 raise_message 簡(jiǎn)單地顯示相關(guān)的錯(cuò)誤:

CALL METHOD C_OI_ERRORS=>RAISE_MESSAGE
EXPORTING TYPE = type

type 可以是 A, E, W, I, S 其中之一。

第二種方法是區(qū)分不同的錯(cuò)誤,給用戶一個(gè)更明確的提示:

IF ret_code EQ c_oi_errors=>ret_ok.
        " Document opened successfully
ELSEIF ret_code EQ c_oi_errors=> ret_document_already_open.
        " Special error handling, e.g. dialog box.
ELSE.
CALL METHOD c_oi_errors=>raise_message
EXPORTING type = 'E'.
ENDIF.

因?yàn)?Excel 操作多個(gè)步驟,為了在過(guò)程中間減少對(duì)用戶的干擾,也可以把 ret_code 返回的錯(cuò)誤碼先儲(chǔ)存在內(nèi)表中,集中處理:

DATA: errors TYPE REF TO i_oi_error OCCURS 0 WITH HEADER LINE.

* DOI processing
CALL METHOD control->get_link_server
    EXPORTING server_type = server_type
        no_flush = 'X'
    IMPORTING link_server = link_server
        retcode = retcode
        error = errors.
APPEND errors.

LOOP AT errors.   
  CALL METHOD errors->raise_message
      EXPORTING  type = 'E'
      EXCEPTIONS message_raised = 1
          flush_failed = 2. ENDLOOP.
FREE errors.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 我們之所以用Excel輸出,主要是想用Excel在顯示中的優(yōu)勢(shì),所以最常見的做法,往往調(diào)用Excel模板文件來(lái)實(shí)現(xiàn)...
    Stone0823閱讀 3,446評(píng)論 0 3
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,623評(píng)論 18 399
  • 1.1 VBA是什么 直到90年代早期,使應(yīng)用程序自動(dòng)化還是充滿挑戰(zhàn)性的領(lǐng)域.對(duì)每個(gè)需要自動(dòng)化的應(yīng)用程序,人們不得...
    浮浮塵塵閱讀 22,136評(píng)論 6 49
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,753評(píng)論 11 349
  • Beautiful Soup 是一個(gè)可以從HTML或XML文件中提取數(shù)據(jù)的Python庫(kù),簡(jiǎn)單來(lái)說(shuō),它能將HTML...
    msq3閱讀 25,936評(píng)論 3 69

友情鏈接更多精彩內(nèi)容