EXCEL Export aus SAP mit Excel 2003 / 2007

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
3 Beiträge • Seite 1 von 1
3 Beiträge Seite 1 von 1

EXCEL Export aus SAP mit Excel 2003 / 2007

Beitrag von hfahrian (ForumUser / 53 / 7 / 0 ) »
Hallo zusammen und zuerst mal einen schönen Tach!!

Ich habe in verscheidenen Anwendungen eine Excelschnittstelle aus dem SAP (zumeist in ALV Anzeigen genutzt) umgesetzt. Diese hat gegenüber der Standard-SAP Schnittstelle mehrere Vorteile:
- Performance ca. 6 mal schneller
- Feldpositionen wie im SAP
- Filterbeachtung, Sortierung ... (Ok, ab neuen Releases geht das ja auch im Standard aber Performance nicht tragbar)
- Es werden verschiedene Kopfzeilen anhand Benutzervorgaben umgesetzt, wie z.B. Dictionary Infos, Langtexte ...
- Autofilter in Excel werden gesetzt ....
=>Die erzeugung der Daten, die dann in Excel geöffnet und konvertiert werden ist ähnlich HTM/XML aufgebaut.

Nun meine Frage:
Auf verschiedenen Testrechnern ist gleichzeitig Excel 2003 und 2007 installiert.
Alles klappt soweit.
Allerdings wird zur Konvertierung und entgültigen Exceldatei-Anzeige immer Excel 2003 genutzt? Öffne ich die fertige Exceldatei nach der Konvertierung so nutzt ja Windows Excel 2007!
Weiter unten das Coding (eine der wichtigen Routinen der Schnittstelle).

Wie verhalten sich eigentlich die Objektreferenzen wie : CREATE OBJECT ld_o_excel 'EXCEL.APPLICATION'.
bzw. beim Ausführen einer Applikation auf dem Frontendrechner => CL_GUI_FRONTEND_SERVICES
oder FUBA's wie:
CALL FUNCTION 'WS_EXECUTE'
EXPORTING
document = 'X'
commandline = ld_fileas_c
program = 'EXCEL'
EXCEPTIONS
frontend_error = 1
OTHERS = 6.


Kann man irgendwie steuern was diese Objekte / Klassen / FUBA's nutzen??? Ist das eine Registry-Geschichte? Oder einfaches SAP-Gedönse(Scherz!)?

Hier nun noch mein Coding der Hauptroutine zum Export auf Frontend, Öffenen und Wandeln mit Excel und abschließend die Anzeige der fertigen Exceldatei!
Beste Grüsse und Danke für eventuelle Hilfe, Henry!

Code: Alles auswählen.

*---------------------------------------------------------------------*
*       FORM f_hex_ext_down_file
*---------------------------------------------------------------------*
* Downloadroutine für die bearbeiteten Daten
* Auswahl einer Datei und nachfolgend Download der Daten
* pd_dir liefert den aktuelle gewählten Sicherungspfad zurück
*---------------------------------------------------------------------*
FORM f_hex_ext_down_file USING pd_filename
                               pd_convert
                               pd_showexcel
                      CHANGING pd_file_error
                               pd_dir.
  DATA: ld_goon.
  DATA: ld_fileas_c(1024).
  DATA: ld_o_excel    TYPE ole2_object,
        ld_o_workbook TYPE ole2_object,
        ld_o_winstate TYPE ole2_object,
        ld_o_wrksheet TYPE ole2_object,
        ld_o_actbook  TYPE ole2_object.
  DATA: ld_o_cell1    TYPE ole2_object,
        ld_o_cell2    TYPE ole2_object,
        ld_o_range    TYPE ole2_object,
        ld_o_column   TYPE ole2_object.
  DATA: ld_o_window   TYPE ole2_object.
  DATA: lt_tx_output TYPE TABLE OF gd_outline_typ.
  DATA: ld_subrc TYPE sysubrc, ld_recalc_filename, ld_append.
  DATA: ld_max_win.

* Filenameübernahme falls noch nicht vorgegeben
  IF gd_x_fileas_str IS INITIAL.
    gd_x_fileas_str  = pd_filename.
  ENDIF.
  CLEAR ld_recalc_filename.
  IF gd_x_fileas_str IS INITIAL OR gd_x_file_was_selected IS INITIAL.
*   Dateiabfrage falls noch keine Datei bekannt
    PERFORM f_hex_ext_sel_file_save USING space
      CHANGING gd_x_fileas_str pd_dir.
  ENDIF.
  IF pd_convert = 'P'.
