From 0c68ff0c796435172f13cc3825c372aa35998dda Mon Sep 17 00:00:00 2001 From: Bernd <135710507+darnoc312@users.noreply.github.com> Date: Tue, 11 Jun 2024 11:54:08 +0200 Subject: [PATCH 1/5] Update zcl_excel_reader_2007.clas.abap --- src/zcl_excel_reader_2007.clas.abap | 105 +++++++++++++--------------- 1 file changed, 48 insertions(+), 57 deletions(-) diff --git a/src/zcl_excel_reader_2007.clas.abap b/src/zcl_excel_reader_2007.clas.abap index 53fc484..5f73064 100644 --- a/src/zcl_excel_reader_2007.clas.abap +++ b/src/zcl_excel_reader_2007.clas.abap @@ -22,10 +22,6 @@ CLASS zcl_excel_reader_2007 DEFINITION id TYPE string, type TYPE string, target TYPE string, - targetmode TYPE string, - worksheet TYPE REF TO zcl_excel_worksheet, - sheetid TYPE string, "ins #235 - repeat rows/cols - needed to identify correct sheet - localsheetid TYPE string, END OF t_relationship . TYPES: BEGIN OF t_fileversion, @@ -1829,7 +1825,7 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. lv_full_filename TYPE string, lo_rels_workbook TYPE REF TO if_ixml_document, - lt_worksheets TYPE STANDARD TABLE OF t_relationship WITH NON-UNIQUE DEFAULT KEY, + lt_sheetrelations TYPE STANDARD TABLE OF t_relationship WITH NON-UNIQUE DEFAULT KEY, lo_workbook TYPE REF TO if_ixml_document, lv_workbook_index TYPE i, lv_worksheet_path TYPE string, @@ -1840,6 +1836,7 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. lo_worksheet TYPE REF TO zcl_excel_worksheet, lo_range TYPE REF TO zcl_excel_range, lv_worksheet_title TYPE zexcel_sheet_title, + lt_worksheets LIKE TABLE OF lo_worksheet, lv_tabix TYPE i, " #235 - repeat rows/cols. Needed to link defined name to correct worksheet ls_range TYPE t_range, @@ -1864,7 +1861,6 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. *--------------------------------------------------------------------* * #229: Set active worksheet - end data declarations *--------------------------------------------------------------------* - FIELD-SYMBOLS: TYPE t_relationship. *--------------------------------------------------------------------* @@ -1962,7 +1958,7 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. * thus we only store this information for use when parsing the workbookfile for sheetinformations *--------------------------------------------------------------------* WHEN lcv_worksheet. - APPEND ls_relationship TO lt_worksheets. + APPEND ls_relationship TO lt_sheetrelations. *--------------------------------------------------------------------* * §2.2 Styles - This holds the styles that are used in all worksheets @@ -1996,12 +1992,12 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. lo_workbook = me->get_ixml_from_zip_archive( iv_workbook_full_filename ). *--------------------------------------------------------------------* -* §3.1 Names and order of of worksheets +* §3.1 Names and O R D E R of worksheets *--------------------------------------------------------------------* lo_node ?= lo_workbook->find_from_name_ns( name = 'sheet' uri = namespace-main ). - lv_workbook_index = 1. WHILE lo_node IS BOUND. + lv_workbook_index = sy-index. me->fill_struct_from_attributes( EXPORTING ip_element = lo_node CHANGING @@ -2035,19 +2031,16 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. *--------------------------------------------------------------------* * Load worksheetdata *--------------------------------------------------------------------* - READ TABLE lt_worksheets ASSIGNING WITH KEY id = ls_sheet-id. + READ TABLE lt_worksheets INTO ls_relationship WITH KEY id = ls_sheet-id. "rId IF sy-subrc = 0. - -sheetid = ls_sheet-sheetid. "ins #235 - repeat rows/cols - needed to identify correct sheet - -localsheetid = |{ lv_workbook_index - 1 }|. - CONCATENATE lv_path -target + CONCATENATE lv_path ls_relationship-target INTO lv_worksheet_path. me->load_worksheet( ip_path = lv_worksheet_path io_worksheet = lo_worksheet ). - -worksheet = lo_worksheet. + APPEND lo_worksheet TO lt_worksheets. "in this order (§3.1) for localsheetid ENDIF. lo_node ?= lo_node->get_next( ). - ADD 1 TO lv_workbook_index. ENDWHILE. SORT lt_worksheets BY sheetid. " needed for localSheetid -referencing @@ -2097,12 +2090,11 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. lv_range_value = lo_node->get_value( ). IF ls_range-localsheetid IS NOT INITIAL. " issue #163+ -* READ TABLE lt_worksheets ASSIGNING WITH KEY id = ls_range-localsheetid. "del issue #235 - repeat rows/cols " issue #163+ -* lo_range = -worksheet->add_new_range( ). "del issue #235 - repeat rows/cols " issue #163+ *--------------------------------------------------------------------* * issue#235 - repeat rows/columns - begin *--------------------------------------------------------------------* - READ TABLE lt_worksheets ASSIGNING WITH KEY localsheetid = ls_range-localsheetid. + lv_tabix = ls_range-localsheetid + 1. + READ TABLE lt_worksheets INTO lo_worksheet INDEX lv_tabix. IF sy-subrc = 0. CASE ls_range-name. @@ -2119,7 +2111,7 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. e_row_end = ls_area-row_end ). ls_area-col_start = zcl_excel_common=>convert_column2int( lv_col_start_alpha ). ls_area-col_end = zcl_excel_common=>convert_column2int( lv_col_end_alpha ). - lo_autofilter = io_excel->add_new_autofilter( io_sheet = -worksheet ) . + lo_autofilter = io_excel->add_new_autofilter( io_sheet = lo_worksheet ) . lo_autofilter->set_filter_area( is_area = ls_area ). CATCH zcx_excel. " we expected a range but it was not usable, so just ignore it @@ -2130,18 +2122,16 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. * repeat print rows/columns *--------------------------------------------------------------------* WHEN zif_excel_sheet_printsettings=>gcv_print_title_name. - lo_range = -worksheet->add_new_range( ). - lo_range->name = zif_excel_sheet_printsettings=>gcv_print_title_name. *--------------------------------------------------------------------* * This might be a temporary solution. Maybe ranges get be reworked * to support areas consisting of multiple rectangles * But for now just split the range into row and columnpart *--------------------------------------------------------------------* - CLEAR:lv_range_value_1, - lv_range_value_2. - IF lv_range_value IS INITIAL. -* Empty --> nothing to do - ELSE. + IF lv_range_value IS NOT INITIAL. +* We don't need a range object here no more, because since the +* parameter i_allow_1dim_range is passed below anything works +* fine within worksheet's method print_title_set_range, which +* now creates the range object and sets name and value correctly. IF lv_range_value(1) = `'`. " Escaped lv_regex = `^('[^']*')+![^,]*,`. ELSE. @@ -2155,42 +2145,44 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. lv_range_value_1 = lv_range_value(lv_position_temp). ELSE. lv_range_value_1 = lv_range_value. + CLEAR lv_range_value_2. ENDIF. - ENDIF. * 1st range - zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = lv_range_value_1 - i_allow_1dim_range = abap_true - IMPORTING e_column_start = lv_col_start_alpha - e_column_end = lv_col_end_alpha - e_row_start = lv_row_start - e_row_end = lv_row_end ). - IF lv_col_start_alpha IS NOT INITIAL. - -worksheet->zif_excel_sheet_printsettings~set_print_repeat_columns( iv_columns_from = lv_col_start_alpha - iv_columns_to = lv_col_end_alpha ). - ENDIF. - IF lv_row_start IS NOT INITIAL. - -worksheet->zif_excel_sheet_printsettings~set_print_repeat_rows( iv_rows_from = lv_row_start - iv_rows_to = lv_row_end ). - ENDIF. - + zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = lv_range_value_1 + i_allow_1dim_range = abap_true + IMPORTING e_column_start = lv_col_start_alpha + e_column_end = lv_col_end_alpha + e_row_start = lv_row_start + e_row_end = lv_row_end ). + IF lv_col_start_alpha IS NOT INITIAL. + lo_worksheet->zif_excel_sheet_printsettings~set_print_repeat_columns( iv_columns_from = lv_col_start_alpha + iv_columns_to = lv_col_end_alpha ). + ENDIF. + IF lv_row_start IS NOT INITIAL. + lo_worksheet->zif_excel_sheet_printsettings~set_print_repeat_rows( iv_rows_from = lv_row_start + iv_rows_to = lv_row_end ). + ENDIF. * 2nd range - zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = lv_range_value_2 - i_allow_1dim_range = abap_true - IMPORTING e_column_start = lv_col_start_alpha - e_column_end = lv_col_end_alpha - e_row_start = lv_row_start - e_row_end = lv_row_end ). - IF lv_col_start_alpha IS NOT INITIAL. - -worksheet->zif_excel_sheet_printsettings~set_print_repeat_columns( iv_columns_from = lv_col_start_alpha - iv_columns_to = lv_col_end_alpha ). - ENDIF. - IF lv_row_start IS NOT INITIAL. - -worksheet->zif_excel_sheet_printsettings~set_print_repeat_rows( iv_rows_from = lv_row_start - iv_rows_to = lv_row_end ). + zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = lv_range_value_2 + i_allow_1dim_range = abap_true + IMPORTING e_column_start = lv_col_start_alpha + e_column_end = lv_col_end_alpha + e_row_start = lv_row_start + e_row_end = lv_row_end ). + IF lv_col_start_alpha IS NOT INITIAL. + lo_worksheet->zif_excel_sheet_printsettings~set_print_repeat_columns( iv_columns_from = lv_col_start_alpha + iv_columns_to = lv_col_end_alpha ). + ENDIF. + IF lv_row_start IS NOT INITIAL. + lo_worksheet->zif_excel_sheet_printsettings~set_print_repeat_rows( iv_rows_from = lv_row_start + iv_rows_to = lv_row_end ). + ENDIF. + ELSE. + lo_range = lo_worksheet->add_new_range( ). ENDIF. WHEN OTHERS. - lo_range = -worksheet->add_new_range( ). + lo_range = lo_worksheet->add_new_range( ). ENDCASE. ENDIF. @@ -2200,7 +2192,6 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. ELSE. " issue #163+ lo_range = io_excel->add_new_range( ). " issue #163+ ENDIF. " issue #163+ -* lo_range = ip_excel->add_new_range( ). " issue #163- IF lo_range IS BOUND. "ins issue #235 - repeat rows/cols lo_range->name = ls_range-name. lo_range->set_range_value( lv_range_value ). From be2b57a4fa4104ba7d0ef9e35b18a78113a0e3b4 Mon Sep 17 00:00:00 2001 From: Bernd <135710507+darnoc312@users.noreply.github.com> Date: Tue, 11 Jun 2024 12:03:36 +0200 Subject: [PATCH 2/5] Update zcl_excel_reader_2007.clas.abap --- src/zcl_excel_reader_2007.clas.abap | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/zcl_excel_reader_2007.clas.abap b/src/zcl_excel_reader_2007.clas.abap index 5f73064..0005f79 100644 --- a/src/zcl_excel_reader_2007.clas.abap +++ b/src/zcl_excel_reader_2007.clas.abap @@ -2031,7 +2031,7 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. *--------------------------------------------------------------------* * Load worksheetdata *--------------------------------------------------------------------* - READ TABLE lt_worksheets INTO ls_relationship WITH KEY id = ls_sheet-id. "rId + READ TABLE lt_sheetrelations INTO ls_relationship WITH KEY id = ls_sheet-id. "rId IF sy-subrc = 0. CONCATENATE lv_path ls_relationship-target INTO lv_worksheet_path. @@ -2043,7 +2043,6 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. lo_node ?= lo_node->get_next( ). ENDWHILE. - SORT lt_worksheets BY sheetid. " needed for localSheetid -referencing *--------------------------------------------------------------------* * #284: Set active worksheet - Resolve referenced formulae to From 33247032a8581b8089f327db125bc8715703952d Mon Sep 17 00:00:00 2001 From: Bernd <135710507+darnoc312@users.noreply.github.com> Date: Fri, 14 Jun 2024 15:31:43 +0200 Subject: [PATCH 3/5] Update zcl_excel_reader_2007.clas.abap --- src/zcl_excel_reader_2007.clas.abap | 80 ++++++++++++++--------------- 1 file changed, 39 insertions(+), 41 deletions(-) diff --git a/src/zcl_excel_reader_2007.clas.abap b/src/zcl_excel_reader_2007.clas.abap index 0005f79..c5b7238 100644 --- a/src/zcl_excel_reader_2007.clas.abap +++ b/src/zcl_excel_reader_2007.clas.abap @@ -2126,58 +2126,56 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. * to support areas consisting of multiple rectangles * But for now just split the range into row and columnpart *--------------------------------------------------------------------* - IF lv_range_value IS NOT INITIAL. -* We don't need a range object here no more, because since the -* parameter i_allow_1dim_range is passed below anything works -* fine within worksheet's method print_title_set_range, which -* now creates the range object and sets name and value correctly. + CLEAR:lv_range_value_1, + lv_range_value_2. + IF lv_range_value IS INITIAL. +* Empty --> nothing to do + ELSE. IF lv_range_value(1) = `'`. " Escaped lv_regex = `^('[^']*')+![^,]*,`. ELSE. lv_regex = `^[^!]*![^,]*,`. ENDIF. * Split into two ranges if necessary - FIND REGEX lv_regex IN lv_range_value MATCH LENGTH lv_position_temp. - IF sy-subrc = 0 AND lv_position_temp > 0. - lv_range_value_2 = lv_range_value+lv_position_temp. - SUBTRACT 1 FROM lv_position_temp. - lv_range_value_1 = lv_range_value(lv_position_temp). + FIND REGEX lv_regex IN lv_range_value MATCH LENGTH sy-fdpos. + IF sy-subrc = 0 AND sy-fdpos > 0. + lv_range_value_2 = lv_range_value+sy-fdpos. + SUBTRACT 1 FROM sy-fdpos. + lv_range_value_1 = lv_range_value(sy-fdpos). ELSE. lv_range_value_1 = lv_range_value. - CLEAR lv_range_value_2. ENDIF. + ENDIF. * 1st range - zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = lv_range_value_1 - i_allow_1dim_range = abap_true - IMPORTING e_column_start = lv_col_start_alpha - e_column_end = lv_col_end_alpha - e_row_start = lv_row_start - e_row_end = lv_row_end ). - IF lv_col_start_alpha IS NOT INITIAL. - lo_worksheet->zif_excel_sheet_printsettings~set_print_repeat_columns( iv_columns_from = lv_col_start_alpha - iv_columns_to = lv_col_end_alpha ). - ENDIF. - IF lv_row_start IS NOT INITIAL. - lo_worksheet->zif_excel_sheet_printsettings~set_print_repeat_rows( iv_rows_from = lv_row_start - iv_rows_to = lv_row_end ). - ENDIF. + zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = lv_range_value_1 + i_allow_1dim_range = abap_true + IMPORTING e_column_start = lv_col_start_alpha + e_column_end = lv_col_end_alpha + e_row_start = lv_row_start + e_row_end = lv_row_end ). + IF lv_col_start_alpha IS NOT INITIAL. + lo_worksheet->zif_excel_sheet_printsettings~set_print_repeat_columns( iv_columns_from = lv_col_start_alpha + iv_columns_to = lv_col_end_alpha ). + ENDIF. + IF lv_row_start IS NOT INITIAL. + lo_worksheet->zif_excel_sheet_printsettings~set_print_repeat_rows( iv_rows_from = lv_row_start + iv_rows_to = lv_row_end ). + ENDIF. + * 2nd range - zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = lv_range_value_2 - i_allow_1dim_range = abap_true - IMPORTING e_column_start = lv_col_start_alpha - e_column_end = lv_col_end_alpha - e_row_start = lv_row_start - e_row_end = lv_row_end ). - IF lv_col_start_alpha IS NOT INITIAL. - lo_worksheet->zif_excel_sheet_printsettings~set_print_repeat_columns( iv_columns_from = lv_col_start_alpha - iv_columns_to = lv_col_end_alpha ). - ENDIF. - IF lv_row_start IS NOT INITIAL. - lo_worksheet->zif_excel_sheet_printsettings~set_print_repeat_rows( iv_rows_from = lv_row_start - iv_rows_to = lv_row_end ). - ENDIF. - ELSE. - lo_range = lo_worksheet->add_new_range( ). + zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = lv_range_value_2 + i_allow_1dim_range = abap_true + IMPORTING e_column_start = lv_col_start_alpha + e_column_end = lv_col_end_alpha + e_row_start = lv_row_start + e_row_end = lv_row_end ). + IF lv_col_start_alpha IS NOT INITIAL. + lo_worksheet->zif_excel_sheet_printsettings~set_print_repeat_columns( iv_columns_from = lv_col_start_alpha + iv_columns_to = lv_col_end_alpha ). + ENDIF. + IF lv_row_start IS NOT INITIAL. + lo_worksheet->zif_excel_sheet_printsettings~set_print_repeat_rows( iv_rows_from = lv_row_start + iv_rows_to = lv_row_end ). ENDIF. WHEN OTHERS. From 1037898d0cedc14b69369ccae0910eb329104e74 Mon Sep 17 00:00:00 2001 From: Bernd <135710507+darnoc312@users.noreply.github.com> Date: Fri, 14 Jun 2024 15:46:28 +0200 Subject: [PATCH 4/5] Update zcl_excel_reader_2007.clas.abap --- src/zcl_excel_reader_2007.clas.abap | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/zcl_excel_reader_2007.clas.abap b/src/zcl_excel_reader_2007.clas.abap index c5b7238..20e9f9a 100644 --- a/src/zcl_excel_reader_2007.clas.abap +++ b/src/zcl_excel_reader_2007.clas.abap @@ -34,7 +34,7 @@ CLASS zcl_excel_reader_2007 DEFINITION TYPES: BEGIN OF t_sheet, name TYPE string, - sheetid TYPE string, + sheetid TYPE string, "currently not used id TYPE string, state TYPE string, END OF t_sheet . @@ -2137,11 +2137,11 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. lv_regex = `^[^!]*![^,]*,`. ENDIF. * Split into two ranges if necessary - FIND REGEX lv_regex IN lv_range_value MATCH LENGTH sy-fdpos. - IF sy-subrc = 0 AND sy-fdpos > 0. - lv_range_value_2 = lv_range_value+sy-fdpos. - SUBTRACT 1 FROM sy-fdpos. - lv_range_value_1 = lv_range_value(sy-fdpos). + FIND REGEX lv_regex IN lv_range_value MATCH LENGTH lv_position_temp. + IF sy-subrc = 0 AND lv_position_temp > 0. + lv_range_value_2 = lv_range_value+lv_position_temp. + SUBTRACT 1 FROM lv_position_temp. + lv_range_value_1 = lv_range_value(lv_position_temp). ELSE. lv_range_value_1 = lv_range_value. ENDIF. From 627cf740ea18369f8c2f7fd8475fb572c47767e4 Mon Sep 17 00:00:00 2001 From: Bernd <135710507+darnoc312@users.noreply.github.com> Date: Fri, 14 Jun 2024 16:38:06 +0200 Subject: [PATCH 5/5] Update zcl_excel_reader_2007.clas.abap --- src/zcl_excel_reader_2007.clas.abap | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/zcl_excel_reader_2007.clas.abap b/src/zcl_excel_reader_2007.clas.abap index 20e9f9a..00f21ec 100644 --- a/src/zcl_excel_reader_2007.clas.abap +++ b/src/zcl_excel_reader_2007.clas.abap @@ -2121,6 +2121,10 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. * repeat print rows/columns *--------------------------------------------------------------------* WHEN zif_excel_sheet_printsettings=>gcv_print_title_name. +* We don't need a range object here no more, because since the +* parameter i_allow_1dim_range is passed below anything works +* fine within worksheet's method print_title_set_range, which +* now creates the range object and sets name and value correctly. *--------------------------------------------------------------------* * This might be a temporary solution. Maybe ranges get be reworked * to support areas consisting of multiple rectangles