Funktionsbaustein ALSM_EXCEL_TO_INTERNAL_TABLE Thema ist als GELÖST markiert

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
7 Beiträge • Seite 1 von 1
7 Beiträge Seite 1 von 1

Funktionsbaustein ALSM_EXCEL_TO_INTERNAL_TABLE

Beitrag von SAP_ENTWICKLER (Specialist / 445 / 219 / 6 ) » 27.12.2017 09:35
Hallo,

Mit dem FuBa möchte ich die Daten einer Excel-Datei in eine interne Tabelle meines Reports laden. Dafür wird an verschiedenen Stellen im Netz der genannte Funktionsbaustein empfohlen.

Code: Alles auswählen.

CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_file
      i_begin_col             = gc_start_col
      i_begin_row             = gc_start_row
      i_end_col               = gc_max_col
      i_end_row               = gc_max_row
    TABLES
      intern                  = gt_werte
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.
Soweit, so gut, leider kommen in der internen Tabelle keine Daten an, es gibt keine Fehlermeldung, also SY-SUBRC ist 0. Die Excel-Datei ist gefüllt.

Ich arbeite unter Citrix und der Testdatenbestand ist dort unter meinem User im Verzeichnis abgelegt.

Zur Auswahl der Datei nutze ich

Code: Alles auswählen.

 CALL METHOD cl_gui_frontend_services=>file_open_dialog
    CHANGING
      file_table              = lt_file_table
.
.
.
.
.
Dort wird mein Datenbestand von der Methode auch gefunden.

Ist die Citrix-Umgebung das Problem?


Vielen Dank und viele Grüße
Norbert


Re: Funktionsbaustein ALSM_EXCEL_TO_INTERNAL_TABLE

Beitrag von Romaniac (Specialist / 124 / 33 / 22 ) » 27.12.2017 12:21
Hallo,

schau doch mal im Debugger ob die Datei überhaupt geöffnet werden kann, also ob das SAP System die nötigen Rechte hat? Dann ist es so dass dieser Baustein Excel öffnet, den von Dir angegeben Bereich markiert und in eine interne Tabelle schreibt, dazu muss natürlich auch Excel auf der CITRIX Seite installiert sein. Und die Datei muss auf einem Laufwerk liegen auf das die CITRIX Umgebung auch Zugriff hat. Mit CITRIX selbst hatte ich mit diesem Baustein nie Probleme.

Gruß Wolfgang

Folgende Benutzer bedankten sich beim Autor Romaniac für den Beitrag:
SAP_ENTWICKLER

Geht nicht gibts nicht

Re: Funktionsbaustein ALSM_EXCEL_TO_INTERNAL_TABLE

Beitrag von abuma (Specialist / 101 / 36 / 14 ) » 27.12.2017 12:26
huhu,

zur Sicherheit vielleicht mal den Funktionsbaustein via SE37 testen.

Den kompletten Pfad bei Filename angeben z.B. C:\USERS\....\EXCEL.XLSX

Liebe Grüße
abuma

Folgende Benutzer bedankten sich beim Autor abuma für den Beitrag:
SAP_ENTWICKLER


Re: Funktionsbaustein ALSM_EXCEL_TO_INTERNAL_TABLE

Beitrag von Romaniac (Specialist / 124 / 33 / 22 ) » 27.12.2017 13:50
Ich habe auch mal eine Methode geschrieben die jedes beliebige oder mehrere Tabellenblätter aus einer Exceldatei lesen und übergeben kann. Bei Bedarf einfach melden.

Folgende Benutzer bedankten sich beim Autor Romaniac für den Beitrag:
SAP_ENTWICKLER

Geht nicht gibts nicht

Re: Funktionsbaustein ALSM_EXCEL_TO_INTERNAL_TABLE

Beitrag von deejey (Specialist / 330 / 92 / 27 ) » 23.01.2018 03:34
Und vorsicht: es gab mal eine Beschränkung auf max. 30 Zeichen pro Zelle, weiß nicht ob das immer noch so ist.

Re: Funktionsbaustein ALSM_EXCEL_TO_INTERNAL_TABLE

Beitrag von tar (ForumUser / 1 / 0 / 0 ) » 31.08.2020 21:13
Romaniac hat geschrieben:
27.12.2017 13:50
Ich habe auch mal eine Methode geschrieben die jedes beliebige oder mehrere Tabellenblätter aus einer Exceldatei lesen und übergeben kann. Bei Bedarf einfach melden.
Diese Methode wäre sehr hilfreich. Kannst du sie bitte reinstellen?

Re: Funktionsbaustein ALSM_EXCEL_TO_INTERNAL_TABLE

