Zum Inhalt springen
Die Codezentrale
Programmierung, Tipps, Tricks, Snippets, Links (.Net, Java, JavaScript, C++, PHP, Python, SQL, SAP, ABAP, SAPUI5)
Zum Inhalt springen
  • Home
  • Links
    • Kachelmannwetter
    • MrLeehs Blog
    • Deskmodder
    • winfuture.de
    • Tricktresor
    • Python Online Compiler
    • [Raspberry Pi] Wichtige Terminal-Kommandos für Raspian
    • CodeSandbox JS Vanilla
  • Datenschutzerklärung
  • Impressum
Startseite Beiträge getaggt mit "cl_salv_bs_ex_office2007"

Schlagwort: cl_salv_bs_ex_office2007

[ABAP] Interne Tabellen mittels SALV-Klassen als MS Excel-Dateien (*.xlsx, *.xml) speichern

Variante 1 (to_xml)

DATA: it_spfli TYPE STANDARD TABLE OF spfli.
DATA: o_salv TYPE REF TO cl_salv_table.

START-OF-SELECTION.

* Daten holen
  SELECT * FROM spfli INTO TABLE @it_spfli.

* ALV-objekt erzeugen
  cl_salv_table=>factory( IMPORTING
                            r_salv_table   = o_salv
                          CHANGING
                            t_table        = it_spfli ).

* itab (data) -> xstring (bytes)
  DATA(lv_xml_bytes) = o_salv->to_xml( xml_type = if_salv_bs_xml=>c_type_xlsx ).

* xstring -> itab (bytes)
  DATA: lv_size TYPE i.
  DATA: it_raw_data TYPE xml_rawdata.

* xstring (Bytes) -> RAW (iTab)
  cl_scp_change_db=>xstr_to_xtab( EXPORTING
                                    im_xstring = lv_xml_bytes
                                  IMPORTING
                                    ex_size    = lv_size
                                    ex_xtab    = it_raw_data ).

  IF lines( it_raw_data ) > 0.
    DATA: lv_action TYPE i.
    DATA: lv_filename TYPE string.
    DATA: lv_fullpath TYPE string.
    DATA: lv_path TYPE string.

    TRY.
* SaveDialog aufrufen
        cl_gui_frontend_services=>file_save_dialog( EXPORTING
                                                      default_extension   = 'xlsx'
                                                      default_file_name   = 'export.xlsx'
                                                      file_filter         = |Excel-Datei (*.xlsx)\|*.xlsx\|{ cl_gui_frontend_services=>filetype_all }|
                                                      prompt_on_overwrite = abap_true
                                                    CHANGING
                                                      filename            = lv_filename
                                                      path                = lv_path
                                                      fullpath            = lv_fullpath
                                                      user_action         = lv_action ).

        IF lv_action EQ cl_gui_frontend_services=>action_ok.
* iTab (bytes) -> lokale Datei
          cl_gui_frontend_services=>gui_download( EXPORTING
                                                    filename                  = lv_fullpath
                                                    filetype                  = 'BIN'
                                                    bin_filesize              = lv_size " Size ist wichtig für das korrekte Schreiben der Excel-Datei
                                                  CHANGING
                                                    data_tab                  = it_raw_data ).
* lokale Datei im Excel aufrufen
* parameter muss wegen möglicher Leerzeichen im Pfad mit "" quotiert werden
          cl_gui_frontend_services=>execute( application = 'excel.exe'
                                             parameter   = |"{ lv_fullpath }"| ).
        ENDIF.

      CATCH cx_root INTO DATA(e_txt).
        MESSAGE e_txt->get_text( ) TYPE 'S'.
    ENDTRY.
  ENDIF.

Variante 2 (cl_salv_bs_ex_office2007)

* produziert defekte *.xlsx-Datei
DATA: it_spfli TYPE STANDARD TABLE OF spfli.
DATA: o_salv TYPE REF TO cl_salv_table.

START-OF-SELECTION.

* Daten holen
  SELECT * FROM spfli INTO TABLE @it_spfli.

* ALV-objekt erzeugen
  cl_salv_table=>factory( IMPORTING
                            r_salv_table   = o_salv
                          CHANGING
                            t_table        = it_spfli ).

