このトピックでは、EXCELファイル出力の方法を取り上げて説明します。
仕組
ABAPプログラムは、ABAP言語のOLE オートメーション技術を利用して、Excelファイルの読み取り、書き込みを行うことができます。 以下の図でその仕組みを示します。
- OLEサーバとなるデスクトップアプリケーション(ExcelやWordなど)は、フロントエンドマシンに稼働します。
- ABAPプログラムはAS ABAPに稼働します。
- OLEサーバを直接アクセスするのは同じフロントエンドマシンに稼働するSAP GUIです。
- ABAPプログラムのOLE関連命令はAS ABAPによりRFCを通して、フロントエンドマシンに稼働するSAP GUIと連携されます。
ABAPで制御されるアプリケーションはすべて、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.