このトピックでは、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.