Interne Tabelle als Excel mit mehrere Blättern versenden

Getting started ... Alles für einen gelungenen Start.
16 Beiträge • Seite 1 von 2 (current) Nächste
16 Beiträge Seite 1 von 2 (current) Nächste

Interne Tabelle als Excel mit mehrere Blättern versenden

Beitrag von lisa (ForumUser / 53 / 8 / 1 ) »
Hallo zusammen,

ich möchte die internen Tabellen als Excel mit mehreren Blättern per Email verschicken. Jeder Blatt hat einen Bezeichnung. Ich weiß im Moment, wie man programmiert, um die Daten einer internen Tabelle als Excel-Datei per Email versendet, aber diese Excel-Datei hat nur einen Blatt. Wie macht man, dass die Daten in mehreren Blättern von Excel geschrieben werden können?

Vielen Dank für Eure Hilfe.

VG
Lisa

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


Re: Interne Tabelle als Excel mit mehrere Blättern versenden

Beitrag von PeterPaletti (Specialist / 367 / 33 / 102 ) »
Hallo Lisa,
ich wüsste nicht, wie man mit "normalen Bordmitteln" eine Excel mit mehreren Blättern aus mehreren internen Tabellen als Excel versendet.

Mir fallen dabei nur OLE, XML und ABAP2XLS ein.

Re: Interne Tabelle als Excel mit mehrere Blättern versenden

Beitrag von a-dead-trousers (Top Expert / 4458 / 227 / 1198 ) »
OLE braucht den SAPgui, ist also für Hintergrundverarbeitung ungeeignet.
ABAP2XLS könnte funktionieren, wobei ich aber nicht sicher bin, dass es mehrere Arbeitsblätter unterstützt.
XML ???
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Interne Tabelle als Excel mit mehrere Blättern versenden

Beitrag von Alpmann (ForumUser / 63 / 5 / 20 ) »
Hallo Lisa,

du könntest deine Auswertung in einen RFC-fähigen Funktionsbaustein packen und die automatisierte Verteilung in mehrere Tabellenblätter in Excel realisieren.

Mit freundlichen Grüßen
Matthias Alpmann

Re: Interne Tabelle als Excel mit mehrere Blättern versenden

Beitrag von lisa (ForumUser / 53 / 8 / 1 ) »
Alpmann hat geschrieben:
17.02.2022 08:17
Hallo Lisa,

du könntest deine Auswertung in einen RFC-fähigen Funktionsbaustein packen und die automatisierte Verteilung in mehrere Tabellenblätter in Excel realisieren.

Mit freundlichen Grüßen
Matthias Alpmann
Vielen Dank für deine Hilfe.

Re: Interne Tabelle als Excel mit mehrere Blättern versenden

Beitrag von lisa (ForumUser / 53 / 8 / 1 ) »
a-dead-trousers hat geschrieben:
17.02.2022 07:24
OLE braucht den SAPgui, ist also für Hintergrundverarbeitung ungeeignet.
ABAP2XLS könnte funktionieren, wobei ich aber nicht sicher bin, dass es mehrere Arbeitsblätter unterstützt.
XML ???
Vielen Dank für deine Hilfe. Ich habe schon mal ABAP2XLS gesehen, aber selbe noch nie probiert und werde das machen.

Re: Interne Tabelle als Excel mit mehrere Blättern versenden

Beitrag von lisa (ForumUser / 53 / 8 / 1 ) »
PeterPaletti hat geschrieben:
16.02.2022 20:48
Hallo Lisa,
ich wüsste nicht, wie man mit "normalen Bordmitteln" eine Excel mit mehreren Blättern aus mehreren internen Tabellen als Excel versendet.

Mir fallen dabei nur OLE, XML und ABAP2XLS ein.
Vielen Dank für Deine Hilfe. Ich schaue mal weiter.

Re: Interne Tabelle als Excel mit mehrere Blättern versenden

Beitrag von A6272 (Specialist / 240 / 8 / 36 ) »
Schau dir mal das Interface I_OI_SPREADSHEET im Paket SOFFICEINTEGRATION an.

