This is a test message to test the length of the message box.
Login
ABAP XCO Excel
Erstellt von Software-Heroes

ABAP - XCO Excel

187

Was kann eigentlich die XCO Bibliothek für Excel in ABAP? Hier schauen wir uns den aktuellen Stand der API an.

Werbung


Die XCO Klassen sind Hilfsklassen die verschiedene Funktionen des Alltags gebündelt unter einer öffentlichen API zur Verfügung stellen. Weitere Informationen und eine Übersicht über die XCO Bibliotheken findest du auf der Übersichtsseite.

 

Einleitung

Für die Verarbeitung von Excel Dateien stellt SAP eine eigene XCO API zur Verfügung, die du zum Lesen und mittlerweile auch zum Schreiben verwenden kannst. Im heutigen Beispiel lesen wir eine Excel Datei ein und erzeugen eine neue Datei, die wir dann per Mail verschicken.

 

Open Source

Bevor wir allerdings in das Beispiel einsteigen, noch ein kleiner Punkt zu einem Open Source Projekt, welches sich bereits seit langer Zeit mit dem Lesen und Aufbereiten von Excel Dateien beschäftigt. Mit abap2xlsx kannst du schnell und einfach Excel Dateien aufbereiten und gestalten. Die meisten Excel Features werden in dem Projekt unterstützt und selbst das Erstellen von sehr großen Excel Dateien ist möglich. Das Projekt ist noch nicht zu 100% ABAP Cloud fähig, kann aber sehr gut im klassischen ABAP verwendet werden.

 

Lesen

Schauen wir uns im ersten Schritt an, wie wir die Excel Datei einlesen können und an die verschiedenen Bestandteile herankommen.

 

Datei

In diesem Tutorial werden wir die folgende Datei zum Testen verwenden, diese besteht aus drei Arbeitsblättern mit den folgenden Bezeichnungen:

 

Die Inhalte der Arbeitsblätter sehen dabei wir folgt aus:

  • Currency

  • Country

  • Users

 

Damit du mit der Datei lokal arbeiten kannst, geben wir diese über die Methode GET_DUMMY_EXCEL_STREAM zurück. Die Methode findest du unten im Beispiel. Um die Datei nun zum Lesen zu öffnen, übergeben wir den Stream an die Klasse XCO_CP_XLSX und rufen den Lesemodus auf.

DATA(lo_document) = xco_cp_xlsx=>document->for_file_content( ld_stream )->read_access( ).

 

Arbeitsblätter

Wollen wir uns einen Überblick über alle Arbeitsblätter im Dokument machen, dann können wir uns alle Objekte zurückgeben lassen und dann per LOOP abarbeiten. Über die Methode GET_NAME, erhalten wir zum Beispiel den Namen des aktuellen Arbeitsblattes.

LOOP AT lo_document->get_workbook( )->worksheet->all->get( ) INTO DATA(lo_sheet).
  out->write( lo_sheet->get_name( ) ).
ENDLOOP.

 

Als Ergebnis erhalten wir die Arbeitsblätter von links nach rechts zurückgegeben.

 

Möchten wir ein spezifisches Arbeitsblatt aus der Datei erhalten, können wir mit den Methoden AT_POSITION oder FOR_NAME arbeiten.

lo_sheet = lo_document->get_workbook( )->worksheet->at_position( 2 ).

lo_sheet = lo_document->get_workbook( )->worksheet->for_name( cs_sheets-users ).

 

Wollen wir eine bestimmte Position lesen, dann übergeben wir einen Integer an die Methode AT_POSITION. Das erste Arbeitsblatt beginnt bei 1. Bei FOR_NAME übergeben wir den Namen des Arbeitsblattes, so wie wir ihn in der Datei sehen. Bevor du allerdings auf die Daten zugreifst, solltest du prüfen, ob das Arbeitsblatt auch existiert:

lo_sheet = lo_document->get_workbook( )->worksheet->at_position( 4 ).
IF NOT lo_sheet->exists( ).
  out->write( |Sheet not found| ).
ENDIF.

 

Lesen (Alles)

Wie kommen wir nun an die Daten in den Sheets? Da wir nun ein Worksheet als Objekt haben, können wir über die SELECT Methode die Daten lesen. Dazu müssen wir allerdings ein paar Methoden aufrufen, um an die Daten zu kommen. Zuerst einmal müssen wir ein Pattern erzeugen, also welchen Bereich wir lesen wollen. Da wir alle Daten haben wollen, nehmen wir das Standard Pattern ohne weitere Einstellungen.

DATA(lo_pattern) = xco_cp_xlsx_selection=>pattern_builder->simple_from_to( )->get_pattern( ).

 

Zum Lesen müssen wir nun verschiedene Methoden aufrufen und Konfigurationen setzen. Über die SELECT Methode übergeben wir das Pattern Objekt, um dann einen ROW_STREAM zu wählen. Hier hast du die Auswahl zwischen ganzer Zeile oder pro Zelle, die dieser Variante lesen wir pro Zeile. Dann wählen wir eine Operation und schreiben die Daten in unsere Tabelle, die wir als Referenz übergeben. Im nächsten Schritt setzen wir eine Transformation für die Inhalte, hier möchten wir alle Inhalte nach String konvertieren. Zum Abschluss führen wir per EXECUTE das Mapping aus.

DATA(lo_result) = io_sheet->select( lo_pattern
  )->row_stream(
  )->operation->write_to( REF #( lt_users )
  )->set_value_transformation( xco_cp_xlsx_read_access=>value_transformation->string_value
  )->execute( ).

 

Die Daten werden nun in die interne Tabelle geschrieben. Da wir alle Daten gelesen haben, befinden sich auch die Kopfzeilen in der Tabelle, diese können wir in den nächsten Schritten entfernen oder für die Klassifizierung der Daten nutzen.

 

Nach der Ausführung erhalten wir auch RESULT Objekt zurück, dort können wir nach dem Status fragen und erhalten ebenfalls eine Tabelle mit Fehlermeldungen.

IF lo_result->succeeded = abap_false.
  LOOP AT lo_result->messages INTO DATA(lo_message).
  ENDLOOP.
ENDIF.

 

Lesen (Bereich)

Wollen wir einen bestimmten Bereich lesen, können wir auch das Pattern anpassen und den Rest beibehalten. In diesem Fall wollen wir die Spalten B bis C lesen und dabei die Kopfzeile überspringen. Dabei müssen wir die maximale Zeile nicht begrenzen, es wird gelesen, solange es Daten gibt.

DATA(lo_pattern) = xco_cp_xlsx_selection=>pattern_builder->simple_from_to(
  )->from_column( xco_cp_xlsx=>coordinate->for_alphabetic_value( 'B' )
  )->to_column( xco_cp_xlsx=>coordinate->for_alphabetic_value( 'C' )
  )->from_row( xco_cp_xlsx=>coordinate->for_numeric_value( 2 )
  )->get_pattern( ).

 

Das Ergebnis wollen wir in einen eigenen Typen laden.

TYPES: BEGIN OF ts_parts,
         country TYPE string,
         ranking TYPE string,
       END OF ts_parts.
TYPES tt_parts TYPE STANDARD TABLE OF ts_parts WITH EMPTY KEY.

 

Am Schreiben müssen wir so weit keine Änderungen durchführen. Wir übernehmen das Ergebnis in unsere lokale Tabelle.

lo_sheet->select( lo_pattern
  )->row_stream(
  )->operation->write_to( REF #( lt_parts )
  )->set_value_transformation( xco_cp_xlsx_read_access=>value_transformation->string_value
  )->execute( ).

 

