Excelファイル出力

 

このトピックでは、EXCELファイル出力の方法を取り上げて説明します。

ABAPプログラムは、ABAP言語のOLE オートメーション技術を利用して、Excelファイルの読み取り、書き込みを行うことができます。 以下の図でその仕組みを示します。

  1. OLEサーバとなるデスクトップアプリケーション(ExcelやWordなど)は、フロントエンドマシンに稼働します。
  2. ABAPプログラムはAS ABAPに稼働します。
  3. OLEサーバを直接アクセスするのは同じフロントエンドマシンに稼働するSAP GUIです。
  4. ABAPプログラムのOLE関連命令はAS ABAPによりRFCを通して、フロントエンドマシンに稼働するSAP GUIと連携されます。

ABAPで制御されるアプリケーションはすべて、ABAPシステムに登録しなければなりません。

以下のABAP命令でOLEサーバアプリケーションを制御します。

  • CREATE OBJECT
    OLEサーバアプリケーションのアプリケーションオブジェクトを作成します。
    アプリケーション名が指定されます、例えばExcelアプリケーションの場合は、'Excel.Application'になります。
  • SET PROPERTY
    アプリケーションオブジェクトのプロパティの値を設定します。
  • GET PROPERTY
    アプリケーションオブジェクトのプロパティの値を取得します。
  • CALL METHOD
    アプリケーションオブジェクトのメソッドを呼び出します。

任意テーブルのデータをExcelファイルへエクスポートするツールをサンプルとして取り上げてそのソースを以下に示します。 動的プログラミングのサンプルソースとしても参考できるものです。

REPORT  Y_XXXXX01.

INCLUDE ole2incl.

TYPES: BEGIN OF s_tabstr,
  fieldname TYPE fieldname,
  as4local TYPE as4local,
  POSITION TYPE tabfdpos,
  keyflag TYPE keyflag,
  rollname TYPE rollname,
  datatype TYPE datatype_d,
  leng TYPE ddleng,
  scrtext_s TYPE scrtext_s,
END OF s_tabstr.

 PARAMETERS: p_table TYPE dd02l-tabname obligatory.
 PARAMETERS: p_file TYPE localfile DEFAULT 'c:\temp\test1.xls'.

TABLES: v_username.


DATA: BEGIN OF i_data OCCURS 0.
  INCLUDE STRUCTURE v_username.
DATA: END OF i_data.


START-OF-SELECTION.

  DATA:
        g_tablename TYPE tabname,
        g_filename TYPE localfile,
        g_itab_header TYPE REF TO DATA,
        g_itab_data TYPE REF TO DATA.

g_tablename = p_table.
g_filename = p_file.


* get table header
PERFORM f_get_tablestruc
              USING g_tablename
              CHANGING  g_itab_header.

* get table data
PERFORM f_extract_tabledata
              USING g_tablename
              CHANGING  g_itab_data.

* create and export data to excel file
PERFORM f_export_to_excel
              USING g_itab_header
                        g_itab_data
                        g_filename.


FORM f_get_tablestruc   USING VALUE(u_tabnam) TYPE tabname
                                       CHANGING c_itab TYPE REF TO DATA.
  DATA:
       v_delm TYPE C,
       str_ty TYPE REF TO cl_abap_structdescr,
        t_cm TYPE cl_abap_structdescr=>component_table,
        s_cm LIKE LINE OF t_cm,
        ref_cm TYPE REF TO DATA,
        f_seq TYPE n length 4,
        tabstr TYPE STANDARD TABLE OF s_tabstr.

  FIELD-SYMBOLS:
  <str> TYPE ANY,
  <cmp> TYPE ANY,
  <tabstr> LIKE LINE OF tabstr,
  <lab> TYPE STANDARD TABLE.

  CLEAR: f_seq, t_cm[].

  MOVE cl_abap_char_utilities=>horizontal_tab TO v_delm.

  SELECT fieldname as4local POSITION keyflag rollname datatype leng scrtext_s
  FROM dd03vt
  INTO TABLE tabstr
  WHERE tabname EQ u_tabnam AND ddlanguage EQ sy-langu.
  IF sy-subrc NE 0.
    MESSAGE e004(zasd1) WITH TEXT-e01 u_tabnam space space.
    STOP.
  ENDIF.
  SORT tabstr BY POSITION ASCENDING.

  LOOP AT tabstr ASSIGNING <cmp>.
    CLEAR s_cm.
    f_seq = f_seq + 1.
    CONCATENATE 'col' f_seq INTO s_cm-name.
    s_cm-type = cl_abap_elemdescr=>get_c( 30 ).
    APPEND s_cm TO t_cm.
  ENDLOOP.

  str_ty = cl_abap_structdescr=>create( t_cm ).

  CREATE DATA ref_cm TYPE handle str_ty.
  ASSIGN ref_cm->* TO <str>.

  CREATE DATA c_itab  LIKE STANDARD TABLE OF <str>.
  ASSIGN c_itab->* TO <lab>.

  CLEAR f_seq.
  DATA w_cl TYPE string.

  LOOP AT tabstr ASSIGNING <tabstr>.
    f_seq = f_seq + 1.
    CLEAR w_cl.
    CONCATENATE 'COL' f_seq INTO w_cl.
    ASSIGN COMPONENT w_cl OF STRUCTURE <str> TO <cmp>.
    <cmp> = <tabstr>-scrtext_s.
  ENDLOOP.

  APPEND <str> TO <lab>.
  CLEAR f_seq.
  LOOP AT tabstr ASSIGNING <tabstr>.
    f_seq = f_seq + 1.
    CLEAR w_cl.
    CONCATENATE 'COL' f_seq INTO w_cl.
    ASSIGN COMPONENT w_cl OF STRUCTURE <str> TO <cmp>.
    <cmp> = <tabstr>-fieldname.
  ENDLOOP.
  APPEND <str> TO <lab>.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.