Wir haben da mal vor Ewigkeiten eine EXCEL Vorlage mit mehreren Blättern im SAP hinterlegt und die dann gefüllt. Ging aber nur online.

Re: Interne Tabelle als Excel mit mehrere Blättern versenden

Beitrag von jocoder (Specialist / 345 / 3 / 103 ) »
Mit ABAP2XLSX lässt sich ohne Probleme ein Spreadsheet mit mehreren Tabellenblättern aufbauen.

Code: Alles auswählen.

DATA(spreadsheet) = NEW zcl_excel( ).
DATA(worksheet1) = spreadsheet->add_new_worksheet( 'Blatt 1').
" worksheet 1 füllen
DATA(worksheet2) = spreadsheet->add_new_worksheet( 'Blatt 2').
" worksheet 2 füllen

Folgende Benutzer bedankten sich beim Autor jocoder für den Beitrag:
a-dead-trousers


Re: Interne Tabelle als Excel mit mehrere Blättern versenden

Beitrag von PeterPaletti (Specialist / 367 / 33 / 102 ) »
https://blogs.sap.com/2018/06/16/using- ... net-email/

Hier hat jemand ein Beispielprogramm mit ABAP2XSLX geposted. Muss man nur entsprechend anpassen.

Die Ausgabe mit salv kann man ja weglassen.

https://wiki.scn.sap.com/wiki/display/S ... dn.sap.com
Da gibt es ein Beispiel für eine XML-Datei für Excel als E-Mail Anhang. Die Excel hat nur 1 Blatt, das Programm ließe sich für mehrere Blätter aber entsprechend anpassen.
Habe ich noch nie ausprobiert, scheint mir viel Fleißarbeit zu sein.

Re: Interne Tabelle als Excel mit mehrere Blättern versenden

Beitrag von black_adept (Top Expert / 4136 / 131 / 956 ) »
a-dead-trousers hat geschrieben:
17.02.2022 07:24
ABAP2XLS könnte funktionieren, wobei ich aber nicht sicher bin, dass es mehrere Arbeitsblätter unterstützt.
Wenn ihr ABAP2XLSX implementiert habt zeigt das mitgelieferte Demoprogramm ZDEMO_EXCEL19, dass es mit mehreren Blättern geht.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Interne Tabelle als Excel mit mehrere Blättern versenden

Beitrag von lisa (ForumUser / 53 / 8 / 1 ) »
PeterPaletti hat geschrieben:
17.02.2022 16:16
https://blogs.sap.com/2018/06/16/using- ... net-email/

Hier hat jemand ein Beispielprogramm mit ABAP2XSLX geposted. Muss man nur entsprechend anpassen.

Die Ausgabe mit salv kann man ja weglassen.

https://wiki.scn.sap.com/wiki/display/S ... dn.sap.com
Da gibt es ein Beispiel für eine XML-Datei für Excel als E-Mail Anhang. Die Excel hat nur 1 Blatt, das Programm ließe sich für mehrere Blätter aber entsprechend anpassen.
Habe ich noch nie ausprobiert, scheint mir viel Fleißarbeit zu sein.
Hallo PeterPaletti,
vielen Dank für deine Info. Ich habe die Bespiele angeschaut, aber ich kann leider mit dem 1. Coding nicht anfangen. Kann es sein, dass das Coding nicht vollständig ist? zB: es fehlt die Klasse zcx_excel?
Bei dem 2.Coding gibt es keinen Syntaxfehler, aber ich konnte die Daten an meine Email nicht senden.

VG

Lisa

Re: Interne Tabelle als Excel mit mehrere Blättern versenden

Beitrag von PeterPaletti (Specialist / 367 / 33 / 102 ) »
Das 1. Coding ist vollständig erst am Schluss des Blogs.
Es lautet:

Code: Alles auswählen.

