*---------------------------------------------------------------------*
*                     Z _ B J H _ E X C E L _ I N                     *
*                                                                     *
*                  Autor: Bernd Haase (BJH Software)                  *
*---------------------------------------------------------------------*
* Beispielprogramm zum Einlesen einer Excel-Tabelle und Bereitstellung*
* deren Daten in einer internen Tabelle vom Format, wie auch andere   *
* Programme mit Dateilesealgorithmen arbeiten.                        *
*---------------------------------------------------------------------*
* (X) Excel_in                                                        *
*---------------------------------------------------------------------*
* 17.05.2005 BHaa: Programm erstellt                                  *
*---------------------------------------------------------------------*
REPORT  z_bjh_excel_in .

DATA:
 BEGIN OF ds_in,
   01(20) TYPE c,
   02(20) TYPE c,
   03(20) TYPE c,
   04(20) TYPE c,
   05(20) TYPE c,
   06(20) TYPE c,
   07(20) TYPE c,
   08(20) TYPE c,
   09(20) TYPE c,
   10(20) TYPE c,
 END OF ds_in,
 dstab_in LIKE TABLE OF ds_in.

*---------------------------------------------------------------------*
*                                                                     *
*                 A u s w a h l b i l d s c h i r m                   *
*                                                                     *
*---------------------------------------------------------------------*
* Quelllaufwerk und Quelldatei
SELECTION-SCREEN: BEGIN OF BLOCK a1 WITH FRAME TITLE text-901.
PARAMETERS:
* Dateiname für die einzulesende Excel-Tabelle
 pm_in LIKE rlgrap-filename.
SELECTION-SCREEN: END OF BLOCK a1.

INITIALIZATION.

***********************************************************************
*                                                                     *
*                     P R O G R A M M S T A R T                       *
*                                                                     *
***********************************************************************
START-OF-SELECTION.

 CLEAR:   dstab_in, ds_in.
 REFRESH: dstab_in.

 IF NOT pm_in(1) IS INITIAL.
* Datei einlesen, ein Dateiname sollte aber exisitieren
   PERFORM upro-excel_einlesen.
* Ausgabe am Bildschirm. Die eingelesene Tabelle wird zeilenweise
* anzeigt
   LOOP AT dstab_in INTO ds_in.
     WRITE: / ds_in-01, ds_in-02, ds_in-03, ds_in-04, ds_in-05,
              ds_in-06, ds_in-07, ds_in-08, ds_in-09, ds_in-10.
   ENDLOOP.
 ENDIF.

END-OF-SELECTION.
 EXIT.

*---------------------------------------------------------------------*
*                     E X C E L _ E I N L E S E N                     *
*---------------------------------------------------------------------*
* einlesen der Excel-Tabelle. Dateiname ist vorgegeben, es wird eine  *
* interne Tabelle gefüllt, wo jedes Element einem Element der Reihe/  *
* Spalte in der Excel-Datei entspricht. Das Untergramm baut aber dar- *
* aus eine Übergabetabelle auf, entsprechend dem Muster einer allge-  *
* meinen, internen Tabelle, so wie sie auch eim normalen Dateieinlesen*
* erzeugt würde.                                                      *
*---------------------------------------------------------------------*
FORM upro-excel_einlesen.

 DATA:
   quelldatei LIKE rlgrap-filename,

   zw_row   LIKE alsmex_tabline-row,
   wa_excel LIKE alsmex_tabline,
   BEGIN OF itab_excel OCCURS 0.
         INCLUDE STRUCTURE alsmex_tabline.
 DATA:
   END OF itab_excel.

 MOVE pm_in TO quelldatei.
* umschalten auf Excel-Dateikennung, falls txt eingegeben wurde (die
* meisten BJH-Programme sind als wahlweises Einlesen von txt oder xls
* ausgelegt)
 REPLACE '.txt' WITH '.xls' INTO quelldatei.

 CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
      EXPORTING
           filename                = quelldatei
           i_begin_col             = 1
           i_begin_row             = 1
           i_end_col               = 10          "wieviel Spalten !!!
           i_end_row               = 50000
      TABLES
           intern                  = itab_excel
*      EXCEPTIONS
*           INCONSISTENT_PARAMETERS = 1
*           UPLOAD_OLE              = 2
*           OTHERS                  = 3
           .
 IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
 ENDIF.

 CLEAR:   dstab_in, ds_in, zw_row.
 REFRESH: dstab_in.

 SORT itab_excel BY row col.

* Excel-Datei hat festes Format, dieses mit dem Aufbau hier abgleichen
 LOOP AT itab_excel INTO wa_excel.
   IF wa_excel-row <> zw_row.
     IF NOT zw_row IS INITIAL.
* nur Sätze anlegen, wo der 3. Wert auch gefüllt ist
       PERFORM upro-excel_datensatz.
     ENDIF.
     MOVE wa_excel-row TO zw_row.
     CLEAR ds_in.
   ENDIF.

   CASE wa_excel-col.
     WHEN 1.
       MOVE wa_excel-value TO ds_in-01.
     WHEN 2.
       MOVE wa_excel-value TO ds_in-02.
     WHEN 3.
       MOVE wa_excel-value TO ds_in-03.
     WHEN 4.
       MOVE wa_excel-value TO ds_in-04.
     WHEN 5.
       MOVE wa_excel-value TO ds_in-05.
     WHEN 6.
       MOVE wa_excel-value TO ds_in-06.
     WHEN 7.
       MOVE wa_excel-value TO ds_in-07.
     WHEN 8.
       MOVE wa_excel-value TO ds_in-08.
     WHEN 9.
       MOVE wa_excel-value TO ds_in-09.
     WHEN 10.
       MOVE wa_excel-value TO ds_in-10.
   ENDCASE.
 ENDLOOP.

 IF NOT zw_row IS INITIAL.
   PERFORM upro-excel_datensatz.
 ENDIF.
 MOVE wa_excel-row TO zw_row.

ENDFORM.

*---------------------------------------------------------------------*
*                      E X C E L _ D A T E N S A T Z                  *
*---------------------------------------------------------------------*
* aufgebaute Struktur an die interne Tabelle anhängen. Im Beispiel ist*
* noch eine Prüfung vorhanden, das nur die Sätze übernommen werden, wo*
* im 3. Datenelement auch was steht.                                  *
*---------------------------------------------------------------------*
FORM upro-excel_datensatz.

 IF NOT ds_in-03 IS INITIAL.
* nur Sätze anlegen, wo der 3. Wert auch gefüllt ist
   APPEND ds_in TO dstab_in.
 ENDIF.

ENDFORM.

***** Ende *****
* Copyright BJH Software, Datei überarbeitet am: 21.5.2005