*   Aktuell erfolgt der Extrakt von Ausschnittsdaten; auch bei eventuell
*   späterem File-Splitt eine Namensveränderung verhindern!
    gd_x_partaktiv = 'X'.
*   Eventuell muß Dateiname geprüft werden da zuvor Gesamtsicherung
*   eines Filesplitts stattfand!
    ld_recalc_filename = gd_x_recalc_filename.
  ENDIF.
  IF NOT gd_x_splitaktiv IS INITIAL.
    CLEAR gd_x_start_excel.  "Keine Excelanzeige da mehrere Dateien!
    IF gd_x_partaktiv IS INITIAL.
*     bei nicht aktiven Teilextrakt wird die Dateiendung eventuell um
*     weitere Nummer ergänzt
      ld_recalc_filename = 'X'.
    ENDIF.
  ENDIF.
  IF NOT ld_recalc_filename IS INITIAL.
*   Anpassungs-Prüfung für die Dateiendung => weitere Nummer ergänzen
    IF gd_x_fileas_org IS INITIAL.
      gd_x_fileas_org = gd_x_fileas_str.
    ENDIF.
    gd_x_fileas_str = gd_x_fileas_org.
    PERFORM f_hex_ext_file_exist_nr
      USING '00' 30 '~' space CHANGING gd_x_fileas_str.
*   Zurücksetzen des globalen Steuerungsparameters für Dateinamenprüfung
    CLEAR gd_x_recalc_filename.
  ENDIF.
  CHECK NOT gd_x_fileas_str IS INITIAL.
  PERFORM f_hex_ext_msgline USING 10 5 1 text-x04.

* Hinweise zum nachfolgenden Extrakt: Dieser läuft unter Aufteilung der
* Gesamtmenge um entdeckte Speicherungsprobleme zu verhindern.
* Auftrielung erfolgt in 10000'er Paketen der Extraktzeilen!
  ld_subrc = 1.
  WHILE ld_subrc > 0.
    FREE lt_tx_output.
    APPEND LINES OF gt_tx_output FROM 1 TO 10000 TO lt_tx_output.
    IF sy-tabix <= 0.
*     Alle Informationen sind extrahiert, Info setzen und Abbrechen
      ld_subrc = 0.
      FREE gt_tx_output.
      EXIT.
    ENDIF.
    DELETE gt_tx_output FROM 1 TO 10000.
*   Prüfung ob Datei bereits existiert, dann wird nachfolgend angehängt;
*   Hinweis: es zeigte sich dass in manchen Systemen Append auch bei
*   nicht existenter Datei funktionierte und in anderen nicht!
    PERFORM f_hex_ext_file_exist
      USING gd_x_fileas_str CHANGING ld_append.
    CALL FUNCTION 'GUI_DOWNLOAD'
      EXPORTING
        filename                = gd_x_fileas_str
        filetype                = 'ASC'
        append                  = ld_append
      TABLES
        data_tab                = lt_tx_output
      EXCEPTIONS
        file_write_error        = 1
        no_batch                = 2
        gui_refuse_filetransfer = 3
        invalid_type            = 4
        no_authority            = 5
        unknown_error           = 6
        header_not_allowed      = 7
        separator_not_allowed   = 8
        filesize_not_allowed    = 9
        header_too_long         = 10
        dp_error_create         = 11
        dp_error_send           = 12
        dp_error_write          = 13
        unknown_dp_error        = 14
        access_denied           = 15
        dp_out_of_memory        = 16
        disk_full               = 17
        dp_timeout              = 18
        file_not_found          = 19
        dataprovider_exception  = 20
        control_flush_error     = 21
        OTHERS                  = 22.
    IF sy-subrc <> 0.
*     Problemfall => Info setzen und Meldung, nachfolgend Abbrechen
      ld_subrc = -1.
      MESSAGE i646(db) WITH
        text-x05 gd_x_fileas_str space space.
      pd_file_error = sy-subrc.
    ENDIF.
  ENDWHILE.
  FREE: lt_tx_output.
  pd_file_error = ld_subrc.
  IF pd_convert = 'P'.
*   Aktuell erfolgt der Extrakt von Ausschnittsdaten => keine
*   Konvertierung ...
    EXIT.
  ENDIF.
  IF ld_subrc = 0.
    IF NOT pd_convert IS INITIAL.
*     Konvertierung HTM nach XLS durchführen
      CREATE OBJECT ld_o_excel 'EXCEL.APPLICATION'.
      macx_alv_down_err.
      CHECK sy-subrc = 0.