* Version prüfen
  IF cl_salv_bs_a_xml_base=>get_version( ) EQ if_salv_bs_xml=>version_25 OR
     cl_salv_bs_a_xml_base=>get_version( ) EQ if_salv_bs_xml=>version_26.


* MVC-Feldkatalog erzeugen
    DATA(it_fcat) = cl_salv_controller_metadata=>get_lvc_fieldcatalog( r_columns      = o_salv->get_columns( )
                                                                       r_aggregations = o_salv->get_aggregations( ) ).

* CL_SALV_EX_RESULT_DATA_TABLE erzeugen
    DATA(o_salv_ex_res) = cl_salv_ex_util=>factory_result_data_table( r_data                 = REF #( it_spfli )
                                                                      t_fieldcatalog         = it_fcat ).

* CL_SALV_EX_RESULT_DATA_TABLE -> XML (Bytes)
    DATA(o_excel2007) = NEW cl_salv_bs_ex_office2007( o_salv_ex_res ).

    IF o_excel2007 IS BOUND.
      DATA(lv_xml_bytes) = o_excel2007->transform( ).

* xstring -> itab (bytes)
      DATA: lv_size TYPE i.
      DATA: it_raw_data TYPE xml_rawdata.

* xstring (Bytes) -> RAW (iTab)
      cl_scp_change_db=>xstr_to_xtab( EXPORTING
                                        im_xstring = lv_xml_bytes
                                      IMPORTING
                                        ex_size    = lv_size
                                        ex_xtab    = it_raw_data ).

      IF lines( it_raw_data ) > 0.
        DATA: lv_action TYPE i.
        DATA: lv_filename TYPE string.
        DATA: lv_fullpath TYPE string.
        DATA: lv_path TYPE string.

        TRY.
* SaveDialog aufrufen
            cl_gui_frontend_services=>file_save_dialog( EXPORTING
                                                          default_extension   = 'xlsx'
                                                          default_file_name   = 'export.xlsx'
                                                          file_filter         = |Excel-Datei (*.xlsx)\|*.xlsx\|{ cl_gui_frontend_services=>filetype_all }|
                                                          prompt_on_overwrite = abap_true
                                                        CHANGING
                                                          filename            = lv_filename
                                                          path                = lv_path
                                                          fullpath            = lv_fullpath
                                                          user_action         = lv_action ).

            IF lv_action EQ cl_gui_frontend_services=>action_ok.
* iTab (bytes) -> lokale Datei
              cl_gui_frontend_services=>gui_download( EXPORTING
                                                        filename                  = lv_fullpath
                                                        filetype                  = 'BIN'
                                                        bin_filesize              = lv_size " Size ist wichtig für das korrekte Schreiben der Excel-Datei
                                                      CHANGING
                                                        data_tab                  = it_raw_data ).
* lokale Datei im Excel aufrufen
* parameter muss wegen möglicher Leerzeichen im Pfad mit "" quotiert werden
              cl_gui_frontend_services=>execute( application = 'excel.exe'
                                                 parameter   = |"{ lv_fullpath }"| ).

            ENDIF.

          CATCH cx_root INTO DATA(e_txt).
            MESSAGE e_txt->get_text( ) TYPE 'S'.
        ENDTRY.
      ENDIF.
    ENDIF.
  ENDIF.

Variante 3 (CL_SALV_BS_TT_UTIL)

* produziert defekte *.xlsx-Datei
DATA: it_spfli TYPE STANDARD TABLE OF spfli.
DATA: o_salv TYPE REF TO cl_salv_table.

START-OF-SELECTION.

* Daten holen
  SELECT * FROM spfli INTO TABLE @it_spfli.

* ALV-objekt erzeugen
  cl_salv_table=>factory( IMPORTING
                            r_salv_table   = o_salv
                          CHANGING
                            t_table        = it_spfli ).

* Version prüfen
  IF cl_salv_bs_a_xml_base=>get_version( ) EQ if_salv_bs_xml=>version_25 OR
     cl_salv_bs_a_xml_base=>get_version( ) EQ if_salv_bs_xml=>version_26.


* MVC-Feldkatalog erzeugen
    DATA(it_fcat) = cl_salv_controller_metadata=>get_lvc_fieldcatalog( r_columns      = o_salv->get_columns( )
                                                                       r_aggregations = o_salv->get_aggregations( ) ).