Hinweis: Aktuell scheint das Lesen nicht sauber zu funktionieren. Damit das Ergebnis in den richtigen Spalten landet, müssen wir eine Dummy Spalte (übersprungene Position) einfügen. Sonst wir die letzte Spalte immer wieder überschrieben.

TYPES: BEGIN OF ts_parts,
         dummy   TYPE string,
         country TYPE string,
         ranking TYPE string,
       END OF ts_parts.
TYPES tt_parts TYPE STANDARD TABLE OF ts_parts WITH EMPTY KEY.

 

Schreiben

Mittlerweile gibt es auch eine Möglichkeit Excel Dateien zu erzeugen. In unserem Beispiel werden wir eine Datei erzeugen und diese per Mail versenden, um sie uns besser anschauen zu können.

 

Daten

Zuerst einmal erzeugen wir eine interne Tabelle mit Daten. Dazu befüllen wir die erste Zeile mit den Spaltenüberschriften, da diese nicht separat erzeugt werden können.

DATA(lt_users) = VALUE tt_users( 
  ( user_id = 'User ID' user_name = 'First Name' user_mail = 'Mail address' )
  ( user_id = '04567' user_name = 'Chuck' user_mail = 'chuck@outlook.com' )
  ( user_id = '12541' user_name = 'Terence' user_mail = 'terence@outlook.com' )
  ( user_id = '24470' user_name = 'Emily' user_mail = 'emily@outlook.com' ) ).

 

Erzeugung

Nun können wir mit der Erzeugung des Excel Dokuments beginnen. Dazu öffnen wir ein neues und leeres Dokument über die Klasse. Über die EMPTY Methode sollte das Dokument leer sein.

DATA(lo_document) = xco_cp_xlsx=>document->empty( )->write_access( ).

 

Im nächsten Schritt legen wir ein neues Tabellenblatt an und setzen es als aktive Entität, um unsere Daten dorthin schreiben zu können. Wir wählen deshalb die zweite Position, da bereits ein Blatt in der leeren Datei angelegt wurde. Grundsätzlich kannst du über die Methode SET_NAME auch den Namen des Blattes anpassen.

lo_document->get_workbook( )->add_new_sheet( `Made with ABAP` ).
DATA(lo_sheet) = lo_document->get_workbook( )->worksheet->at_position( 2 ).

 

Nun benötigen wir ein einfaches Pattern für die Selektion. Wollen wir bei A1 starten, reicht die Erzeugung ohne Koordinaten. Das Pattern übergeben wir an den SELECT und können dann per ROW_STREAM unsere Tabelle nach Excel übertragen. Mit EXECUTE wird dann das Schreiben gestartet.

DATA(lo_pattern) = xco_cp_xlsx_selection=>pattern_builder->simple_from_to( )->get_pattern( ).

lo_sheet->select( lo_pattern
  )->row_stream(
  )->operation->write_from( REF #( lt_users )
  )->execute( ).

 

Zum Abschluss können wir uns dann den kompletten Stream des Excels über die Methode holen, um diesen zum Abschluss an den Mailversand zu übergeben.

DATA(ld_excel) = lo_document->get_file_content( ).

 

E-Mail

In diesem Beispiel senden wir die E-Mail über die neue E-Mail Klasse. Dazu bereiten wir das Dokument vor, setzen Sender und Empfänger und fügen noch ein paar Texte hinzu.

DATA(lo_mail) = cl_bcs_mail_message=>create_instance( ).

lo_mail->set_sender( c_sender ).
lo_mail->add_recipient( c_receiver ).

lo_mail->set_subject( 'New Excel File' ).

lo_mail->set_main( cl_bcs_mail_textpart=>create_instance(
                       iv_content      = '<h1>Hello,</h1><p>here your fresh printed Excel File</p>'
                       iv_content_type = 'text/html' ) ).

 

Im Anschluss hängen wir den Stream an die E-Mail und geben dem Dokument noch den richtigen Mimetype mit.

lo_mail->add_attachment(
    cl_bcs_mail_binarypart=>create_instance(
        iv_content      = id_excel
        iv_content_type = `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`
        iv_filename     = `My-generated-Excel.xlsx` ) ).

 

Über die SEND Methode, wird die E-Mail dann an uns geschickt.

lo_mail->send( ).

 

In der Mail finden wir den entsprechenden Text und die HTML Formatierung, die wir auch an die Methoden übergeben haben. Das Dokument hat den vergebenen Namen und ist eine Excel Datei.

 

Öffnen wir die Datei, finden wir unsere beiden Arbeitsblätter. Unsere Daten befinden sich auf dem neuen Arbeitsblatt, so wie wir sie an das Dokument übergeben haben.

 

Gestaltung

Mit dem aktuellen Release im ABAP Environment (2411) steht dir in der BTP auch die Option zur Gestaltung des Excel Dokuments zur Verfügung. Dabei wurden einige Funktionen für Excel zur Verfügung gestellt, diese wollen wir uns genauer anschauen.

 

Farbe

Im ersten Schritt passen wir die Hintergrundfarbe der Kopfzeile an und färben jede Zelle in einem anderen Farbton. Dazu legen wir uns erst einmal eine Tabelle mit Farben an, die wir im Anschluss übernehmen wollen.

TYPES to_color TYPE REF TO cl_xco_xlsx_color.
DATA lt_color TYPE STANDARD TABLE OF to_color WITH EMPTY KEY.

lt_color = VALUE #( ( xco_cp_xlsx=>color->standard->blue )
                    ( xco_cp_xlsx=>color->standard->light_blue )
                    ( xco_cp_xlsx=>color->standard->orange ) ).

 

Im nächsten Schritt setzen wir den Cursor des Dokuments auf A1, also die erste Zelle oben Links im Excel Dokument.

DATA(lo_cursor) = io_sheet->cursor( io_column = xco_cp_xlsx=>coordinate->for_alphabetic_value( 'A' )
                                    io_row    = xco_cp_xlsx=>coordinate->for_numeric_value( 1 ) ).

 

Im Anschluss loopen wir über die Tabelle mit Farben, holen uns die aktuelle Zelle, setzen die entsprechende Farbe und schieben den Cursor nach rechts auf die nächste Zelle.