*     Mauspoiter aktiv setzen
      SET PROPERTY OF ld_o_excel 'DisplayAlerts' = 0.
      CALL METHOD OF ld_o_excel 'Workbooks' = ld_o_workbook.
      macx_alv_down_err.
*     Excel Vordergrund
      IF pd_showexcel = 'X'.
        SET PROPERTY OF ld_o_excel 'Cursor' = 2.            "#EC NOTEXT
        SET PROPERTY OF ld_o_excel 'VISIBLE' = 1.
*       aktuelle Windoweinstellung holen
        GET PROPERTY OF  ld_o_excel 'WindowState' = ld_o_winstate.
        IF ld_o_winstate-header = '-413' AND
           ld_o_winstate-type   = '7'.
          ld_max_win = 'X'.
        ENDIF.
*       Window Normal anzeigen; Maximize wäre -4137, Minimize -4140
        SET PROPERTY OF  ld_o_excel 'WindowState' = -4143.
      ELSE.
        SET PROPERTY OF ld_o_excel 'VISIBLE' = 0.
      ENDIF.
      gd_x_fileas_char = gd_x_fileas_str.
      CALL METHOD OF ld_o_workbook 'Open'
        EXPORTING #1 = gd_x_fileas_char.
      macx_alv_down_err.
      CALL METHOD OF ld_o_excel 'ActiveWorkbook' = ld_o_actbook.
      macx_alv_down_err.
      GET PROPERTY OF ld_o_excel 'ActiveWindow' = ld_o_window.
      macx_alv_down_err.
*     aktuelles Sheet ermitteln
      GET PROPERTY OF ld_o_excel 'ActiveSheet' = ld_o_wrksheet.
      macx_alv_down_err.
      IF NOT gd_x_zoom IS INITIAL.
*       Zoom im Excel auf Vorgabe setzen
        SET PROPERTY OF ld_o_window 'Zoom' = gd_x_zoom.     "#EC NOTEXT
        macx_alv_down_err.
      ENDIF.
      IF gd_x_fixz > 0 AND gd_x_fixsp > 0.
*       Fensterfixierung in Excel durchführen bei Zeile/Spalte
        PERFORM f_hex_ext_free_obj USING ld_o_range.
        PERFORM f_hex_ext_free_obj USING ld_o_cell1.
*       Passende Zelle markieren und danch Fixierung durchführen
        CALL METHOD OF ld_o_wrksheet 'Cells' = ld_o_cell1
          EXPORTING #1 = gd_x_fixz #2 = gd_x_fixsp.
        macx_alv_down_err.
        CALL METHOD OF ld_o_wrksheet 'Range' = ld_o_range
          EXPORTING #1 = ld_o_cell1 #2 = ld_o_cell1.
        macx_alv_down_err.
        CALL METHOD OF ld_o_range 'SELECT'.
        macx_alv_down_err.
        SET PROPERTY OF ld_o_window 'FreezePanes' = 1.
        macx_alv_down_err.
      ENDIF.
      IF gd_x_autof_znr > 0.
*       Autofilter realisieren bei gewünschter Zeile
        PERFORM f_hex_ext_free_obj USING ld_o_range.
        PERFORM f_hex_ext_free_obj USING ld_o_cell1.
        PERFORM f_hex_ext_free_obj USING ld_o_cell2.
        CALL METHOD OF ld_o_wrksheet 'Cells' = ld_o_cell1
          EXPORTING #1 = gd_x_autof_znr #2 = 1.
        CALL METHOD OF ld_o_wrksheet 'Cells' = ld_o_cell2
          EXPORTING #1 = gd_x_autof_znr #2 = 80.
        macx_alv_down_err.
        CALL METHOD OF ld_o_wrksheet 'Range' = ld_o_range
          EXPORTING #1 = ld_o_cell1 #2 = ld_o_cell2.
        macx_alv_down_err.
        CALL METHOD OF ld_o_range 'Autofilter'.
      ENDIF.
      IF gd_x_zeilenumbr = 0 OR gd_x_zeilenumbr = 1.
        PERFORM f_hex_ext_free_obj USING ld_o_range.
        PERFORM f_hex_ext_free_obj USING ld_o_cell1.
        PERFORM f_hex_ext_free_obj USING ld_o_cell2.
*       Range festlegen (Alles im Sheet) für Zeilenumbruch!
        CALL METHOD OF ld_o_wrksheet 'Cells' = ld_o_cell1
          EXPORTING #1 = 1 #2 = 1.
        macx_alv_down_err.