* SALV-Result-Table erzeugen
    DATA(r_result_data) = cl_salv_ex_util=>factory_result_data_table( r_data         = REF #( it_spfli )
                                                                      t_fieldcatalog = it_fcat ).


    DATA: lv_xml_bytes TYPE xstring.

* SALV-Result-Table
    cl_salv_bs_tt_util=>if_salv_bs_tt_util~transform( EXPORTING
                                                        xml_type      = if_salv_bs_xml=>c_type_xlsx
                                                        xml_version   = cl_salv_bs_a_xml_base=>get_version( )
                                                        r_result_data = r_result_data
                                                        xml_flavour   = if_salv_bs_c_tt=>c_tt_xml_flavour_export
                                                        gui_type      = if_salv_bs_xml=>c_gui_type_gui
                                                      IMPORTING
                                                        xml           = lv_xml_bytes ).

* xstring -> itab (bytes)
    DATA: lv_size TYPE i.
    DATA: it_raw_data TYPE xml_rawdata.

* xstring (Bytes) -> RAW (iTab)
    cl_scp_change_db=>xstr_to_xtab( EXPORTING
                                      im_xstring = lv_xml_bytes
                                    IMPORTING
                                      ex_size    = lv_size
                                      ex_xtab    = it_raw_data ).

    IF lines( it_raw_data ) > 0.
      DATA: lv_action TYPE i.
      DATA: lv_filename TYPE string.
      DATA: lv_fullpath TYPE string.
      DATA: lv_path TYPE string.

      TRY.
* SaveDialog aufrufen
          cl_gui_frontend_services=>file_save_dialog( EXPORTING
                                                        default_extension   = 'xlsx'
                                                        default_file_name   = 'export.xlsx'
                                                        file_filter         = |Excel-Datei (*.xlsx)\|*.xlsx\|{ cl_gui_frontend_services=>filetype_all }|
                                                        prompt_on_overwrite = abap_true
                                                      CHANGING
                                                        filename            = lv_filename
                                                        path                = lv_path
                                                        fullpath            = lv_fullpath
                                                        user_action         = lv_action ).

          IF lv_action EQ cl_gui_frontend_services=>action_ok.
* iTab (bytes) -> lokale Datei
            cl_gui_frontend_services=>gui_download( EXPORTING
                                                      filename                  = lv_fullpath
                                                      filetype                  = 'BIN'
                                                      bin_filesize              = lv_size " Size ist wichtig für das korrekte Schreiben der Excel-Datei
                                                    CHANGING
                                                      data_tab                  = it_raw_data ).
* lokale Datei im Excel aufrufen
* parameter muss wegen möglicher Leerzeichen im Pfad mit "" quotiert werden
            cl_gui_frontend_services=>execute( application = 'excel.exe'
                                               parameter   = |"{ lv_fullpath }"| ).
          ENDIF.

        CATCH cx_root INTO DATA(e_txt).
          MESSAGE e_txt->get_text( ) TYPE 'S'.
      ENDTRY.
    ENDIF.
  ENDIF.

Variante 4 (CL_SALV_BS_LEX)

DATA: it_spfli TYPE STANDARD TABLE OF spfli WITH DEFAULT KEY.

SELECT * FROM spfli INTO TABLE @it_spfli.

TRY.
    DATA: o_salv TYPE REF TO cl_salv_table.

* SALV-Objekt erzeugen
    cl_salv_table=>factory( IMPORTING
                              r_salv_table = o_salv
                            CHANGING
                              t_table      = it_spfli ).

* Feldkatalog erstellen
    DATA(o_cols) = o_salv->get_columns( ).
    DATA(o_aggr) = o_salv->get_aggregations( ).
    DATA(it_fcat) = cl_salv_controller_metadata=>get_lvc_fieldcatalog( r_columns      = o_cols
                                                                       r_aggregations = o_aggr ).

* CL_SALV_EX_RESULT_DATA_TABLE erzeugen
    DATA(o_salv_ex_res) = cl_salv_ex_util=>factory_result_data_table( r_data          = REF #( it_spfli )
                                                                      t_fieldcatalog  = it_fcat ).

    DATA: lv_xml_bytes TYPE xstring.