*
*
FORM f_extract_tabledata   USING VALUE(u_tabnam) TYPE tabname
                                       CHANGING c_itab TYPE REF TO DATA.

  DATA:
        w_file TYPE string,
        tabstr TYPE STANDARD TABLE OF s_tabstr.

  FIELD-symbols:
  <itab>   TYPE STANDARD TABLE.

  CREATE DATA c_itab TYPE STANDARD TABLE OF (u_tabnam).

  ASSIGN c_itab->* TO <itab>.

  SELECT *
  FROM (u_tabnam)
  INTO TABLE <itab>.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.                    "f_down_proc


FORM f_export_to_excel USING u_itab_header TYPE REF TO DATA
                                             u_itab_data TYPE REF TO DATA
                                             u_filename TYPE localfile.

DATA: w_excel TYPE ole2_object,
      w_workbooks TYPE ole2_object,
      w_workbook TYPE ole2_object,
      w_cell TYPE ole2_object.

DATA: w_row TYPE I,
          w_col  TYPE I,
          type   TYPE C,
          count TYPE I.

  FIELD-SYMBOLS:
  <str> TYPE ANY,
  <cmp> TYPE ANY,
  <fs_itab_header> TYPE STANDARD TABLE,
  <fs_itab_data> TYPE STANDARD TABLE,
  <fs_itab_headrow> TYPE ANY,
  <fs_itab_datarow> TYPE ANY.

* Create OLE automation object of type Excel.Application.
CREATE OBJECT w_excel 'Excel.Application'.

* Add a new Excel Workbook.
CALL METHOD OF w_excel 'Workbooks' = w_workbooks.
CALL METHOD OF w_workbooks 'Add' = w_workbook.

* Display MS-Excel when executing the program.
SET PROPERTY OF w_excel 'Visible' = 1.

* Export title to the Excel sheet.
 ASSIGN u_itab_header->* TO <fs_itab_header>.

 FIELD-SYMBOLS:
  <fs_headrow> TYPE ANY.

w_row = 1.


LOOP AT <fs_itab_header> ASSIGNING <fs_itab_headrow>.
  w_col = 1.
  DESCRIBE FIELD <fs_itab_headrow> TYPE type COMPONENTS count.
  WHILE w_col <= count.
    ASSIGN COMPONENT w_col OF STRUCTURE <fs_itab_headrow> TO <cmp>.
    CALL METHOD OF w_excel 'Cells' = w_cell
       EXPORTING #1 = w_row  #2 = w_col.
    SET PROPERTY OF w_cell 'Value' = <cmp>.

    w_col = w_col + 1.

  ENDWHILE.
  w_row = w_row + 1.

ENDLOOP.


* Export data to the Excel sheet.
 ASSIGN u_itab_data->* TO <fs_itab_data>.

LOOP AT <fs_itab_data> ASSIGNING <fs_itab_datarow>.
  w_col = 1.
  DESCRIBE FIELD <fs_itab_headrow> TYPE type COMPONENTS count.
  WHILE w_col <= count.
    ASSIGN COMPONENT w_col OF STRUCTURE <fs_itab_datarow> TO <cmp>.
    CALL METHOD OF w_excel 'Cells' = w_cell
       EXPORTING #1 = w_row  #2 = w_col.
    SET PROPERTY OF w_cell 'Value' = <cmp>.

    w_col = w_col + 1.

  ENDWHILE.
  w_row = w_row + 1.

ENDLOOP.

* Save file.
CALL METHOD OF w_workbook 'SaveAs'
EXPORTING #1 = u_filename
  #6 = 1.

* Quit Excel.
CALL METHOD OF w_excel 'Quit'.

FREE OBJECT: w_excel,
w_workbooks,
w_workbook,
w_cell.

ENDFORM.