*       Zugriff aus Rangeobjekt herstellen mit obigem Zellenbezug
        CALL METHOD OF ld_o_wrksheet 'Range' = ld_o_range
          EXPORTING #1 = ld_o_cell1 #2 = ld_o_cell1.
        macx_alv_down_err.
*       Letze verwendete Zelle im Worksheet ermitteln über eine
*       Spezielmethode des Rangeobjektes
        CALL METHOD OF ld_o_range 'SpecialCells' = ld_o_cell2
          EXPORTING #1 = '11'.
        macx_alv_down_err.
*       Markierung (Range) über die 2 ermittelten Zellenobj. festlegen
        PERFORM f_hex_ext_free_obj USING ld_o_range.
        CALL METHOD OF ld_o_wrksheet 'Range' = ld_o_range
          EXPORTING #1 = ld_o_cell1 #2 = ld_o_cell2.
        macx_alv_down_err.
        SET PROPERTY OF ld_o_range 'WrapText' = gd_x_zeilenumbr.
        macx_alv_down_err.
        GET PROPERTY OF ld_o_range 'Columns' = ld_o_column. "#EC NOTEXT
        macx_alv_down_err.
        CALL METHOD OF ld_o_column 'AutoFit'.
        macx_alv_down_err.
      ENDIF.
      CALL METHOD OF ld_o_actbook 'SaveAs'
        EXPORTING #01 = gd_x_fileas_char #2 = 1.
      SET PROPERTY OF ld_o_excel 'Cursor' = -4143.          "#EC NOTEXT
      CALL METHOD OF ld_o_workbook 'CLOSE'.
      CALL METHOD OF ld_o_excel 'QUIT'.
      PERFORM f_hex_ext_free_obj USING ld_o_cell1.
      PERFORM f_hex_ext_free_obj USING ld_o_cell2.
      PERFORM f_hex_ext_free_obj USING ld_o_column.
      PERFORM f_hex_ext_free_obj USING ld_o_range.
      PERFORM f_hex_ext_free_obj USING ld_o_wrksheet.
      PERFORM f_hex_ext_free_obj USING ld_o_actbook.
      PERFORM f_hex_ext_free_obj USING ld_o_workbook.
      PERFORM f_hex_ext_free_obj USING ld_o_window.
      PERFORM f_hex_ext_free_obj USING ld_o_winstate.
      PERFORM f_hex_ext_free_obj USING ld_o_excel.
      IF NOT ld_max_win IS INITIAL.
*       Originalen Windowstatus wieder herstellen
*       =>Hier wird auf Maximierung geschaltet
        CREATE OBJECT ld_o_excel 'EXCEL.APPLICATION'.
        SET PROPERTY OF  ld_o_excel 'WindowState' = -4137.
        CALL METHOD OF ld_o_excel 'QUIT'.
        PERFORM f_hex_ext_free_obj USING ld_o_winstate.
        PERFORM f_hex_ext_free_obj USING ld_o_excel.
      ENDIF.
    ENDIF.
    IF gd_x_start_excel = 'X' AND NOT gd_x_fileas_str IS INITIAL.
      IF gd_x_info = 'X' AND pd_convert IS INITIAL.
        PERFORM f_hex_ext_info CHANGING ld_goon.
        CHECK  ld_goon = 'X'.
      ENDIF.
      CONCATENATE '"' gd_x_fileas_str '"'
              INTO ld_fileas_c.
*     Excel starten und Datei anzeigen
      CALL FUNCTION 'WS_EXECUTE'
        EXPORTING
          document       = 'X'
          commandline    = ld_fileas_c
          program        = 'EXCEL'
        EXCEPTIONS
          frontend_error = 1
          OTHERS         = 6.
      IF sy-subrc <> 0.
        CLEAR ld_fileas_c.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.                    "f_hex_ext_down_file

Henry Fahrian
Director Innovate ITC - SAP Consulting/Development
Mauritius

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: EXCEL Export aus SAP mit Excel 2003 / 2007