* CL_SALV_EX_RESULT_DATA_TABLE -> XML (Bytes)
* für CSV: is_format = if_salv_bs_lex_format=>mc_format_csv
    cl_salv_bs_lex=>export_from_result_data_table( EXPORTING
                                                     is_format            = if_salv_bs_lex_format=>mc_format_xlsx
                                                     ir_result_data_table = o_salv_ex_res
                                                   IMPORTING
                                                     er_result_file       = lv_xml_bytes ).

* wenn Byte-Daten vorhanden
    IF xstrlen( lv_xml_bytes ) > 0.
      DATA: lv_size TYPE i.
      DATA: it_raw_data TYPE xml_rawdata.

* xstring (Bytes) -> RAW (iTab)
      cl_scp_change_db=>xstr_to_xtab( EXPORTING
                                        im_xstring = lv_xml_bytes
                                      IMPORTING
                                        ex_size    = lv_size
                                        ex_xtab    = it_raw_data ).

      IF lines( it_raw_data ) > 0.
        DATA: lv_action TYPE i.
        DATA: lv_filename TYPE string.
        DATA: lv_fullpath TYPE string.
        DATA: lv_path TYPE string.

        cl_gui_frontend_services=>file_save_dialog( EXPORTING
                                                      default_extension   = 'xlsx'
                                                      default_file_name   = 'export.xlsx'
                                                      file_filter         = |Excel-Datei (*.xlsx)\|*.xlsx\|{ cl_gui_frontend_services=>filetype_all }|
                                                      prompt_on_overwrite = abap_true
                                                    CHANGING
                                                      filename            = lv_filename
                                                      path                = lv_path
                                                      fullpath            = lv_fullpath
                                                      user_action         = lv_action ).

        IF lv_action EQ cl_gui_frontend_services=>action_ok.
          cl_gui_frontend_services=>gui_download( EXPORTING
                                                    filename                  = lv_fullpath
                                                    filetype                  = 'BIN'
                                                    bin_filesize              = lv_size " Size ist wichtig für das korrekte Schreiben der Excel-Datei
                                                  CHANGING
                                                    data_tab                  = it_raw_data ).
        ENDIF.
      ENDIF.
    ENDIF.

  CATCH cx_root INTO DATA(e_txt).
    MESSAGE e_txt->get_text( ) TYPE 'S'.
ENDTRY.

Variante 5 (EDX_UTIL)

TRY.
    SELECT *
      INTO TABLE @DATA(it_t001)
      FROM mara
      UP TO 100 ROWS.

    IF sy-subrc = 0.
      DATA: lv_xstr TYPE xstring.

* Creates XLS fom the ITAB
      edx_util=>create_xls_from_itab( EXPORTING i_xlsx    = abap_true
                                      IMPORTING e_xstring = lv_xstr
                                      CHANGING  ct_data   = it_t001 ).

      IF xstrlen( lv_xstr ) > 0.
        DATA: lv_action TYPE i.
        DATA: lv_filename TYPE string.
        DATA: lv_fullpath TYPE string.
        DATA: lv_path TYPE string.

* Save-Dialog
        cl_gui_frontend_services=>file_save_dialog( EXPORTING
                                                      default_file_name = 'Excel.xlsx'
                                                      default_extension = 'xlsx'
                                                      file_filter       = |Excel-Datei (*.xlsx)\|*.xlsx\|{ cl_gui_frontend_services=>filetype_all }|
                                                    CHANGING
                                                      filename          = lv_filename
                                                      path              = lv_path
                                                      fullpath          = lv_fullpath
                                                      user_action       = lv_action ).

        IF lv_action EQ cl_gui_frontend_services=>action_ok.
* XSTRING -> SOLIX (RAW)
          DATA(it_raw_data) = cl_bcs_convert=>xstring_to_solix( EXPORTING iv_xstring = lv_xstr ).

* Datei lokal speichern
          cl_gui_frontend_services=>gui_download( EXPORTING
                                                    filename     = lv_fullpath
                                                    filetype     = 'BIN'
                                                    bin_filesize = xstrlen( lv_xstr )
                                                  CHANGING
                                                    data_tab     = it_raw_data ).


        ENDIF.
      ENDIF.
    ENDIF.
  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

