ABAP DOI详解(3)

这一篇解决上一篇的几个遗留问题:

  • 如何根据屏幕大小让 Excel 自适应
  • Excel 单个单元格写入
  • 设置 Excel 属性
  • 错误处理

如何根据屏幕大小让 Excel 自适应

Dialog screen 中的 custom control 大小是固定的,比较难看。如果想让 Excel 自适应变更大小,需要用到 cl_gui_container 类。

增加一个新的子例程:

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 初始化的时候,设定 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 就能根据屏幕变更大小,是不是漂亮多了呢?

Paste_Image.png

Excel 单个单元格写入

单个单元格写入的方法,同批量写入一样,使用 i_oi_spreadsheet 接口的set_range_dim 方法和 set_range_data 方法。区别在于 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 的数据写入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.   

设置 Excel 属性

我们刚刚把 spfli 的数据写入到 Excel,假设我们想把工作表的名称改为 spfli,并且将数据(注意我们写入的时候定义了 range name为 cell )区设置边框,列大小根据数据自适应我们可以这样:

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 接口的方法和如何使用这些方法,请参考帮助:Using the spreadsheet interface

错误处理

与 Office 集成的错误是非常复杂的,因为涉及外部资源的通讯和处理。调用 i_oi_spreadsheet 接口的方法后,必须弄清楚调用是否成功。前面几篇的演示代码特意没有错误的处理代码,目的是为了让代码更容易理解。每一个方法都有一个 ret_code 参数,如果有错误,返回错误码,没有错误则返回 OK。在程序中,开发人员可以用 c_oi_errors 类中定义的常量来代表这些错误码或者没有错误的 OK。请移步至 SAP help 了解这些常量:Error Messages and Their Meanings

在程序中,通常有两种方法来处理错误,第一种方法:使用 c_oi_errors 的静态方法 raise_message 简单地显示相关的错误:

CALL METHOD C_OI_ERRORS=>RAISE_MESSAGE
EXPORTING TYPE = type

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

第二种方法是区分不同的错误,给用户一个更明确的提示:

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.

因为 Excel 操作多个步骤,为了在过程中间减少对用户的干扰,也可以把 ret_code 返回的错误码先储存在内表中,集中处理:

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.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,738评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,377评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,774评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,032评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,015评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,239评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,724评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,374评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,410评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,457评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,132评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,733评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,804评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,022评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,515评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,116评论 2 341

推荐阅读更多精彩内容

  • 我们之所以用Excel输出,主要是想用Excel在显示中的优势,所以最常见的做法,往往调用Excel模板文件来实现...
    Stone0823阅读 3,076评论 0 3
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,537评论 18 399
  • 1.1 VBA是什么 直到90年代早期,使应用程序自动化还是充满挑战性的领域.对每个需要自动化的应用程序,人们不得...
    浮浮尘尘阅读 21,681评论 6 49
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,160评论 11 349
  • Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库,简单来说,它能将HTML...
    msq3阅读 25,758评论 3 69