Beitrag von Tron (Top Expert / 1327 / 35 / 332 ) »
Moin Henry,
also: Die per OLE steuerbaren Objekte sind in der Registry eingetragen und können mit einem hinterlegten "Zauberwort"
wie z.B. CREATE OBJECT ld_o_excel 'EXCEL.APPLICATION' angesprochen werden.
Das Zauberwort heisst eigentlich fachlich korrekt ProgID.
Jede Version (hier Excel) hat eine eigene ProgID und eine gemeinsame VersionIndependentProgID ( rate mal welche Du benutzt :wink: )
Die ProgID von Excel 2003 lautet: Excel.Application.11 und ist damit eindeutig.
Ein Tool zur Anzeige sämtlicher in der Registry befindlicher OLE Objekte/ProgIDs heisst OLE/COM Viewer.(gibts bei MS zum download)
Hat man 2 Excel-Versionen (welch Luxus :) ) ,wird die Version zur Anzeige benutzt, die z.B. *.XLS als letztes registriert hat (meine Theorie).
Gewissheit verschafft auch hier nur die Registry.
Wenn Du also eine bestimmte Excel Version zum Öffnen benutzen willst, solltest Du z.B. den genauen Pfad zum Excel.exe nehmen und es
nicht dem Betriebssystem überlassen, welche Version es nehmen soll.

lg Jens
(Genaueres ließe sich sicherlich bei einem Workshop auf Mauritius klären :D )
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Re: EXCEL Export aus SAP mit Excel 2003 / 2007

Beitrag von hfahrian (ForumUser / 53 / 7 / 0 ) »
Tron hat geschrieben:Moin Henry,
also: Die per OLE steuerbaren Objekte sind in der Registry eingetragen und können mit einem hinterlegten "Zauberwort"
wie z.B. CREATE OBJECT ld_o_excel 'EXCEL.APPLICATION' angesprochen werden.
Das Zauberwort heisst eigentlich fachlich korrekt ProgID.
Jede Version (hier Excel) hat eine eigene ProgID und eine gemeinsame VersionIndependentProgID ( rate mal welche Du benutzt :wink: )
Die ProgID von Excel 2003 lautet: Excel.Application.11 und ist damit eindeutig.
Ein Tool zur Anzeige sämtlicher in der Registry befindlicher OLE Objekte/ProgIDs heisst OLE/COM Viewer.(gibts bei MS zum download)
Hat man 2 Excel-Versionen (welch Luxus :) ) ,wird die Version zur Anzeige benutzt, die z.B. *.XLS als letztes registriert hat (meine Theorie).
Gewissheit verschafft auch hier nur die Registry.
Wenn Du also eine bestimmte Excel Version zum Öffnen benutzen willst, solltest Du z.B. den genauen Pfad zum Excel.exe nehmen und es
nicht dem Betriebssystem überlassen, welche Version es nehmen soll.

lg Jens
(Genaueres ließe sich sicherlich bei einem Workshop auf Mauritius klären :D )
Hallo Jens,
Danke für die klaren und hilfreichen Hinweise! Weiss normal hat man nicht 2 Excelversionen; ist mehr zu Testzwecken, habe aber auch bei Kunden
dies schon öfters gesehen.
Werde ein Customizing umsetzen um beide Versionen von Excel steuern zu können; ist sowie so interesant ob man das auf einem Rechner steuern kann/könnte!
Beste Grüsse und das mit Workshop in der Sonne (haben im Moment Sommer mit ~33°) liesse sich machen. Workshop hat schon mall stattgefunden => siehe den kleinen
Dateianhang :D
Henry Fahrian
Director Innovate ITC - SAP Consulting/Development
Mauritius

Seite 1 von 1

Vergleichbare Themen

1
Antw.
2274
Views
FILE_READ_AND_CONVERT_SAP_DATA Excel 2007 ?
von Kleenmex » 01.09.2008 16:16 • Verfasst in ABAP® Core
1
Antw.
1051
Views
Problem mit Excel 2003 Listendarstallung
von john_doe » 27.07.2005 21:18 • Verfasst in SAP - Allgemeines
6
Antw.
9329
Views
SapGui 730 und Excel 2003 Inplace Problem
von Alexander D. » 30.07.2012 10:20 • Verfasst in Basis
0
Antw.
1126
Views
OLE / Excel Problem seit neuem Office 2003
von Elmo » 06.03.2007 11:44 • Verfasst in ABAP® Core
1
Antw.
2506
Views
Export SAP -> Excel
von Deters » 27.04.2011 15:40 • Verfasst in ABAP® Core

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Daten an Tabelle binden
vor 10 Stunden von Bright4.5 3 / 1485
Regex in where
vor 12 Stunden von tar 6 / 157

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Daten an Tabelle binden
vor 10 Stunden von Bright4.5 3 / 1485
Regex in where
vor 12 Stunden von tar 6 / 157

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 5 Wochen von ralf.wenzel 1 / 3261
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9821