report zz_report.
  types          : row_counter    type n length 02.
  types          : email_recipient
                                  type adr6-smtp_addr.
  data           : excel          type ref to zcl_excel ##NEEDED.
  parameters     : rowcount       type row_counter.
  parameters     : recipien       type email_recipient.
initialization.
  select single smtp_addr
    into recipien
    from adr6 ##WARN_OK
           inner join
         usr21 on usr21~persnumber eq adr6~persnumber
   where usr21~bname              eq sy-uname.
start-of-selection.
  perform display_flight_rows using rowcount.
  perform display_carrier_rows using rowcount.
  perform display_booking_rows using rowcount.
  perform send_excel_via_email using recipien.
form display_flight_rows using row_count
                                  type row_counter
                       raising zcx_excel.
    data         : flight_stack   type standard table of sflight
                 , alv_report     type ref to cl_salv_table
                 .
    try.
      call method cl_salv_table=>factory
        importing
          r_salv_table            = alv_report
        changing
          t_table                 = flight_stack.
    catch cx_salv_msg.
      return.
    endtry.
    select *
      into table flight_stack
      from sflight
             up to row_count rows.
    alv_report->display( ).
    perform copy_table_to_excel_worksheet using flight_stack 'Flights'.
endform.
form display_carrier_rows using row_count
                                  type row_counter
                        raising zcx_excel.
    data         : carrier_stack  type standard table of scarr
                 , alv_report     type ref to cl_salv_table
                 .
    try.
      call method cl_salv_table=>factory
        importing
          r_salv_table            = alv_report
        changing
          t_table                 = carrier_stack.
    catch cx_salv_msg.
      return.
    endtry.
    select *
      into table carrier_stack
      from scarr
             up to row_count rows.
    alv_report->display( ).
    perform copy_table_to_excel_worksheet using carrier_stack 'Carriers'.
endform.
form display_booking_rows using row_count
                                  type row_counter
                        raising zcx_excel.
    data         : booking_stack  type standard table of sbook
                 , alv_report     type ref to cl_salv_table
                 .
    try.
      call method cl_salv_table=>factory
        importing
          r_salv_table            = alv_report
        changing
          t_table                 = booking_stack.
    catch cx_salv_msg.
      return.
    endtry.
    select *
      into table booking_stack
      from sbook
             up to row_count rows.
    alv_report->display( ).
    perform copy_table_to_excel_worksheet using booking_stack 'Bookings'.
endform.
form copy_table_to_excel_worksheet using source_stack
                                           type standard table
                                         source_description
                                           type string
                                 raising zcx_excel.
    constants    : first_column   type char1     value 'A'
                 .
    data         : worksheet      type ref to zcl_excel_worksheet
                 , worksheet_title
                                  type zexcel_sheet_title
                 , table_settings type zexcel_s_table_settings
                 .
    table_settings-table_style    = zcl_excel_table=>builtinstyle_medium2.
    table_settings-show_row_stripes
                                  = abap_true.
    table_settings-nofilters      = abap_true.
    table_settings-top_left_column
                                  = first_column.
    table_settings-top_left_row   = 01.
    if excel is not bound.
      create object excel.
      worksheet                   = excel->get_active_worksheet( ).
    else.
      worksheet                   = excel->add_new_worksheet( ).
    endif.
    worksheet_title               = source_description.
    worksheet->set_title( worksheet_title ).
    worksheet->bind_table(
      ip_table                    = source_stack
      is_table_settings           = table_settings
      ).