Beitrag von Romaniac (Specialist / 124 / 33 / 22 ) » 25.09.2020 15:30
Sorry hab das erst jetzt gelesen. Leider komme ich an das System beim Kunden nicht mehr ran, ich habe zwar den Code aber leider den Aufbau der Rückgabestruktur nicht mehr. Soweit ich mich erinnere war das eine Tabelle die in der ersten Spalte den Namen des Tabellenblattes hatte und in der zweiten die interne tabelle vom Typ alsmex_tabline mit allen Werten pro Spalte/Zeile:

Code: Alles auswählen.

@78\QImporting@	VALUE( I_FILENAME )	TYPE RLGRAP-FILENAME	Lokale Datei für Upload bzw. Download
@78\QImporting@	VALUE( I_BEGIN_COL )	TYPE I	
@78\QImporting@	VALUE( I_BEGIN_ROW )	TYPE I	
@78\QImporting@	VALUE( I_END_COL )	TYPE I	
@78\QImporting@	VALUE( I_END_ROW )	TYPE I	
@78\QImporting@	VALUE( IT_TAB_SHEET_NAMES )	TYPE TABLE	
@79\QExporting@	VALUE( ET_ALSMEX_TABLINES )	TYPE ZT_ALSMEX_TABLINES	Tabelle für Exceldaten
@03\QException@	INCONSISTENT_PARAMETERS		inconsistent parameters
@03\QException@	UPLOAD_OLE		UPLOAD OLE





METHOD excel_all_sheets_to_itab.
  TYPE-POOLS: ole2.

  TYPES:
    BEGIN OF tp_excel_tab,
      line(4096) TYPE c,
    END OF tp_excel_tab.

  DATA: t_excel_tab      TYPE TABLE OF tp_excel_tab,
        t_alsmex_tabline TYPE TABLE OF alsmex_tabline,
        ld_separator     TYPE  c,
        application      TYPE  ole2_object,
        workbook         TYPE  ole2_object,
        range            TYPE  ole2_object,
        worksheet        TYPE  ole2_object,
        h_cell           TYPE  ole2_object,
        h_cell1          TYPE  ole2_object,
        ld_rc            TYPE i,

        ls_sheet_name    TYPE string,

        l_sic_tabix      LIKE sy-tabix,
        l_sic_col        TYPE kcd_ex_col,
        l_fdpos          LIKE sy-fdpos.

  FIELD-SYMBOLS:
    <w_tab_sheet_names>  TYPE ANY,
    <w_excel_tablines>   TYPE alsmex_tabline,
    <w_alsmex_tablines>  TYPE ANY,
    <w_alsmex_tabline>   TYPE alsmex_tabline,
    <w_excel_tab>        TYPE string.

* Makro für Fehlerbehandlung der Methods
  DEFINE m_message.
    case sy-subrc.
      when 0.
      when 1.
        message id sy-msgid type sy-msgty number sy-msgno
                with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      when others. raise upload_ole.
    endcase.
  END-OF-DEFINITION.

* check parameters
  IF i_begin_row > i_end_row. RAISE inconsistent_parameters. ENDIF.
  IF i_begin_col > i_end_col. RAISE inconsistent_parameters. ENDIF.

* Get TAB-sign for separation of fields
  CLASS cl_abap_char_utilities DEFINITION LOAD.
  ld_separator = cl_abap_char_utilities=>horizontal_tab.

* open file in Excel
  IF application-header = space OR application-handle = -1.
    CREATE OBJECT application 'Excel.Application'.
    m_message.
  ENDIF.

  CALL METHOD OF application 'Workbooks' = workbook.
  m_message.
  CALL METHOD OF workbook 'Open'
    EXPORTING
    #1 = i_filename.
  m_message.

*  SET PROPERTY OF application 'VISIBLE' = 1.

  LOOP AT it_tab_sheet_names ASSIGNING <w_tab_sheet_names>.
    CALL METHOD OF application 'Worksheets' = worksheet EXPORTING #1 = <w_tab_sheet_names>.
    IF sy-subrc <> 0.
      CONTINUE.
    ENDIF.

    CALL METHOD OF worksheet 'Activate'.
    m_message.

**** ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
***    CALL METHOD OF worksheet 'Cells' = i_end_col
***      EXPORTING
***      #1 = 'Rows.Count'
***      #2 = 1
***      #3 = 'End(xlUp)'
***      #4 = 'Row'.

* mark whole spread sheet
    CALL METHOD OF worksheet 'Cells' = h_cell
      EXPORTING
      #1 = i_begin_row
      #2 = i_begin_col.
    m_message.
    CALL METHOD OF worksheet 'Cells' = h_cell1
      EXPORTING
      #1 = i_end_row
      #2 = i_end_col.
    m_message.

    CALL METHOD OF worksheet 'RANGE' = range
      EXPORTING
      #1 = h_cell
      #2 = h_cell1.
    m_message.

    CALL METHOD OF range 'SELECT'.
    m_message.

