GET_TABLE skip bottom empty rows (#959)

Fix #787

Co-authored-by: sandraros <sandra.rossi@gmail.com>
Co-authored-by: Abo <andrea@borgia.bo.it>
This commit is contained in:
sandraros 2022-01-15 18:32:56 +01:00 committed by GitHub
parent cc291983d7
commit c3481d5d90
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 84 additions and 35 deletions

View File

@ -23,35 +23,56 @@ DATA: lo_excel TYPE REF TO zcl_excel,
lo_reader TYPE REF TO zif_excel_reader,
lo_worksheet TYPE REF TO zcl_excel_worksheet,
lo_salv TYPE REF TO cl_salv_table.
DATA: lo_error TYPE REF TO cx_root.
"
"Ask User to choose a path
"
cl_gui_frontend_services=>file_open_dialog( EXPORTING window_title = 'Excel selection'
file_filter = '*.xlsx'
multiselection = abap_false
CHANGING file_table = lt_filetable " Tabelle, die selektierte Dateien enthält
rc = lv_subrc
EXCEPTIONS file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5 ).
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
CREATE OBJECT lo_reader TYPE zcl_excel_reader_2007.
LOOP AT lt_filetable INTO ls_filetable.
lo_excel = lo_reader->load_file( ls_filetable-filename ).
lo_worksheet = lo_excel->get_worksheet_by_index( iv_index = 1 ).
lo_worksheet->get_table( IMPORTING et_table = lt_tab ).
ENDLOOP.
ENDIF.
"
"Do the presentation stuff
"
PARAMETERS p_file TYPE string LOWER CASE.
PARAMETERS p_skip_b AS CHECKBOX.
cl_salv_table=>factory( IMPORTING r_salv_table = lo_salv
CHANGING t_table = lt_tab ).
lo_salv->display( ).
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
"
"Ask User to choose a path
"
cl_gui_frontend_services=>file_open_dialog( EXPORTING window_title = 'Excel selection'
file_filter = '*.xlsx'
multiselection = abap_false
CHANGING file_table = lt_filetable " Tabelle, die selektierte Dateien enthält
rc = lv_subrc
EXCEPTIONS file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5 ).
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
DELETE lt_filetable FROM 2.
READ TABLE lt_filetable INDEX 1 INTO ls_filetable.
IF sy-subrc = 0.
p_file = ls_filetable-filename.
ENDIF.
START-OF-SELECTION.
TRY.
CREATE OBJECT lo_reader TYPE zcl_excel_reader_2007.
lo_excel = lo_reader->load_file( p_file ).
lo_worksheet = lo_excel->get_worksheet_by_index( iv_index = 1 ).
lo_worksheet->get_table(
EXPORTING
iv_skip_bottom_empty_rows = p_skip_b
IMPORTING
et_table = lt_tab ).
"
"Do the presentation stuff
"
cl_salv_table=>factory( IMPORTING r_salv_table = lo_salv
CHANGING t_table = lt_tab ).
lo_salv->display( ).
CATCH cx_root INTO lo_error.
MESSAGE lo_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.

View File

@ -15,6 +15,18 @@
<ENTRY>abap2xlsx Demo: Demo 43 GET_TABLE</ENTRY>
<LENGTH>33</LENGTH>
</item>
<item>
<ID>S</ID>
<KEY>P_FILE</KEY>
<ENTRY>Excel file</ENTRY>
<LENGTH>18</LENGTH>
</item>
<item>
<ID>S</ID>
<KEY>P_SKIP_B</KEY>
<ENTRY>Skip bottom empty rows</ENTRY>
<LENGTH>30</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>

View File

@ -590,12 +590,13 @@ CLASS zcl_excel_worksheet DEFINITION
zcx_excel .
METHODS get_table
IMPORTING
!iv_skipped_rows TYPE int4 DEFAULT 0
!iv_skipped_cols TYPE int4 DEFAULT 0
!iv_max_col TYPE int4 OPTIONAL
!iv_max_row TYPE int4 OPTIONAL
!iv_skipped_rows TYPE int4 DEFAULT 0
!iv_skipped_cols TYPE int4 DEFAULT 0
!iv_max_col TYPE int4 OPTIONAL
!iv_max_row TYPE int4 OPTIONAL
!iv_skip_bottom_empty_rows TYPE abap_bool DEFAULT abap_false
EXPORTING
!et_table TYPE STANDARD TABLE
!et_table TYPE STANDARD TABLE
RAISING
zcx_excel .
METHODS set_merge_style
@ -2643,6 +2644,7 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
DATA lx_conversion_error TYPE REF TO cx_sy_conversion_error.
DATA lv_float TYPE f.
DATA lv_type.
DATA lv_tabix TYPE i.
lv_max_col = me->get_highest_column( ).
IF iv_max_col IS SUPPLIED AND iv_max_col < lv_max_col.
@ -2747,6 +2749,20 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
ENDWHILE.
ADD 1 TO lv_actual_row.
ENDWHILE.
IF iv_skip_bottom_empty_rows = abap_true.
lv_tabix = lines( et_table ).
WHILE lv_tabix >= 1.
READ TABLE et_table INDEX lv_tabix ASSIGNING <ls_line>.
ASSERT sy-subrc = 0.
IF <ls_line> IS NOT INITIAL.
EXIT.
ENDIF.
DELETE et_table INDEX lv_tabix.
lv_tabix = lv_tabix - 1.
ENDWHILE.
ENDIF.
ENDIF.