endform.
form send_excel_via_email using recipient type email_recipient.
    constants    : excel_file_type
                                 type string value '.xlsx'
                 , file_name_parameter
                                  type string value '&SO_FILENAME='
                 .
    data         : excel_writer   type ref to zif_excel_writer
                 , excel_as_xstring
                                  type xstring
                 , excel_as_xstring_bytecount
                                  type i
                 , excel_as_solix_stack
                                  type solix_tab
                 , mail_send_request
                                  type ref to cl_bcs
                 , mail_message   type ref to cl_document_bcs
                 , any_bcs_exception
                                  type ref to cx_bcs
                 , diagnostic     type string
                 , mail_title     type so_obj_des
                 , mail_text_stack
                                  type soli_tab
                 , mail_text_entry
                                  like line
                                    of mail_text_stack
                 , mail_attachment_subject
                                  type sood-objdes
                 , mail_attachment_bytecount
                                  type sood-objlen
                 , mail_attachment_header_stack
                                  type soli_tab
                 , mail_attachment_header_entry
                                  like line of mail_attachment_header_stack
                 , internet_email_recipient
                                  type ref to if_recipient_bcs
                 , successful_send
                                  type abap_bool
                 , file_name      type string
                 .
    " Much of the code here was lifted from method send_mail of
    " class lcl_ouput, defined in object ZDEMO_EXCEL_OUTPUTOPT_INCL:
    concatenate sy-repid          " this report name
                sy-datum          " current date
                sy-uzeit          " current time
                excel_file_type   " excel file extension
           into file_name.
    mail_title                    = file_name.
    mail_attachment_subject       = file_name.
    mail_text_entry               = 'See attachment'.
    append mail_text_entry
        to mail_text_stack.
    concatenate file_name_parameter
                file_name
           into mail_attachment_header_entry.
    append mail_attachment_header_entry
        to mail_attachment_header_stack.
    create object excel_writer type zcl_excel_writer_2007.
    excel_as_xstring              = excel_writer->write_file( excel ).
    excel_as_solix_stack          = cl_bcs_convert=>xstring_to_solix( iv_xstring = excel_as_xstring ).
    excel_as_xstring_bytecount    = xstrlen( excel_as_xstring ).
    mail_attachment_bytecount     = excel_as_xstring_bytecount.
    try.
      mail_message                = cl_document_bcs=>create_document(
                                      i_type    = 'RAW' "#EC NOTEXT
                                      i_text    = mail_text_stack
                                      i_subject = mail_title
                                      ).
      mail_message->add_attachment(
        i_attachment_type         = 'XLS' "#EC NOTEXT
        i_attachment_subject      = mail_attachment_subject
        i_attachment_size         = mail_attachment_bytecount
        i_att_content_hex         = excel_as_solix_stack
        i_attachment_header       = mail_attachment_header_stack
        ).
      mail_send_request           = cl_bcs=>create_persistent( ).
      mail_send_request->set_document( mail_message ).
      internet_email_recipient    = cl_cam_address_bcs=>create_internet_address( recipient ).
      mail_send_request->add_recipient( internet_email_recipient ).
      successful_send             = mail_send_request->send( ).
      commit work.
      if successful_send eq abap_false.
        message i500(sbcoms) with recipient.
      else.
        message s022(so).
        message 'Document ready to be sent - Check SOST' type 'I'.
      endif.
    catch cx_bcs into any_bcs_exception.
      diagnostic                  = any_bcs_exception->if_message~get_text( ).
      message diagnostic type 'I'.
    endtry.
endform.
Ich habe es ohne die salv Aufrufe ausprobiert. Es hat funktioniert.

Re: Interne Tabelle als Excel mit mehrere Blättern versenden

Beitrag von lisa (ForumUser / 53 / 8 / 1 ) »
PeterPaletti hat geschrieben:
18.02.2022 21:13
Das 1. Coding ist vollständig erst am Schluss des Blogs.
Es lautet:

Code: Alles auswählen.

report zz_report.
  types          : row_counter    type n length 02.
  types          : email_recipient
                                  type adr6-smtp_addr.
  data           : excel          type ref to zcl_excel ##NEEDED.
  parameters     : rowcount       type row_counter.
  parameters     : recipien       type email_recipient.
initialization.
  select single smtp_addr
    into recipien
    from adr6 ##WARN_OK
           inner join
         usr21 on usr21~persnumber eq adr6~persnumber
   where usr21~bname              eq sy-uname.
start-of-selection.
  perform display_flight_rows using rowcount.
  perform display_carrier_rows using rowcount.
  perform display_booking_rows using rowcount.
  perform send_excel_via_email using recipien.