* copy marked area (whole spread sheet) into Clippboard
    CALL METHOD OF range 'COPY'.
    m_message.

* read clipboard into ABAP
    CALL METHOD cl_gui_frontend_services=>clipboard_import
      IMPORTING
        data       = t_excel_tab
      EXCEPTIONS
        cntl_error = 1
        OTHERS     = 4.
    IF sy-subrc <> 0.
      MESSAGE a037(alsmex).
    ENDIF.

    CALL METHOD /fsc/cl_rw_tools=>excel_sep_to_intern_convert
      EXPORTING
        it_excel_tab      = t_excel_tab
        i_separator       = ld_separator
      IMPORTING
        et_alsmex_tabline = t_alsmex_tabline.
    IF NOT t_alsmex_tabline[] IS INITIAL.

* Insert excel table sheet name with index 0 0
      INSERT INITIAL LINE INTO t_alsmex_tabline ASSIGNING <w_alsmex_tabline> INDEX 1.
      <w_alsmex_tabline>-row   = '0001'.
      <w_alsmex_tabline>-col   = '0000'.
      <w_alsmex_tabline>-value = <w_tab_sheet_names>.

* append values of excel sheet to table with all sheet data
      APPEND INITIAL LINE TO et_alsmex_tablines ASSIGNING <w_alsmex_tablines>.
      <w_alsmex_tablines> = t_alsmex_tabline.
      FREE t_alsmex_tabline.
    ENDIF.

* clear clipboard
    REFRESH t_excel_tab.
    CALL METHOD cl_gui_frontend_services=>clipboard_export
       IMPORTING
          data                 = t_excel_tab
       CHANGING
          rc                   = ld_rc
       EXCEPTIONS
          cntl_error           = 1
*       ERROR_NO_GUI         = 2
*       NOT_SUPPORTED_BY_GUI = 3
          OTHERS               = 4
            .

  ENDLOOP.

* quit Excel and free ABAP Object - unfortunately, this does not kill
* the Excel process
  CALL METHOD OF application 'QUIT'.
  m_message.

* >>>>> Begin of change note 575877
* to kill the Excel process it's necessary to free all used objects
  FREE OBJECT: h_cell,
               h_cell1,
               range,
               worksheet,
               workbook,
               application.
* <<<<< End of change note 575877

ENDMETHOD.
Und noch ein Aufruf:

Code: Alles auswählen.

FORM customer_excel_read.
  TYPES:
    BEGIN OF ltp_field_changes,
      table_name  TYPE tabname,
      field_name  TYPE string,
      field_value TYPE string,
    END OF ltp_field_changes.

  DATA:
    lt_excel_tablines  TYPE zt_alsmex_tablines,
    lv_filename        TYPE localfile,
    ls_string          TYPE string.

  FIELD-SYMBOLS:
    <lw_col_value>       TYPE ANY,
    <lw_excel_tablines>  TYPE zt_alsmex_tabline,
    <lw_excel_tabline>   TYPE alsmex_tabline.

  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = 10
      text       = text-p02.

  lv_filename = p_file.
  CALL METHOD /fsc/cl_rw_tools=>excel_all_sheets_to_itab
    EXPORTING
      i_filename              = lv_filename
      i_begin_col             = 1
      i_begin_row             = 1
      i_end_col               = 40
      i_end_row               = 200
      it_tab_sheet_names      = t_tab_sheet_names
    IMPORTING
      et_alsmex_tablines      = lt_excel_tablines
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  LOOP AT lt_excel_tablines ASSIGNING <lw_excel_tablines>.
    LOOP AT <lw_excel_tablines> ASSIGNING <lw_excel_tabline>.
      AT NEW row.
        APPEND INITIAL LINE TO t_input ASSIGNING <w_input>.
      ENDAT.

      CONCATENATE '<W_INPUT>-COL' <lw_excel_tabline>-col+2(2) INTO ls_string.
      ASSIGN (ls_string) TO <lw_col_value>.
      <lw_col_value> = <lw_excel_tabline>-value.
    ENDLOOP.
  ENDLOOP.

ENDFORM.                    " excel_file_read

Sollte das nicht reichen kann ich beim Kollegen in der Firma nochmal nachfragen.

Gruß Wolfgang
Geht nicht gibts nicht

Seite 1 von 1

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und besseren Inhalt:

Vergleichbare Themen

display a Internal table on a SmartForm
von jamiguel77 » 31.12.2014 20:15
Funktionsbaustein mit EXCEl auslesen
von chris-rookie » 29.01.2007 14:16
RFC Funktionsbaustein aus Excel aufrufen
von neuer Gast » 22.02.2006 09:26
Table Control - Excel Download
von robz » 27.11.2006 16:30
Mit Funktionsbaustein auf Excel-Tabellenblatt zugreifen
von Michi » 22.10.2005 14:23