Links

  • http://abapblog.com/articles/tricks/33-create-xlsx-mhtml-file-from-internal-table-in-background
  • http://abapblog.com/articles/tricks/120-create-xlsx-file-from-internal-table-in-background-v2
  • https://blogs.sap.com/2014/02/15/how-to-extract-formatted-output-as-an-excel-document-using-salv-in-the-background/
  • https://blogs.sap.com/2013/03/04/simple-program-to-download-excel-in-mhtml-format-from-internal-table/
admin 7. Juli 2017 6. April 2020Export, Interne Tabellen, SALV, XML ABAP, cl_bcs_convert, cl_gui_frontend_services, cl_salv_bs_ex_office2007, cl_salv_bs_lex, cl_salv_bs_tt_util, cl_salv_controller_metadata, CL_SALV_EX_RESULT_DATA_TABLE, cl_salv_ex_util, cl_salv_table, cl_scp_change_db, create_xls_from_itab, c_type_excel_xml, c_type_xlsx, edx_util, execute, export_from_result_data_table, factory_result_data_table, file_save_dialog, get_lvc_fieldcatalog, gui_download, if_salv_bs_lex_format, if_salv_bs_tt_util, if_salv_bs_xml, mc_format_csv, mc_format_xlsx, SALV, to_xml, transform, XLSX, XML, xstring, xstring_to_solix, xstr_to_xtab
  • Kategorien

    aufklappen | zuklappen
  • Neueste Beiträge

    • [ABAP] SALV-Grid: Eventhandler für Doppelklick auf eine Zelle (double_click)
    • [SAP] ABAP-Code nachgenerieren bzw. aktivieren
    • [ABAP] Feldkatalog aus Tabellendefinition erstellen
    • [ABAP] XML in interne Tabelle wandeln
    • [ABAP] Inhalt eines Spoolauftrages auslesen
    • [ABAP] User-Exits und BAdIs zu einem Programm oder einer Transaktion auflisten
    • [ABAP] UTC-long-Zeitstempel nach POSIX-Standard in Datum und Zeit splitten
    • [ABAP] Verwendung von Common Table Expressions (CTE)
    • [ABAP] Leistungsverzeichnis lesen (MS_READ_SERVICES_FOR_BAPI)
    • [ABAP] SAPConnect: Kommunikationsknoten, Routing und Parameter auslesen
  • Archiv

  • Meta

    • Anmelden
    • Feed der Einträge
    • Kommentar-Feed
    • WordPress.org
  • Related Posts

    • [ABAP] Interne Tabelle als Excel-Datei (*.xlsx) speichern (cl_fdt_xl_spreadsheet)
    • [ABAP] Transportauftrag als ZIP-Datei speichern
    • [ABAP] Binärdaten (HEX) in eine lokale Datei speichern
    • [ABAP] PDFs mittels Klasse CL_RSPO_PDF_MERGE zusammenfügen (mergen)
    • [ABAP] Screenshot speichern
    • [ABAP] Listenausgabe in Spool umleiten und als PDF ausgeben
    • [ABAP] xstring nach RAW (binary) wandeln
    • [ABAP] Excel-Datei (*.xlsx) in interne Tabelle laden (cl_fdt_xl_spreadsheet)
    • [ABAP] Google-API: QR-Code generieren und Bild herunterladen/speichern
    • [ABAP] CONVERT_OTF: OTF-Format als PDF speichern und anzeigen (Beispiel Smart Forms-Formular)
  • Tags

    ABAP (968) Android (18) CLASS (20) cl_abap_list_layout (19) cl_abap_structdescr (14) cl_bcs_convert (27) cl_gui_alv_grid (24) cl_gui_container (39) cl_gui_docking_container (25) cl_gui_frontend_services (48) cl_gui_splitter_container (14) cl_salv_table (58) cntl_simple_event (16) create (27) Date (16) default_screen (28) display (14) EWM (17) Fiori (21) get_columns (22) gui_download (15) HTML (16) JavaScript (78) JSON (21) MIME (17) NEW (20) OData (32) OpenSQL (44) Python (23) Raspberry Pi (50) Raspberry Pi 2 (27) Raspberry Pi 4 (23) Raspian (22) RegEx (18) SAP (350) SAPUI5 (27) SELECT (25) String (33) stringtab (15) suppress_toolbar (19) UTF-8 (15) Value (27) XML (29) xstring (20) xstring_to_solix (15)
(W) 2025 by codezentrale.de
Präsentiert von Tempera & WordPress.