form display_flight_rows using row_count
                                  type row_counter
                       raising zcx_excel.
    data         : flight_stack   type standard table of sflight
                 , alv_report     type ref to cl_salv_table
                 .
    try.
      call method cl_salv_table=>factory
        importing
          r_salv_table            = alv_report
        changing
          t_table                 = flight_stack.
    catch cx_salv_msg.
      return.
    endtry.
    select *
      into table flight_stack
      from sflight
             up to row_count rows.
    alv_report->display( ).
    perform copy_table_to_excel_worksheet using flight_stack 'Flights'.
endform.
form display_carrier_rows using row_count
                                  type row_counter
                        raising zcx_excel.
    data         : carrier_stack  type standard table of scarr
                 , alv_report     type ref to cl_salv_table
                 .
    try.
      call method cl_salv_table=>factory
        importing
          r_salv_table            = alv_report
        changing
          t_table                 = carrier_stack.
    catch cx_salv_msg.
      return.
    endtry.
    select *
      into table carrier_stack
      from scarr
             up to row_count rows.
    alv_report->display( ).
    perform copy_table_to_excel_worksheet using carrier_stack 'Carriers'.
endform.
form display_booking_rows using row_count
                                  type row_counter
                        raising zcx_excel.
    data         : booking_stack  type standard table of sbook
                 , alv_report     type ref to cl_salv_table
                 .
    try.
      call method cl_salv_table=>factory
        importing
          r_salv_table            = alv_report
        changing
          t_table                 = booking_stack.
    catch cx_salv_msg.
      return.
    endtry.
    select *
      into table booking_stack
      from sbook
             up to row_count rows.
    alv_report->display( ).
    perform copy_table_to_excel_worksheet using booking_stack 'Bookings'.
endform.
form copy_table_to_excel_worksheet using source_stack
                                           type standard table
                                         source_description
                                           type string
                                 raising zcx_excel.
    constants    : first_column   type char1     value 'A'
                 .
    data         : worksheet      type ref to zcl_excel_worksheet
                 , worksheet_title
                                  type zexcel_sheet_title
                 , table_settings type zexcel_s_table_settings
                 .
    table_settings-table_style    = zcl_excel_table=>builtinstyle_medium2.
    table_settings-show_row_stripes
                                  = abap_true.
    table_settings-nofilters      = abap_true.
    table_settings-top_left_column
                                  = first_column.
    table_settings-top_left_row   = 01.
    if excel is not bound.
      create object excel.
      worksheet                   = excel->get_active_worksheet( ).
    else.
      worksheet                   = excel->add_new_worksheet( ).
    endif.
    worksheet_title               = source_description.
    worksheet->set_title( worksheet_title ).
    worksheet->bind_table(
      ip_table                    = source_stack
      is_table_settings           = table_settings
      ).