LOOP AT lt_color INTO DATA(lo_color).
  DATA(lo_cell) = lo_cursor->get_cell( ).
  lo_cell->apply_styles( VALUE #( ( xco_cp_xlsx=>style->fill( )->set_background_color( lo_color ) ) ) ).
  lo_cursor->move_right( ).
ENDLOOP.

 

Die zugeschickte Excel Datei sollte nun wie folgt aussehen, der Header hat etwas Farbe erhalten.

 

Schutz

Grundsätzlich haben wir die Möglichkeit das Tabellenblatt auch zu schützen, damit keine Änderungen vorgenommen werden können. Im Grunde führen wir auf dem SHEET die Methode aus und können alles schützen oder freigeben. Ist das Blatt geschützt, können wir im nächsten Schritt Zellen für die Bearbeitung öffnen.

io_sheet->protect( )->set_select_locked_cells( ).

 

Wertehilfe

Als letzter Punkt wurde die Wertehilfe bzw. eine Validierung implementiert. In diesem Abschnitt werden wir die Zellen auch öffnen, damit wir die Werte anpassen können. Dazu lassen wir uns wieder einen Cursor geben, dieses Mal für B2, um beim ersten Vornamen zu starten. Dann bereiten wir eine Validierung mit verfügbaren Vornamen vor.

lo_cursor = io_sheet->cursor( io_column = xco_cp_xlsx=>coordinate->for_alphabetic_value( 'B' )
                              io_row    = xco_cp_xlsx=>coordinate->for_numeric_value( 2 ) ).

DATA(lo_validation) = xco_cp_xlsx=>data_validation_type->if_xco_xlsx_dat_val_type_f~list(
  )->add_source( `Chuck`
  )->add_source( `Terence`
  )->add_source( `Emily`
  )->add_source( `Bob` ).

 

Zum Abschluss gehen wir über die 3 Zellen, setzen die Validierung und öffnen die Zelle für Eingaben. Sind wir damit fertig, setzen wir den Cursor eine Zelle nach unten.

DO 3 TIMES.
  lo_cell = lo_cursor->get_cell( ).
  lo_cell->data_validation->set_type( lo_validation ).
  lo_cell->apply_styles( VALUE #( ( xco_cp_xlsx=>style->protection( )->set_locked( abap_false ) ) ) ).
  lo_cursor->move_down( ).
ENDDO.

 

Das Ergebnis sieht nun wie folgt aus, die Zelle ist änderbar und wir erhalten eine Auswahlliste für Vornamen. Der entsprechende Eintrag der Zelle ist bereits markiert.

 

Weitere Methoden

In diesem Artikel wollten wir vor allem auf die beiden einfachsten Methoden zum Lesen und Schreiben eingehen. Die Arbeit über Tabellen wird die häufigsten Use-Cases abdecken. Grundsätzlich werden die Klassen auch weiterentwickelt und es soll später noch mehr Formatierungsoptionen geben. Auch gibt es bereits im Moment mehrere Zugriffsmethoden auf die Dokumente:

  • Cursor - Mit dem Cursor kannst du einzelne Zellen der Excel Datei dynamisch Lesen und Schreiben. Über das Visitor Pattern besteht Zugriff auf die Inhalte.

 

Für die anderen Methoden findest du noch weitere Beispiele in der unten verlinkten Dokumentation.

 

Vollständiges Beispiel

Hier findest du das vollständige Beispiel aus dem Artikel. In der Klasse sind die verschiedenen gezeigten Beispiele, sowie die Beispiel-Excel Datei als Stream, sodass du direkt starten kannst.

CLASS zcl_bs_demo_xco_excel DEFINITION
  PUBLIC FINAL
  CREATE PUBLIC.

  PUBLIC SECTION.
    INTERFACES if_oo_adt_classrun.

  PRIVATE SECTION.
    TYPES: BEGIN OF ts_users,
             user_id   TYPE string,
             user_name TYPE string,
             user_mail TYPE string,
           END OF ts_users.
    TYPES tt_users TYPE STANDARD TABLE OF ts_users WITH EMPTY KEY.

    TYPES: BEGIN OF ts_parts,
             dummy   TYPE string,
             country TYPE string,
             ranking TYPE string,
           END OF ts_parts.
    TYPES tt_parts TYPE STANDARD TABLE OF ts_parts WITH EMPTY KEY.

    CONSTANTS: BEGIN OF cs_sheets,
                 currency TYPE string VALUE `Currency`,
                 country  TYPE string VALUE `Country`,
                 users    TYPE string VALUE `Users`,
               END OF cs_sheets.

    CONSTANTS c_sender   TYPE cl_bcs_mail_message=>ty_address VALUE ''.
    CONSTANTS c_receiver TYPE cl_bcs_mail_message=>ty_address VALUE ''.

    METHODS get_dummy_excel_stream
      RETURNING VALUE(rd_result) TYPE xstring.

    METHODS get_all_from_sheet.

    METHODS get_part_from_sheet.

    METHODS write_document.

    METHODS get_worksheet_infos
      IMPORTING io_out TYPE REF TO if_oo_adt_classrun_out.

    METHODS send_test_email
      IMPORTING id_excel TYPE xstring.

    METHODS give_the_sheet_style
      IMPORTING io_sheet TYPE REF TO if_xco_xlsx_wa_worksheet.
ENDCLASS.


CLASS zcl_bs_demo_xco_excel IMPLEMENTATION.
  METHOD if_oo_adt_classrun~main.
    get_worksheet_infos( out ).
    get_all_from_sheet( ).
    get_part_from_sheet( ).
    write_document( ).
  ENDMETHOD.


  METHOD get_all_from_sheet.
    DATA lt_users TYPE tt_users.

    DATA(ld_stream) = get_dummy_excel_stream( ).
    DATA(lo_document) = xco_cp_xlsx=>document->for_file_content( ld_stream )->read_access( ).
    DATA(lo_sheet) = lo_document->get_workbook( )->worksheet->for_name( cs_sheets-users ).

    DATA(lo_pattern) = xco_cp_xlsx_selection=>pattern_builder->simple_from_to( )->get_pattern( ).

    DATA(lo_result) = lo_sheet->select( lo_pattern
      )->row_stream(
      )->operation->write_to( REF #( lt_users )
      )->set_value_transformation( xco_cp_xlsx_read_access=>value_transformation->string_value
      )->execute( ).

    IF lo_result->succeeded = abap_false.
      LOOP AT lo_result->messages INTO DATA(lo_message).
      ENDLOOP.
    ENDIF.
  ENDMETHOD.


  METHOD get_part_from_sheet.
    DATA lt_parts TYPE tt_parts.

    DATA(ld_stream) = get_dummy_excel_stream( ).
    DATA(lo_document) = xco_cp_xlsx=>document->for_file_content( ld_stream )->read_access( ).
    DATA(lo_sheet) = lo_document->get_workbook( )->worksheet->for_name( cs_sheets-currency ).

    DATA(lo_pattern) = xco_cp_xlsx_selection=>pattern_builder->simple_from_to(
      )->from_column( xco_cp_xlsx=>coordinate->for_alphabetic_value( 'B' )
      )->to_column( xco_cp_xlsx=>coordinate->for_alphabetic_value( 'C' )
      )->from_row( xco_cp_xlsx=>coordinate->for_numeric_value( 2 )
      )->get_pattern( ).

    lo_sheet->select( lo_pattern
      )->row_stream(
      )->operation->write_to( REF #( lt_parts )
      )->set_value_transformation( xco_cp_xlsx_read_access=>value_transformation->string_value
      )->execute( ).
  ENDMETHOD.


  METHOD get_worksheet_infos.
    DATA(ld_stream) = get_dummy_excel_stream( ).

    DATA(lo_document) = xco_cp_xlsx=>document->for_file_content( ld_stream )->read_access( ).

    LOOP AT lo_document->get_workbook( )->worksheet->all->get( ) INTO DATA(lo_sheet).
      io_out->write( lo_sheet->get_name( ) ).
    ENDLOOP.

    lo_sheet = lo_document->get_workbook( )->worksheet->at_position( 2 ).
    io_out->write( lo_sheet->get_name( ) ).

    lo_sheet = lo_document->get_workbook( )->worksheet->for_name( cs_sheets-users ).
    io_out->write( lo_sheet->get_name( ) ).

    lo_sheet = lo_document->get_workbook( )->worksheet->at_position( 4 ).
    IF NOT lo_sheet->exists( ).
      io_out->write( |Sheet not found| ).
    ENDIF.
  ENDMETHOD.


  METHOD write_document.
    DATA(lt_users) = VALUE tt_users( ( user_id = 'User ID' user_name = 'First Name' user_mail = 'Mail address' )
                                     ( user_id = '04567' user_name = 'Chuck' user_mail = 'chuck@outlook.com' )
                                     ( user_id = '12541' user_name = 'Terence' user_mail = 'terence@outlook.com' )
                                     ( user_id = '24470' user_name = 'Emily' user_mail = 'emily@outlook.com' ) ).

    DATA(lo_document) = xco_cp_xlsx=>document->empty( )->write_access( ).

    lo_document->get_workbook( )->add_new_sheet( `Made with ABAP` ).
    DATA(lo_sheet) = lo_document->get_workbook( )->worksheet->at_position( 2 ).

    DATA(lo_pattern) = xco_cp_xlsx_selection=>pattern_builder->simple_from_to( )->get_pattern( ).

    lo_sheet->select( lo_pattern
      )->row_stream(
      )->operation->write_from( REF #( lt_users )
      )->execute( ).

    give_the_sheet_style( lo_sheet ).

    DATA(ld_excel) = lo_document->get_file_content( ).

    send_test_email( ld_excel ).
  ENDMETHOD.


  METHOD give_the_sheet_style.
    TYPES to_color TYPE REF TO cl_xco_xlsx_color.
    DATA lt_color TYPE STANDARD TABLE OF to_color WITH EMPTY KEY.

    lt_color = VALUE #( ( xco_cp_xlsx=>color->standard->blue )
                        ( xco_cp_xlsx=>color->standard->light_blue )
                        ( xco_cp_xlsx=>color->standard->orange ) ).

    DATA(lo_cursor) = io_sheet->cursor( io_column = xco_cp_xlsx=>coordinate->for_alphabetic_value( 'A' )
                                        io_row    = xco_cp_xlsx=>coordinate->for_numeric_value( 1 ) ).

    LOOP AT lt_color INTO DATA(lo_color).
      DATA(lo_cell) = lo_cursor->get_cell( ).
      lo_cell->apply_styles( VALUE #( ( xco_cp_xlsx=>style->fill( )->set_background_color( lo_color ) ) ) ).
      lo_cursor->move_right( ).
    ENDLOOP.

    io_sheet->protect( )->set_select_locked_cells( ).

    lo_cursor = io_sheet->cursor( io_column = xco_cp_xlsx=>coordinate->for_alphabetic_value( 'B' )
                                  io_row    = xco_cp_xlsx=>coordinate->for_numeric_value( 2 ) ).

    DATA(lo_validation) = xco_cp_xlsx=>data_validation_type->if_xco_xlsx_dat_val_type_f~list(
      )->add_source( `Chuck`
      )->add_source( `Terence`
      )->add_source( `Emily`
      )->add_source( `Bob` ).

    DO 3 TIMES.
      lo_cell = lo_cursor->get_cell( ).
      lo_cell->data_validation->set_type( lo_validation ).
      lo_cell->apply_styles( VALUE #( ( xco_cp_xlsx=>style->protection( )->set_locked( abap_false ) ) ) ).
      lo_cursor->move_down( ).
    ENDDO.
  ENDMETHOD.


  METHOD send_test_email.
    TRY.
        DATA(lo_mail) = cl_bcs_mail_message=>create_instance( ).

        lo_mail->set_sender( c_sender ).
        lo_mail->add_recipient( c_receiver ).

        lo_mail->set_subject( 'New Excel File' ).

        lo_mail->set_main( cl_bcs_mail_textpart=>create_instance(
                               iv_content      = '<h1>Hello,</h1><p>here you fresh printed Excel File</p>'
                               iv_content_type = 'text/html' ) ).

        lo_mail->add_attachment(
            cl_bcs_mail_binarypart=>create_instance(
                iv_content      = id_excel
                iv_content_type = `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`
                iv_filename     = `My-generated-Excel.xlsx` ) ).

        lo_mail->send( ).
      CATCH cx_bcs_mail.
    ENDTRY.
  ENDMETHOD.


  METHOD get_dummy_excel_stream.
    RETURN |504B0304140006000800000021007C6C981669010000A0050000130008025B436F6E74656E745F54797065735D2E786D6C20A2040228A00002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CC94DF6AC23014C6EF077B8792DBD1441D8C31AC5EECCFE526CC3D40D69CDA609A849CE8F4ED771A758CD129A2B| &&
|0DD34B4C9F9BE5F4F926F385E35265B4240ED6CC1FABCC732B0A553DACE0AF6367DCA6F5986515A258DB350B035201B8F2E2F86D3B507CCA8DA62C1EA18FD9D1058D6D048E4CE83A599CA8546467A0D33E16539973310835EEF4694CE46B0318FAD061B0D1FA0920B13B3C7157DDE900430C8B2FBCDC2D6AB60D27BA| &&
|34B1989542CADFAE1926F1D3855A635586B8F5784C144A7433BF3BBC1B6EE855A13B4826C22437C960D618895111F2ECCDF9D9BF3FD221D94AEAA7409CA958B863AC0D107900A6B80D8189E46DE486D77DC7BFCD3621469E89F19A4FDBF247C24C7E09F705CFF1147A4F30F223D4FDF922473600330AE0DE0B98F611| &&
|23DE45CCB00EA35064A8AB3037CD7DEC741F768129C474A9400C7776117196D75EE490842D4F0151A5D97EFCB91D2E8E4B6439B770A5487B748F93AFA040000FFFF0300504B030414000600080000002100B5553023F40000004C0200000B0008025F72656C732F2E72656C7320A2040228A00002000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000AC924D4FC3300C86EF48FC87C8F7D5DD9010424B774148BB21547E8049DC0FB58DA3241BDDBF271C10541A8303477FBD7EFCCADBDD3C8DEAC821F6E234AC8B12143B23B677AD8697FA7175072A2672964671ACE1C41176D5F5D5F699474A792876BD8F2AABB8A8A14BC9DF2346D3F144B110CF2| &&
|E571A0913A51C86163D99815AC64D59DE62F8AE01D54253EDAD86B0B737A0EA93CF9B7FD796A6E90D3F88394CECD29915C8736267D9AE7CC86C21F5F91A5553683969B0629E723A22795F646CC0F3449BBF13FD7C2D4E9CC852223412F832CF47C725A0F57F5AB434F1CB9D79C43709C3ABC8F0C9828B1FA8DE01000| &&
|0FFFF0300504B030414000600080000002100E1A418B49C030000240900000F000000786C2F776F726B626F6F6B2E786D6CAC556D6BE33810FE7E70FFC1E8BB6BC96F714CD3257E09576897D2CDB6775028AAADD4A2B69593E526A5EC7FDF9112A7E9E638B2DD0D891449E347CFCC3C333EFDB46E6AEB99C98E8B768| &&
|2C80946166B0B51F2F67182BECE677684AC4ED1B6A4B568D904BDB00E7D3AFBF38FD395904F0F423C5900D076135429B58C1DA72B2AD6D0EE442C590B270B211BAA60291F9D6E29192DBB8A31D5D48E8B71E83494B7688310CB6330C462C10B9689A26F58AB362092D55401FDAEE2CB6E406B8A63E01A2A9FFAA55D8| &&
|86609100FBCE6EAC58022AB29E2F3C75648FA5083DB6B12586B09DF107E04C3E00E37C1D1C1550D2FA4E8C4429D00B4B3217DE03FC10E21EF42B03E8CC17148BE23D933D739DCB192E10759853BACF00D8CE05F4623202DA3951882F741B460C7CD4567A70B5EB39B8D742DBA5C7EA68DCE548DAC9A762A2FB962E50| &&
|48D602956ECDD86EC9749CF6B3875C391479073B693F395B44AB6A07DADE620E4011E2A230CC76EA02D4118D35A31D952C552D12AD0E1D6AF5FD59CC14E2B010AB7AED9BF3D970C0A0BF405BEC2488B983E74575455562FEB094AE3BBAF1DB87F4789876950DE6562D5D6024AEC6E4F9BF4B0107E429DB4D02E3BE0F| &&
|386D7E6FF8FFE033D190F0ABC52D282FFE7D90564E10B7D869C40E6CB6DC99E43D08977DF163226F7AFE3C8CFC2284CED08A753DB8F82C01E876E02CB3126DE2CC26E84BF8133328C0B417B556DD3ADA127C887DC1E1C5DD2F5704270DCF3F28DC62BDE7E6C3DFF300C67DFB4C3BAB1DD70B6EADE84A197D6FA96B7A| &&
|5584D50E4FB01B25E8665E885E0E3CA1CDEF25255E0A44B30986CF6FE62FCB102C6048F7C5D06D2D5CC26E8354CA7AE1B06399019CD6C3F88423B9966B93D4AF324224112A46E6818397B944C0B056A66B65A23FBB497121AF70B746BDD604D989125637D8B3C2F8DC6DFD98BBE5572DF1C1ADACEDCD541D8373742D| &&
|BC3F6F68C3D2391815441EB028A484F86C4986077AC2DD85A5D74CACCA05F0ECE131F4F4778ECDB38F702C8FED8B523DF73EDD4CFDC3C18E5599E043AFBFA0513FF8E366BCA281EDE5C9A6545A59A4B5A3CC1FBEE9A2D12DA815C4DB01CE0BB4F3609A2047B40D19F11C81419633B4942DF0EB299178C4896E6C1EC8| &&
|DAC767FF1C1261739E66946550F0D40D7BE59C77A9C6D77779B8BCDC65605EF2A3BBECE74DCB74FFF9FE117F0BE66471ACF6E8E344C3F5FCE2F8FB4BDC8E7F7B7B3638DA79749363DDE7E7A7D3DFD679EFF3D5CE1FC67403709D7A391A933C8E4EC3B000000FFFF0300504B030414000600080000002100DE09FD280| &&
|2010000D40300001A000801786C2F5F72656C732F776F726B626F6F6B2E786D6C2E72656C7320A2040128A000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BC93CF6AC3300CC6EF83BD83D17D71926E65943ABD8C41AF5BF7002651E2D0C43696F6276F3F9343BA40C92EA1178324FC7D3FD0A7FDE1A7EFC417066A9D5590252908B4A5AB5| &&
|ADB28F838BD3E3C8320D6B6D29DB3A860408243717FB77FC34E73FC44A6F524A28A250586D9EFA4A4D260AF29711E6D9CD42EF49A63191AE97579D60DCA3C4DB732FCD58062A6298E958270AC36204E838FCEFF6BBBBA6E4B7C71E5678F96AF58C86F17CE6410398AEAD0202B985A24C7C92689C420AFC3E43786C99| &&
|760B21BC3644B30DB3561C8E880D53B879842BAAC6AD65E82795A1586872E867E0A0C8DF592FDE39AF61C4F092FEE6329C777DA879CDD62F10B0000FFFF0300504B0304140006000800000021002B250CDA0B0300007807000018000000786C2F776F726B7368656574732F7368656574312E786D6C9C93DB8EDA301| &&
|086EF2BF51D2CDF87C421592022AC0A61D5BDAB7ABC36CE8458D8716A9BC3AAEABB77620ABB123768A51C2663FBFB67E2DFF3C79356E400D649D395948D124AA013A696DDB6A43FBE3F45534A9CE75DCD95E9A0A42FE0E8E3E2E387F9D1D89D6B013C4142E74ADA7ADF1771EC440B9ABB91E9A1C391C658CD3D7EDA6| &&
|DEC7A0BBC0E8BB48AD324798835971D3D130A7B0FC3348D145019B1D7D0F933C482E21EEB77ADECDD85A6C53D38CDED6EDF47C2E81E111BA9A47F09504AB4289EB79DB17CA3B0EF13CBB820278B578AF7F82213F2374A5A0A6B9C69FC08C9F1B9E6DBF667F12CE6E24ABAEDFF2E0CCB620B07396CE02B2A7D5F492CB| &&
|FB2D257D8F89DB0872B6CF85DB6D8CBBAA47FAA69C5962CCFA32C9F4CA28CADF268B95C271163CB6CBD9C26ABD5A4FA4B17F35AE20E0F5D110B4D493FB1A2CA69BC9807FFFC9470746F62E2F9E61B28101E50835132D87363CC6E98F88CA904892E4C18885C787980152855D2F50C1DFE3B68608802F155E16D7C517| &&
|B0A86FE62C9863B5819F54BD6BE45493C3835347CAFFC5773FC0C72DB7ACCE6D8F8E09CA27EA9C009B42C96324A4323C22884E2936889672F43CBF153781FFF33D3513E49C60CA713B177DEE88B582833ACFF070000FFFF000000FFFF9493DD0E82300C465F85EC011C83E10F194BD4BDC8329778858611D4B7B7809| &&
|9A57189DC31CED7E4ACED54B87ADF1BDB5BADBADB23EB1A265816EEB60DF0554B963D85B4AEBEBC8C0FCEB77DC3F24D5131ADDC983D42187E05380F3A577CD08ABB0F3B612696EC8C59B16406B332320E7AD1B158E308E1E82889236615712CA65B09722D834B76BFF5CA357A104EEA61B6257AE5A447A40DAE48D8C| &&
|150FF1F3084A3DD9E340F33DA3C39378F8C165724ECAA3576104EDA617620BD1B1778D064290DAE40639F378F7F5FCA1B0000FFFF000000FFFFB229484C4FF54D2C4ACFCC2B56C8494D2BB15532D033575228CA4CCF80B14BF20BC0A216E6260686A6E626961060A6A490945F52929F8B433223353125B5082469ACA| &&
|490969F5F02E3E8DBD9E897E717651767A4A696D801000000FFFF0300504B030414000600080000002100F65023F5960200004B05000018000000786C2F776F726B7368656574732F7368656574322E786D6C9C934B6FA3301485F723F53F58DE130309E904855409B49AEE46A379AC1D730956FCA0B6F3D268FEFB5| &&
|C889256CA26AA84C5C516DF3DC73E9E3F1DB5227B705E5A53D06414530246D85A9A4D417FFD7C89BE52E203373557D640414FE0E9D3E2E1CBFC60DDD6B7008120C1F882B6217439635EB4A0B91FD90E0CAE34D6691EF0D36D98EF1CF07AF8492B96C6F194692E0D3D1372770FC3368D145059B1D360C219E240F180F| &&
|A7D2B3B7FA169710F4E73B7DD7591B0BA43C45A2A194E0394122DF2D78DB18EAF15FA3E26132EC8D1E193E2185FDA0CF3379DB414CE7ADB841192D959F3ADFD199B312EAEA45BFF7761920973B097FD01BEA3D2CF494AB22B2B7D878D3F099B5E61FD76B97C27EB82FE8DE3A4AAB2E7348ACBC7C768522ECB68B99AA| &&
|EA2B89AADCA2C9E94D5F3F81F5DCC6B8927DCBB220E9A822E937C35A66C311FF2F35BC2C17FA8491FC7B5B5DB7EE115DBC448F0A040F4C1201C5F7B2841A9829628C6BF0D4C2C11C8AEC48FF585FE3204F8BB236BEEA1B4EA8FAC438B37052F4A0D0DDFA9F0C31EBE81DCB401673334DA2725AF4F157881114529A33| &&
|4C33EFF010000FFFF000000FFFF94D0410AC3201085E1ABC81CA0763459344C84965C44ACD0555A3292B6B7EF14825157ED4EFD1F7C20F12DC634F9E41D2DF7A75A464050FCF033CB6930A05ED8F9305CDF53E410E734C2F1607A7014BEDBB38CE589E5BE3A24BD3AD2616B97AAED518B9331017EC7649CB1BEC1CA8| &&
|626C70AB3FF6032CED8A9C1CA86B6C1F4FEA51F000000FFFF000000FFFFB229484C4FF54D2C4ACFCC2B56C8494D2BB15532D033575228CA4CCF80B14BF20BC0A216E6260686A6E626961060A6A490945F52929F8B433223353125B5082469ACA490969F5F02E3E8DBD9E897E717651767A4A696D801000000FFFF030| &&
|0504B0304140006000800000021007A13C7B6A10300006E08000018000000786C2F776F726B7368656574732F7368656574332E786D6C9C934D8FDA301086EF95FA1F2CDF832109814484D50245DD5BB5EAC7D938136261C7A96DBE54F5BF77620ABB1217B452124F6CF99977EC77664F27ADC801AC93A62DE96830A| &&
|4045A612AD96E4BFAE3FB3A9A52E23C6F2BAE4C0B253D83A34FF3CF9F66476377AE01F00409AD2B69E37D5730E644039ABB81E9A0C595DA58CD3DFEDA2D739D055E854D5AB17838CC98E6B2A51742611F6198BA96025646EC35B4FE02B1A0B847FDAE919DBBD2B47804A7B9DDEDBB4818DD21622395F4E700A5448BE| &&
|265DB1ACB370AEB3E8D522EC8C9E213E39B5CD384F9BB4C5A0A6B9CA9FD00C9ECA2F9BEFC9CE58C8B1BE9BEFE8730A3945938C8FE02DF50F1C7248DC63756FC064B3E08CB6EB0FEB86CB1975549FFE4CFD93219AFB2289D6649944E166994AF278B68B11C27ABC9349F6693F42F9DCF2A8937DC57452CD4257D1E15C| &&
|B3165F359F0CF4F0947F72E26BD1D37C6ECFA85174C3344820305A23706E1381C60094A95F4CB181DFD3B30314420BB11DFC757FA3A18F89B251BEE6069D42F59F9063B051BA5829AEF957F35C7AF20B78DC75964074714D579054EA04551CA200E79845108C52FD1127B0DCF44F353188FFF99D86B62EFBCD1D7244| &&
|15ED8F70F0000FFFF000000FFFF94D25B0E82301005D0AD902EC0D2017C90D24461234D6DE2171A4A5077EF540D432731913FE00E99D39BEA70F17EECEC688D1EAEF76C68841259B8D93EE0535D88ECA14AEBEAF3B3F3C1F97E6C44BE814A18EDE2EC1187F153C0F7C9A852CBC968E9BEE12909AB346C93703B87121| &&
|53305D6507098283B465986A01825AE799F7BFE1F489B80B08FFFBBC16102ED1968190230505CC3403F1A2AD78070984007065A865030505CC340D470D250B50684C35479CE4049C8AE561BD7301035FC0149BADA2F000000FFFF000000FFFF74D0C96AC3301000D05F31BA4FA36DB48438204B31F4D08F4889BC90C| &&
|54171694BE9BF57498931349DD32CF0869955F7798EE9D09FF697F56ACA8B149B92784E8AB4EC772549CF3B468A8FB47CBB565FC122B5CC39A0810B905633301A29B85A32C5790834A86FB2F80B8A1998F109D45E48E69502E73323A5675029C781F21AAD44CD9CC287A09C81199F40EE6BE44E18402A39481D2858A| &&
|C322D9CA8F32EB6A1E221883330E31368ACD75499004A86EA0A5A30B8E15055683D7A8BC6F01BB8983FF4BC6DE3CB36B5FDE9521C623396843EE9BCA16FBB7B3E0EE75BD76849196A697F4391E27518C7E1F8CFB08BDB5D4CD7613EBB1986F15EE4AF2FDE87B4BF74318EEB1F000000FFFF0300504B0304140006000| &&
|80000002100580737E94E070000C020000013000000786C2F7468656D652F7468656D65312E786D6CEC59CD8B1B3714BF17FA3F0C7377FC35E38F25DEE0CF6C93DD24649D941CB5B6EC5156333292BC1B13022539F55228A4A597426F3D94D240030DBDF48F0924B4E91FD127CDD823ADE5249B6C4A5A760D8B47FEB| &&
|DA7A7F79E7E7AF374F1D2BD987A47980BC292965FBE50F23D9C8CD89824D3967F6B3828347C4F48948C1165096EF90B2CFC4BDB9F7E72116DC908C7D803F9446CA1961F4939DB2A16C5088691B8C0663881DF268CC748C2239F16C71C1D83DE98162BA552AD182392F85E8262507B7D322123EC6F2FD5F629E84EA45| &&
|00323CAF79552BC8E1D1F9615422C449772EF08D1960F338CD9F110DF93BE479190F043CB2FE93FBFB87DB188B632212A37C81A7203FD97C96502E3C38A9E934F0F5693064118D4DA2BFD1A40E53AAE5FEFD7FAB5953E0D40A311AC34B5C5D659AF74830C6B80D2AF0EDDBD7AAF5AB6F086FEEA9ACDED507D2CBC06A| &&
|5FA8335FC60D0052F5A780D4AF1E11A3EEC343B3D5BBF06A5F8DA1ABE5E6AF782BAA55F83224A92C3357429AC55BBCBD5AE201346779CF066180CEA954C798E826C5865979A62C212B929D7627497F1010014902249124F2E6678824690BF5D44C90127DE2E9946907833943001C3A54A6950AAC27FF509F4371D51B| &&
|4859121ADEC024BC4DA90B2C713234E66B2E55F01ADBE0179F1ECD9F3874F9F3FFCEDF9A347CF1FFE92CDAD5559723B28999A72AF7EFCFAEFEFBFF0FEFAF587578FBF49A73E891726FEE5CF5FBEFCFD8FD7A98715E7AE78F1ED93974F9FBCF8EEAB3F7F7AECD0DEE6E8C0840F498C85770D1F7B37590C0B74D88F0FF| &&
|8E92486112296048A40B743755F4616F0DA025117AE836D17DEE6C0322EE0E5F95DCBD6FD88CF2571CC7C358A2DE01E63B4C3B8D30157D55C868787F364EA9E9CCF4DDC4D848E5C7377516205B83F9F01BD1297CA6E842D336F50944834C509969EFA8D1D62EC58DD1D422CBFEE911167824DA47787781D449C2E199| &&
|2032B9172A11D12435C162E0321D4966FF66E7B1D465DABEEE1231B09DB025187F1434C2D375E4673896297CA218AA9E9F05D24239791FB0B3E32717D2121D2534C99D71F63215C32D739ACD708FA55601877D8F7E822B6915C924397CE5DC49889ECB1C36E84E299D366924426F6337108298ABC1B4CBAE07BCCDE2| &&
|1EA19E280928DE1BE4DB015EE3713C12D2057D3A43C41D42F73EE88E565CCECFDB8A013845D2CD3E6B1C5AE6D4E9CD9D1994FADD4DEC598A26334C6D8BBF599C3820E9B593ECF8DBE1201ABEC6057625D4176AEAAE7040BECE9BA669D227789B052761F4FD9067BF616278867819218F14D9AAF41D4ADD48553CE49A| &&
|5D7E9E8D0045E2350F841BE389D725D800E23B9FB9BB4DE88907576A967E1CED705B7E2F7367B0CF6E5DDD3EE4B90C1A79601627F6BDF0C11B526C8136688A0C070D12D8858E1CF45D4B9AAC5E64EB989BD69F330406164D53B3149DE58FC9C287BC27FA7EC7117306750F0B815BF4FA9B38952764E14389B70FFC1B| &&
|2A687E6C90D0C27C93A679D5735E7558DFFBFAF6A36EDE5F35AE6BC9639AF655C6F5F1FA496C9CB17A86CF22E8FEEF9C41B5B3E1342E9BE5C50BC2B74D747C01BCD780083BA1DA57B92AB16E02C82AF5983C9C24D39D2321E67F27322A3FD08CDA03554D6CDCEA9C8544F853763023A467A583751F109DDBAEF348FF| &&
|7D838ED7496CBAAAB99BA5020998F97C2D53874A9648AAED5F3EEDD4ABDEE874E7597756980923D8D11C664B611558711F5E52044E17546E8959D89154D87150DA57E19AA651457AE00D3565181576E0F5ED45B7E18A41D6468C641793E56714A9BC9CBE8AAE09C69A43739939A190025F63203F2483795AD1B97A75| &&
|697A6DA5B44DA32C24837DB08230D237811CEB2D36CB99F65AC9B79482DF3942B96BB2137A3DEF810B1562472821B686232054DBCE3965FAB86709F3242B3963F818E317C8D67903B42BD75213A850B9791E4E9867F17669971217B4844A9C335E9A46C101389B94749DCF2D5F257D94013CD21DAB6720508E1A335A| &&
|E09B4F2B1190741B7838C27133C9266D88D11E5E9F411183EE50AE7AF5AFCDDC14A92CD21DCFBD1F8D83BA0737E13418A85F5B272E09808B83828A7DE1C13B8095B11599E7F270EA68C76CDAB289D43E938A2B30865278A49E6295C93E8CA1CFDB4F281F194AD191CBAEEC283A93A60DFFBD47DF351AD3C6790667E6| &&
|65AACA24E4D37997EB843DEB02A3F442DAB52EAD6EFD422E7BAE692EB20519DA7C41B4EDDB738100CD3F2C92CD394C5EB34AC383B1BB54D3BC382C0F0446D83DF566784D313EF7AF283DCC9AC5507C4B2AED489AF2FCBCD5B6D767017C8A307F787732A850E25DC597304455F7A0399D2066C917B32AB11E19B37E7A| &&
|4E5DF2F85EDA05B09BB855223EC17826A502A34C276B5D00EC36AB91F964BBD4EE5011C2C328ACB617A513F802B0CBAC8AEEBF5F8DA957DBCBCA5B930627191E92BF9A2365C5FD9972B8E2B7B6FA86EE67D8F00E9DCAF5506CD6AB3532B34ABED4121E8751A8566B7D629F46ADD7A6FD0EB868DE6E081EF1D6970D0A| &&
|E76835ABF51A895BBDD42502B29F31BCD423DA854DA41BDDDE807ED075919032B4FE923F305B857DBB5FD0F000000FFFF0300504B030414000600080000002100DBDAAE23F9020000940700000D000000786C2F7374796C65732E786D6CA4555D6F9B30147D9FB4FF80FC4E0D34644904544D53A44ADD54299DB4570| &&
|74C62D51FC8988C6CDA7FDFB5090D5DB76E6B5F827DED7B7CCEFD4A72D109EEEDA96E9892290ACF02E45159A892C96D8A3EDFE7FE0C798D21B2245C499AA2036DD045F6FE5DD29803A7EB1DA5C60308D9A468674CBDC0B829765490E64CD554C249A5B42006B67A8B9B5A535236D649701C05C1140BC224EA1116A2F| &&
|8171041F4435BFB851235316CC338330787853C512C6EB65269B2E140B50B27A4F0BA70AA23AFD3C323CEFAEC1DC10AAD1A559933C0C5AAAA58419FD39DE33926C50909905F8714C638889E68EFF42B912658D33DB3E943595229691AAF50AD34298A80A80DC1E241AAAF32B74790E1E3AD2C69BE797BC2C112229C2| &&
|585E24A7B0652079173164904ED6F5C11CE369AD96B15118C1F7A73640DD83ED93F9C252D185E820DACC77FE13AF806F019E72361BD214BA0020CD5328753EFB8BE3FD4A04042B1F6F4E0E8AFB7B79A1CC2281E3960F760966C942EA1398690DAE8F5A62CE1B4322047B3EDCE7E8DAAE177A38C8102CA929291AD928| &&
|4DB100D1EC705C82928E76BDB405FAA27AABACA93ADC885B9295304AD68833B2C41C871D9E3F51BC0FF935308FEBF77F2485DF3C3A7566CA8CE5D7FBAD79CD5C6F2B45B3AFDA7FD25675B29A82D2FA0E71CEEB432B4306E7EB804E3B1BA5EEB9B657A5DF516BDBDB72B6BC70EF88C92F024058FE43D5BA829BA65F20| &&
|11AC93D0F11DDB48C1B262D9999EB9B2193C7EB6B372B7539B84094462EBFC4074894DDA902DCA9B1C3CBD5C6232DC02869455A6EEE1F0F53745A7FA4256B05B4FBF1D61DDB2BE32052745ADFDA420DA79634EDCC6D035D0B5FAFD52C45DFAF971FE6ABEB3CF267C172E64FCE69ECCFE3E5CA8F2757CBD52A9F07517| &&
|0F5633442DF3040DDC487AA0D278B86C398D547B147F2EB932D45A34D4FDFB528D01E739F47D3E0320E033F3F0F427F3225337F363D8FFD3C0EA3D574B2BC8EF378C43D7EE5A00D7018F623DB928F178609CA991C723564686C8524C1F6051178C8043EFD9D663F010000FFFF0300504B03041400060008000000210| &&
|02A04FEC53D0100003603000014000000786C2F736861726564537472696E67732E786D6C7492CB4EC3301045F748FC83E53D751F50A04A5CE80B214117857C807186C66A3C0EB653E8DFE3085676BAF4B93377EE8C9CCD7F744D8E609D3298D3D1604809A034A5C27D4E8BF7CDD51D25CE0B2C456D10727A0247E7F| &&
|CF22273CE93D08B2EA795F7CD8C31272BD0C20D4C0318944F63B5F0E169F7CC351644E92A00AF6B361E0EA74C0B859448D3A2CFE9E4969216D5570BCB3F30BEA73C738A679E2F5B6B43A453C63CCF58C7FE79576963DC659AB946C890350C75608F40F94EE0216C44628F2D7CB3A229858758795CAF62B45AC764F39| &&
|C18C6605DEC92AE8414898DD049A22708F7C4E40C1B2B5026C545589C3C272B7478DBE3FD2A549DDC77311A4FFAE0751FBCE983D3642F250F315B00C6E84D5851C5F0054C5288C1EF611FBE523D9046C71D1F80E745D7CD382FD7615A9FCAC2BFE7BF000000FFFF0300504B0304140006000800000021009C7CFD5AE| &&
|E0000002903000023000000786C2F776F726B7368656574732F5F72656C732F7368656574332E786D6C2E72656C73BC92C14A03311086EF82EF10E6EE665B45A434DB1E54E8C18BD40718B3B3BB6193992589D2BEBDF1205828283DEC71F899EFFF1866BD3904AF3E2926276C6051D5A088ADB48E7B036FFBE79B075| &&
|02923B7E885C9C091126C9AEBABF52B79CC65290D6E4AAA50381918729E565A273B50C054C9445C924E62C05CC6D8EB09ED883DE9655DDFEBF89B01CD0953ED5A0371D7DE82DA1FA7D2FC375BBACE597A14FB1188F3990A3D1452F48EC702C5D8533610D0F92CAB8411876DFF3D5556C24FFE226DA97E3A648A8C1EF| &&
|479C7E53C8EEFC4971A2EE6316467C74B15EFE651F424FFBAA23E79F0E60B0000FFFF0300504B030414000600080000002100DABEDF814D0100006D02000011000801646F6350726F70732F636F72652E786D6C20A2040128A0000100000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008C924D4EC3301484F748DC21F29AC47152FEAC24950AEA8A4| &&
|A481481D859F66B1B881DCB7649CBC1B80017C349DA5054162CED99F779E6C9D97823ABE01D8C2D6B952312C52800C56B51AA658E1EE7D3F00A05D6312558552BC8D1162C1A17A72719D794D706EE4DADC1B8126CE049CA52AE73B4724E538C2D5F816436F20EE5C5456D2473FE68965833FEC696809338BEC0121C1| &&
|3CC31DC02433D10D10E29F880D46B537500C131542041398B4944F08FD78191F6CF814E3970CAD26DB5EFB48B7BC816BC1707F7C69683B1699AA849BB183E3FC1CFB3BB87AE6A58AA76571C5091094EB901E66A5378715D7D9C0593D7AF4FA3327C20B56BAC987533BFF1450962B23D721F3B3CBBABD23F0022F0E16| &&
|85F65AF3CA537B7F3292A923819858484249E93948EAE29B97C6903FC9A6FC3F6177217E39FC4739A26341E1D10F78022C3471FA4F8060000FFFF0300504B030414000600080000002100465A0753AB0100006603000010000801646F6350726F70732F6170702E786D6C20A2040128A000010000000000000000000| &&
|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000| &&
|000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009C9| &&
|3C16EDB300C86EF03F60E86EE8DDCA62886405651B81B7A68B100717A57643A11264B86C418719F676FB2171B6DA38EB3F6B41BC99FFEFD49A4C4FDA9B6490B211AEF3276BD4859024EFBD2B87DC6B6C58FAB6F2C89A85CA9AC7790B10E22BB975FBF8875F00D04341013B270316307C466C579D407A8555C90EC48A| &&
|97CA815521AF6DC5795D1F0E8F5B10687FC264DEF389C105C09E5553319B2D171D5E2FF9A965EF77CF1B5E81A0296A2F0A86C616A90A9E0E7443C348D355A219D5EBE181D7CF41526DF4F1AACE0735110F506F43118EC7A8F792A365A59C8E987B2523682E0E7827802D55FE65A9910A56871D582461F9268DEE83A6| &&
|F58B253117ACC8CB52A18E59070FBB6311962DB440CF221ECC060DCD93FBF1121084E5DA33284F30FE6B1B995CBA18182CBC6DE60A421E192B3306821FEACD62AE027D8CB39F6C030428F38F931045AA26E4E38B1E6FEE8307CAE6D232DE287730DF74584FF30E5BE6E94EB4898A267E37EC56D53F84785F03E8BCBA| &&
|2D81C548092C637CD6A2A88271A43B0BD497E506E0FE57BCF47A1DF9CD7F1D9C8EBBB45BA4C69296635C1CF0F44FE050000FFFF0300504B01022D00140006000800000021007C6C981669010000A00500001300000000000000000000000000000000005B436F6E74656E745F54797065735D2E786D6C504B01022D0| &&
|014000600080000002100B5553023F40000004C0200000B00000000000000000000000000A20300005F72656C732F2E72656C73504B01022D0014000600080000002100E1A418B49C030000240900000F00000000000000000000000000C7060000786C2F776F726B626F6F6B2E786D6C504B01022D0014000600080| &&
|000002100DE09FD2802010000D40300001A00000000000000000000000000900A0000786C2F5F72656C732F776F726B626F6F6B2E786D6C2E72656C73504B01022D00140006000800000021002B250CDA0B030000780700001800000000000000000000000000D20C0000786C2F776F726B7368656574732F7368656| &&
|574312E786D6C504B01022D0014000600080000002100F65023F5960200004B050000180000000000000000000000000013100000786C2F776F726B7368656574732F7368656574322E786D6C504B01022D00140006000800000021007A13C7B6A10300006E0800001800000000000000000000000000DF120000786| &&
|C2F776F726B7368656574732F7368656574332E786D6C504B01022D0014000600080000002100580737E94E070000C02000001300000000000000000000000000B6160000786C2F7468656D652F7468656D65312E786D6C504B01022D0014000600080000002100DBDAAE23F9020000940700000D000000000000000| &&
|00000000000351E0000786C2F7374796C65732E786D6C504B01022D00140006000800000021002A04FEC53D01000036030000140000000000000000000000000059210000786C2F736861726564537472696E67732E786D6C504B01022D00140006000800000021009C7CFD5AEE00000029030000230000000000000| &&
|0000000000000C8220000786C2F776F726B7368656574732F5F72656C732F7368656574332E786D6C2E72656C73504B01022D0014000600080000002100DABEDF814D0100006D0200001100000000000000000000000000F7230000646F6350726F70732F636F72652E786D6C504B01022D001400060008000000210| &&
|0465A0753AB0100006603000010000000000000000000000000007B260000646F6350726F70732F6170702E786D6C504B0506000000000D000D005D0300005C2900000000|.
  ENDMETHOD.
ENDCLASS.

 

Fazit

Mit der neuen API kannst du auch einfache Excel Dokumente lesen und verarbeiten. Wie du die API richtig nutzt, haben wir dir in diesem Artikel nähergebracht. Möchtest du mehr Funktionen und Möglichkeiten, solltest du dir abap2xlsx anschauen.

 

Quelle:
SAP Help - XLSX


Enthaltene Themen:
Modernes ABAPXCOExcelXCO_CP_XLSX
Kommentare (0)



Und weiter ...

Bist du zufrieden mit dem Inhalt des Artikels? Wir posten jeden Freitag neuen Content im Bereich ABAP und unregelmäßig in allen anderen Bereichen. Schaue bei unseren Tools und Apps vorbei, diese stellen wir kostenlos zur Verfügung.


ABAP - XCO Strings

Kategorie - ABAP

In diesem Artikel schauen wir uns die XCO Klasse zur Erzeugung und Verarbeitung von Strings für ABAP Cloud an und vergleichen sie mit den klassischen Statements.

22.11.2024

ABAP - XCO Bibliotheken

Kategorie - ABAP

Was kannst du mit der Bibliothek in ABAP und ABAP Cloud machen und wie nutzt du die Objekte am besten? Hier erfährst du mehr.

12.11.2024

ABAP - Type Casting

Kategorie - ABAP

Wie kommst du eigentlich an den ursprünglichen Typ einer Klasse bzw. Instanz, wenn diese in einer generischen Tabelle übergeben wird? In diesem Artikel prüfen wir die Möglichkeiten.

16.04.2024

ABAP - RETURN value

Kategorie - ABAP

Nach all den Jahren ist nun endlich der "echte" Return in ABAP angekommen, in diesem Artikel zeigen wir dir, wie der funktioniert und was er kann.

13.02.2024

ABAP Deep Dive - FOR (Schleifen)

Kategorie - ABAP

Schauen wir uns einmal die FOR Schleife etwas näher an. Wie funktioniert sie? Was muss ich beachten und was kann ich damit tun?

14.04.2023