endform.
form send_excel_via_email using recipient type email_recipient.
    constants    : excel_file_type
                                 type string value '.xlsx'
                 , file_name_parameter
                                  type string value '&SO_FILENAME='
                 .
    data         : excel_writer   type ref to zif_excel_writer
                 , excel_as_xstring
                                  type xstring
                 , excel_as_xstring_bytecount
                                  type i
                 , excel_as_solix_stack
                                  type solix_tab
                 , mail_send_request
                                  type ref to cl_bcs
                 , mail_message   type ref to cl_document_bcs
                 , any_bcs_exception
                                  type ref to cx_bcs
                 , diagnostic     type string
                 , mail_title     type so_obj_des
                 , mail_text_stack
                                  type soli_tab
                 , mail_text_entry
                                  like line
                                    of mail_text_stack
                 , mail_attachment_subject
                                  type sood-objdes
                 , mail_attachment_bytecount
                                  type sood-objlen
                 , mail_attachment_header_stack
                                  type soli_tab
                 , mail_attachment_header_entry
                                  like line of mail_attachment_header_stack
                 , internet_email_recipient
                                  type ref to if_recipient_bcs
                 , successful_send
                                  type abap_bool
                 , file_name      type string
                 .
    " Much of the code here was lifted from method send_mail of
    " class lcl_ouput, defined in object ZDEMO_EXCEL_OUTPUTOPT_INCL:
    concatenate sy-repid          " this report name
                sy-datum          " current date
                sy-uzeit          " current time
                excel_file_type   " excel file extension
           into file_name.
    mail_title                    = file_name.
    mail_attachment_subject       = file_name.
    mail_text_entry               = 'See attachment'.
    append mail_text_entry
        to mail_text_stack.
    concatenate file_name_parameter
                file_name
           into mail_attachment_header_entry.
    append mail_attachment_header_entry
        to mail_attachment_header_stack.
    create object excel_writer type zcl_excel_writer_2007.
    excel_as_xstring              = excel_writer->write_file( excel ).
    excel_as_solix_stack          = cl_bcs_convert=>xstring_to_solix( iv_xstring = excel_as_xstring ).
    excel_as_xstring_bytecount    = xstrlen( excel_as_xstring ).
    mail_attachment_bytecount     = excel_as_xstring_bytecount.
    try.
      mail_message                = cl_document_bcs=>create_document(
                                      i_type    = 'RAW' "#EC NOTEXT
                                      i_text    = mail_text_stack
                                      i_subject = mail_title
                                      ).
      mail_message->add_attachment(
        i_attachment_type         = 'XLS' "#EC NOTEXT
        i_attachment_subject      = mail_attachment_subject
        i_attachment_size         = mail_attachment_bytecount
        i_att_content_hex         = excel_as_solix_stack
        i_attachment_header       = mail_attachment_header_stack
        ).
      mail_send_request           = cl_bcs=>create_persistent( ).
      mail_send_request->set_document( mail_message ).
      internet_email_recipient    = cl_cam_address_bcs=>create_internet_address( recipient ).
      mail_send_request->add_recipient( internet_email_recipient ).
      successful_send             = mail_send_request->send( ).
      commit work.
      if successful_send eq abap_false.
        message i500(sbcoms) with recipient.
      else.
        message s022(so).
        message 'Document ready to be sent - Check SOST' type 'I'.
      endif.
    catch cx_bcs into any_bcs_exception.
      diagnostic                  = any_bcs_exception->if_message~get_text( ).
      message diagnostic type 'I'.
    endtry.
endform.
Ich habe es ohne die salv Aufrufe ausprobiert. Es hat funktioniert.
Danke für deine Hilfe.
ich habe den Code bei mir kopiert und hat leider nicht funktioniert, weil die Typ zcx_excel unbekannt ist (s. Screenshot). Die Klasse zcl_excel_worksheet, zcl_excel_table, das Interface zif_excel_writer sollen auch unbekannt sein. Wie kann das Programm bei dir funktionieren, wenn diese Sachen fehlen? Das habe ich nicht verstanden.

Viele Grüße
Lisa

Re: Interne Tabelle als Excel mit mehrere Blättern versenden

Beitrag von qyurryus (Specialist / 114 / 88 / 46 ) »
Das sind Komponenten von ABAP2XSLX, das musst du dir dafür importieren.
https://github.com/abap2xlsx/abap2xlsx

Vergleichbare Themen

5
Antw.
6324
Views
Interne Tabelle als Mail versenden
von SaskuAc » 12.03.2018 14:38 • Verfasst in ABAP® Core
5
Antw.
5399
Views
Interne Tabelle als XML-Datei versenden
von debianfan » 26.07.2017 15:47 • Verfasst in ABAP Objects®
6
Antw.
8782
Views
ALV Tabelle als Excel in Mail versenden
von Dyrdek » 16.01.2017 09:34 • Verfasst in ABAP® Core
4
Antw.
3193
Views
Interne Tabelle in Excel schreiben
von mamba » 12.12.2006 15:36 • Verfasst in ABAP® Core
31
Antw.
26564
Views
Interne Tabelle als Excel-Datei speichern
von Bright4.5 » 22.08.2018 13:50 • Verfasst in ABAP® für Anfänger

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.