From dfa0f1ab8653d40524c5a4120c7dec257fe33d70 Mon Sep 17 00:00:00 2001 From: sandraros Date: Sat, 8 Jan 2022 16:34:15 +0000 Subject: [PATCH 1/4] Refactor headings logic in BIND_TABLE to help proposing a change for #764 --- src/zcl_excel_worksheet.clas.abap | 138 ++++++---- src/zcl_excel_worksheet.clas.testclasses.abap | 253 ++++++++++++++++++ 2 files changed, 333 insertions(+), 58 deletions(-) diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index b0f53738c..ab2a27b5f 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -742,6 +742,12 @@ CLASS zcl_excel_worksheet DEFINITION CHANGING cs_complete_style_border TYPE zexcel_s_cstyle_border cs_complete_stylex_border TYPE zexcel_s_cstylex_border. + METHODS normalize_column_heading_texts + IMPORTING + iv_default_descr TYPE c + it_field_catalog TYPE zexcel_t_fieldcatalog + RETURNING + VALUE(result) TYPE zexcel_t_fieldcatalog. METHODS normalize_columnrow_parameter IMPORTING ip_columnrow TYPE csequence OPTIONAL @@ -926,8 +932,6 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. lv_formula TYPE string, ls_settings TYPE zexcel_s_table_settings, lo_table TYPE REF TO zcl_excel_table, - lt_column_name_buffer TYPE SORTED TABLE OF string WITH UNIQUE KEY table_line, - lv_value TYPE string, lv_value_lowercase TYPE string, lv_syindex TYPE c LENGTH 3, lv_errormessage TYPE string, "ins issue #237 @@ -1023,75 +1027,25 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. me->tables->add( lo_table ). + lt_field_catalog = normalize_column_heading_texts( + iv_default_descr = iv_default_descr + it_field_catalog = lt_field_catalog ). + * It is better to loop column by column (only visible column) LOOP AT lt_field_catalog ASSIGNING WHERE dynpfld EQ abap_true. lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ). - " Due restrinction of new table object we cannot have two column with the same name - " Check if a column with the same name exists, if exists add a counter - " If no medium description is provided we try to use small or long - FIELD-SYMBOLS: TYPE any, - TYPE any, - TYPE any. - - CASE iv_default_descr. - WHEN 'M'. - ASSIGN -scrtext_m TO . - ASSIGN -scrtext_s TO . - ASSIGN -scrtext_l TO . - WHEN 'S'. - ASSIGN -scrtext_s TO . - ASSIGN -scrtext_m TO . - ASSIGN -scrtext_l TO . - WHEN 'L'. - ASSIGN -scrtext_l TO . - ASSIGN -scrtext_m TO . - ASSIGN -scrtext_s TO . - WHEN OTHERS. - ASSIGN -scrtext_m TO . - ASSIGN -scrtext_s TO . - ASSIGN -scrtext_l TO . - ENDCASE. - - - IF IS NOT INITIAL. - lv_value = . - -scrtext_l = lv_value. - ELSEIF IS NOT INITIAL. - lv_value = . - -scrtext_l = lv_value. - ELSEIF IS NOT INITIAL. - lv_value = . - -scrtext_l = lv_value. - ELSE. - lv_value = 'Column'. " default value as Excel does - -scrtext_l = lv_value. - ENDIF. - WHILE 1 = 1. - lv_value_lowercase = lv_value. - TRANSLATE lv_value_lowercase TO LOWER CASE. - READ TABLE lt_column_name_buffer TRANSPORTING NO FIELDS WITH KEY table_line = lv_value_lowercase BINARY SEARCH. - IF sy-subrc <> 0. - -scrtext_l = lv_value. - INSERT lv_value_lowercase INTO TABLE lt_column_name_buffer. - EXIT. - ELSE. - lv_syindex = sy-index. - CONCATENATE -scrtext_l lv_syindex INTO lv_value. - ENDIF. - - ENDWHILE. " First of all write column header IF -style_header IS NOT INITIAL. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int - ip_value = lv_value + ip_value = -scrtext_l ip_style = -style_header ). ELSE. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int - ip_value = lv_value ). + ip_value = -scrtext_l ). ENDIF. IF -column_formula IS NOT INITIAL. @@ -2890,6 +2844,74 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ENDMETHOD. + METHOD normalize_column_heading_texts. + + DATA: lt_field_catalog TYPE zexcel_t_fieldcatalog, + lv_value_lowercase TYPE string, + lv_syindex TYPE c LENGTH 3, + lt_column_name_buffer TYPE SORTED TABLE OF string WITH UNIQUE KEY table_line. + FIELD-SYMBOLS: TYPE zexcel_s_fieldcatalog, + TYPE any, + TYPE any, + TYPE any. + + " Due restrinction of new table object we cannot have two column with the same name + " Check if a column with the same name exists, if exists add a counter + " If no medium description is provided we try to use small or long + + lt_field_catalog = it_field_catalog. + + LOOP AT lt_field_catalog ASSIGNING WHERE dynpfld EQ abap_true. + + CASE iv_default_descr. + WHEN 'M'. + ASSIGN -scrtext_m TO . + ASSIGN -scrtext_s TO . + ASSIGN -scrtext_l TO . + WHEN 'S'. + ASSIGN -scrtext_s TO . + ASSIGN -scrtext_m TO . + ASSIGN -scrtext_l TO . + WHEN 'L'. + ASSIGN -scrtext_l TO . + ASSIGN -scrtext_m TO . + ASSIGN -scrtext_s TO . + WHEN OTHERS. + ASSIGN -scrtext_m TO . + ASSIGN -scrtext_s TO . + ASSIGN -scrtext_l TO . + ENDCASE. + + IF IS NOT INITIAL. + -scrtext_l = . + ELSEIF IS NOT INITIAL. + -scrtext_l = . + ELSEIF IS NOT INITIAL. + -scrtext_l = . + ELSE. + -scrtext_l = 'Column'. " default value as Excel does + ENDIF. + + WHILE 1 = 1. + lv_value_lowercase = -scrtext_l. + TRANSLATE lv_value_lowercase TO LOWER CASE. + READ TABLE lt_column_name_buffer TRANSPORTING NO FIELDS WITH KEY table_line = lv_value_lowercase BINARY SEARCH. + IF sy-subrc <> 0. + INSERT lv_value_lowercase INTO TABLE lt_column_name_buffer. + EXIT. + ELSE. + lv_syindex = sy-index. + CONCATENATE -scrtext_l lv_syindex INTO -scrtext_l. + ENDIF. + ENDWHILE. + + ENDLOOP. + + result = lt_field_catalog. + + ENDMETHOD. + + METHOD normalize_columnrow_parameter. IF ( ( ip_column IS NOT INITIAL OR ip_row IS NOT INITIAL ) AND ip_columnrow IS NOT INITIAL ) diff --git a/src/zcl_excel_worksheet.clas.testclasses.abap b/src/zcl_excel_worksheet.clas.testclasses.abap index 7a6dd6e2d..5f59684f2 100644 --- a/src/zcl_excel_worksheet.clas.testclasses.abap +++ b/src/zcl_excel_worksheet.clas.testclasses.abap @@ -1,7 +1,9 @@ +CLASS ltc_normalize_column_heading DEFINITION DEFERRED. CLASS ltc_normalize_columnrow_param DEFINITION DEFERRED. CLASS ltc_normalize_range_param DEFINITION DEFERRED. CLASS ltc_check_cell_column_formula DEFINITION DEFERRED. CLASS zcl_excel_worksheet DEFINITION LOCAL FRIENDS + ltc_normalize_column_heading ltc_normalize_columnrow_param ltc_normalize_range_param ltc_check_cell_column_formula. @@ -59,6 +61,41 @@ CLASS ltc_check_cell_column_formula DEFINITION FOR TESTING ENDCLASS. +CLASS ltc_normalize_column_heading DEFINITION FOR TESTING + RISK LEVEL HARMLESS + DURATION SHORT. + + PRIVATE SECTION. + TYPES : BEGIN OF ty_parameters, + BEGIN OF input, + default_descr TYPE c LENGTH 1, + field_catalog TYPE zexcel_t_fieldcatalog, + END OF input, + BEGIN OF output, + field_catalog TYPE zexcel_t_fieldcatalog, + END OF output, + END OF ty_parameters. + DATA: + cut TYPE REF TO zcl_excel_worksheet. "class under test + + METHODS setup. + METHODS: + prefer_small_text FOR TESTING RAISING cx_static_check, + prefer_medium_text FOR TESTING RAISING cx_static_check, + prefer_long_text FOR TESTING RAISING cx_static_check, + default_text_if_none FOR TESTING RAISING cx_static_check, + invalid_default_descr FOR TESTING RAISING cx_static_check. + + METHODS assert + IMPORTING + input TYPE ty_parameters-input + exp TYPE ty_parameters-output + RAISING + cx_static_check. + +ENDCLASS. + + CLASS ltc_normalize_columnrow_param DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. @@ -627,6 +664,222 @@ CLASS ltc_check_cell_column_formula IMPLEMENTATION. ENDCLASS. +CLASS ltc_normalize_column_heading IMPLEMENTATION. + + METHOD setup. + + DATA: lo_excel TYPE REF TO zcl_excel. + + CREATE OBJECT lo_excel. + + TRY. + CREATE OBJECT cut + EXPORTING + ip_excel = lo_excel. + CATCH zcx_excel. + cl_abap_unit_assert=>fail( 'Could not create instance' ). + ENDTRY. + + ENDMETHOD. + + METHOD prefer_small_text. + DATA: input TYPE ty_parameters-input, + exp TYPE ty_parameters-output, + field TYPE zexcel_s_fieldcatalog. + + input-default_descr = 'S'. + + field-dynpfld = abap_true. + + field-scrtext_s = 'Column1_S'. + field-scrtext_m = 'Column1_M'. + field-scrtext_l = 'Column1_L'. + APPEND field TO input-field_catalog. + field-scrtext_l = 'Column1_S'. + APPEND field TO exp-field_catalog. + + field-scrtext_s = ''. + field-scrtext_m = 'Column2_M'. + field-scrtext_l = 'Column2_L'. + APPEND field TO input-field_catalog. + field-scrtext_l = 'Column2_M'. + APPEND field TO exp-field_catalog. + + field-scrtext_s = ''. + field-scrtext_m = 'Column3_M'. + field-scrtext_l = ''. + APPEND field TO input-field_catalog. + field-scrtext_l = 'Column3_M'. + APPEND field TO exp-field_catalog. + + field-scrtext_s = ''. + field-scrtext_m = ''. + field-scrtext_l = 'Column4_L'. + APPEND field TO input-field_catalog. + field-scrtext_l = 'Column4_L'. + APPEND field TO exp-field_catalog. + + assert( input = input exp = exp ). + + ENDMETHOD. + + METHOD prefer_medium_text. + DATA: input TYPE ty_parameters-input, + exp TYPE ty_parameters-output, + field TYPE zexcel_s_fieldcatalog. + + input-default_descr = 'M'. + + field-dynpfld = abap_true. + + field-scrtext_s = 'Column1_S'. + field-scrtext_m = 'Column1_M'. + field-scrtext_l = 'Column1_L'. + APPEND field TO input-field_catalog. + field-scrtext_l = 'Column1_M'. + APPEND field TO exp-field_catalog. + + field-scrtext_s = 'Column2_S'. + field-scrtext_m = ''. + field-scrtext_l = 'Column2_L'. + APPEND field TO input-field_catalog. + field-scrtext_l = 'Column2_S'. + APPEND field TO exp-field_catalog. + + field-scrtext_s = 'Column3_S'. + field-scrtext_m = ''. + field-scrtext_l = ''. + APPEND field TO input-field_catalog. + field-scrtext_l = 'Column3_S'. + APPEND field TO exp-field_catalog. + + field-scrtext_s = ''. + field-scrtext_m = ''. + field-scrtext_l = 'Column4_L'. + APPEND field TO input-field_catalog. + field-scrtext_l = 'Column4_L'. + APPEND field TO exp-field_catalog. + + assert( input = input exp = exp ). + + ENDMETHOD. + + METHOD prefer_long_text. + DATA: input TYPE ty_parameters-input, + exp TYPE ty_parameters-output, + field TYPE zexcel_s_fieldcatalog. + + input-default_descr = 'L'. + + field-dynpfld = abap_true. + + field-scrtext_s = 'Column1_S'. + field-scrtext_m = 'Column1_M'. + field-scrtext_l = 'Column1_L'. + APPEND field TO input-field_catalog. + field-scrtext_l = 'Column1_L'. + APPEND field TO exp-field_catalog. + + field-scrtext_s = 'Column2_S'. + field-scrtext_m = 'Column2_M'. + field-scrtext_l = ''. + APPEND field TO input-field_catalog. + field-scrtext_l = 'Column2_M'. + APPEND field TO exp-field_catalog. + + field-scrtext_s = 'Column3_S'. + field-scrtext_m = ''. + field-scrtext_l = ''. + APPEND field TO input-field_catalog. + field-scrtext_l = 'Column3_S'. + APPEND field TO exp-field_catalog. + + assert( input = input exp = exp ). + + ENDMETHOD. + + METHOD default_text_if_none. + DATA: input TYPE ty_parameters-input, + exp TYPE ty_parameters-output, + field TYPE zexcel_s_fieldcatalog. + + input-default_descr = 'S'. + + field-dynpfld = abap_true. + + field-scrtext_s = ''. + field-scrtext_m = ''. + field-scrtext_l = ''. + APPEND field TO input-field_catalog. + field-scrtext_l = 'Column'. + APPEND field TO exp-field_catalog. + + field-scrtext_s = ''. + field-scrtext_m = ''. + field-scrtext_l = ''. + APPEND field TO input-field_catalog. + field-scrtext_l = 'Column 1'. + APPEND field TO exp-field_catalog. + + assert( input = input exp = exp ). + + ENDMETHOD. + + METHOD invalid_default_descr. + DATA: input TYPE ty_parameters-input, + exp TYPE ty_parameters-output, + field TYPE zexcel_s_fieldcatalog. + + input-default_descr = '?'. + + field-dynpfld = abap_true. + + field-scrtext_s = 'Column1_S'. + field-scrtext_m = 'Column1_M'. + field-scrtext_l = 'Column1_L'. + APPEND field TO input-field_catalog. + field-scrtext_l = 'Column1_M'. + APPEND field TO exp-field_catalog. + + field-scrtext_s = 'Column2_S'. + field-scrtext_m = ''. + field-scrtext_l = 'Column2_L'. + APPEND field TO input-field_catalog. + field-scrtext_l = 'Column2_S'. + APPEND field TO exp-field_catalog. + + field-scrtext_s = 'Column3_S'. + field-scrtext_m = ''. + field-scrtext_l = ''. + APPEND field TO input-field_catalog. + field-scrtext_l = 'Column3_S'. + APPEND field TO exp-field_catalog. + + field-scrtext_s = ''. + field-scrtext_m = ''. + field-scrtext_l = 'Column4_L'. + APPEND field TO input-field_catalog. + field-scrtext_l = 'Column4_L'. + APPEND field TO exp-field_catalog. + + assert( input = input exp = exp ). + + ENDMETHOD. + + METHOD assert. + DATA: act TYPE ty_parameters-output. + + act-field_catalog = cut->normalize_column_heading_texts( + iv_default_descr = input-default_descr + it_field_catalog = input-field_catalog ). + + cl_abap_unit_assert=>assert_equals( exp = exp-field_catalog act = act-field_catalog ). + + ENDMETHOD. + +ENDCLASS. + + CLASS ltc_normalize_columnrow_param IMPLEMENTATION. METHOD setup. From e536bd9a22d869e91f6542effa237c36909bcc8b Mon Sep 17 00:00:00 2001 From: sandraros Date: Sat, 15 Jan 2022 19:45:51 +0000 Subject: [PATCH 2/4] merge zcl_excel_worksheet from master --- src/zcl_excel_worksheet.clas.abap | 272 ++++++++---- src/zcl_excel_worksheet.clas.testclasses.abap | 413 ++++++++++++++++++ 2 files changed, 604 insertions(+), 81 deletions(-) diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index ab2a27b5f..5668e20ae 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -356,10 +356,14 @@ CLASS zcl_excel_worksheet DEFINITION zcx_excel . METHODS get_columns RETURNING - VALUE(eo_columns) TYPE REF TO zcl_excel_columns . + VALUE(eo_columns) TYPE REF TO zcl_excel_columns + RAISING + zcx_excel . METHODS get_columns_iterator RETURNING - VALUE(eo_iterator) TYPE REF TO zcl_excel_collection_iterator . + VALUE(eo_iterator) TYPE REF TO zcl_excel_collection_iterator + RAISING + zcx_excel . METHODS get_style_cond_iterator RETURNING VALUE(eo_iterator) TYPE REF TO zcl_excel_collection_iterator . @@ -491,7 +495,7 @@ CLASS zcl_excel_worksheet DEFINITION !ip_row TYPE zexcel_cell_row OPTIONAL !ip_value TYPE simple OPTIONAL !ip_formula TYPE zexcel_cell_formula OPTIONAL - !ip_style TYPE zexcel_cell_style OPTIONAL + !ip_style TYPE any OPTIONAL !ip_hyperlink TYPE REF TO zcl_excel_hyperlink OPTIONAL !ip_data_type TYPE zexcel_cell_data_type OPTIONAL !ip_abap_type TYPE abap_typekind OPTIONAL @@ -512,7 +516,7 @@ CLASS zcl_excel_worksheet DEFINITION !ip_columnrow TYPE csequence OPTIONAL !ip_column TYPE simple OPTIONAL !ip_row TYPE zexcel_cell_row OPTIONAL - !ip_style TYPE zexcel_cell_style + !ip_style TYPE any RAISING zcx_excel . METHODS set_column_width @@ -537,7 +541,7 @@ CLASS zcl_excel_worksheet DEFINITION !ip_column_end TYPE simple OPTIONAL !ip_row TYPE zexcel_cell_row OPTIONAL !ip_row_to TYPE zexcel_cell_row OPTIONAL - !ip_style TYPE zexcel_cell_style OPTIONAL "added parameter + !ip_style TYPE any OPTIONAL !ip_value TYPE simple OPTIONAL "added parameter !ip_formula TYPE zexcel_cell_formula OPTIONAL "added parameter RAISING @@ -570,8 +574,8 @@ CLASS zcl_excel_worksheet DEFINITION METHODS set_table IMPORTING !ip_table TYPE STANDARD TABLE - !ip_hdr_style TYPE zexcel_cell_style OPTIONAL - !ip_body_style TYPE zexcel_cell_style OPTIONAL + !ip_hdr_style TYPE any OPTIONAL + !ip_body_style TYPE any OPTIONAL !ip_table_title TYPE string !ip_top_left_column TYPE zexcel_cell_column_alpha DEFAULT 'B' !ip_top_left_row TYPE zexcel_cell_row DEFAULT 3 @@ -586,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 @@ -601,7 +606,7 @@ CLASS zcl_excel_worksheet DEFINITION !ip_column_end TYPE simple OPTIONAL !ip_row TYPE zexcel_cell_row OPTIONAL !ip_row_to TYPE zexcel_cell_row OPTIONAL - !ip_style TYPE zexcel_cell_style OPTIONAL + !ip_style TYPE any OPTIONAL RAISING zcx_excel . METHODS set_area_formula @@ -623,7 +628,7 @@ CLASS zcl_excel_worksheet DEFINITION !ip_column_end TYPE simple OPTIONAL !ip_row TYPE zexcel_cell_row OPTIONAL !ip_row_to TYPE zexcel_cell_row OPTIONAL - !ip_style TYPE zexcel_cell_style + !ip_style TYPE any !ip_merge TYPE abap_bool OPTIONAL RAISING zcx_excel . @@ -636,7 +641,7 @@ CLASS zcl_excel_worksheet DEFINITION !ip_row_to TYPE zexcel_cell_row OPTIONAL !ip_value TYPE simple OPTIONAL !ip_formula TYPE zexcel_cell_formula OPTIONAL - !ip_style TYPE zexcel_cell_style OPTIONAL + !ip_style TYPE any OPTIONAL !ip_hyperlink TYPE REF TO zcl_excel_hyperlink OPTIONAL !ip_data_type TYPE zexcel_cell_data_type OPTIONAL !ip_abap_type TYPE abap_typekind OPTIONAL @@ -663,6 +668,7 @@ CLASS zcl_excel_worksheet DEFINITION *"* private components of class ZCL_EXCEL_WORKSHEET *"* do not include other source files here!!! + TYPES ty_table_settings TYPE STANDARD TABLE OF zexcel_s_table_settings WITH DEFAULT KEY. DATA active_cell TYPE zexcel_s_cell_data . DATA charts TYPE REF TO zcl_excel_drawings . DATA columns TYPE REF TO zcl_excel_columns . @@ -701,6 +707,14 @@ CLASS zcl_excel_worksheet DEFINITION VALUE(ep_width) TYPE f RAISING zcx_excel . + CLASS-METHODS calculate_table_bottom_right + IMPORTING + ip_table TYPE STANDARD TABLE + it_field_catalog TYPE zexcel_t_fieldcatalog + CHANGING + cs_settings TYPE zexcel_s_table_settings + RAISING + zcx_excel. CLASS-METHODS check_cell_column_formula IMPORTING it_column_formulas TYPE mty_th_column_formula @@ -719,6 +733,12 @@ CLASS zcl_excel_worksheet DEFINITION !ct_rtf TYPE zexcel_t_rtf RAISING zcx_excel . + CLASS-METHODS check_table_overlapping + IMPORTING + is_table_settings TYPE zexcel_s_table_settings + it_other_table_settings TYPE ty_table_settings + RAISING + zcx_excel. METHODS clear_initial_colorxfields IMPORTING is_color TYPE zexcel_s_style_color @@ -772,6 +792,13 @@ CLASS zcl_excel_worksheet DEFINITION ep_row_to TYPE zexcel_cell_row RAISING zcx_excel. + CLASS-METHODS normalize_style_parameter + IMPORTING + !ip_style_or_guid TYPE any + RETURNING + VALUE(rv_guid) TYPE zexcel_cell_style + RAISING + zcx_excel . METHODS print_title_set_range . METHODS update_dimension_range RAISING @@ -921,28 +948,22 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. lc_top_left_row TYPE zexcel_cell_row VALUE 1. DATA: - lv_row_int TYPE zexcel_cell_row, - lv_first_row TYPE zexcel_cell_row, - lv_last_row TYPE zexcel_cell_row, - lv_column_int TYPE zexcel_cell_column, - lv_column_alpha TYPE zexcel_cell_column_alpha, - lt_field_catalog TYPE zexcel_t_fieldcatalog, - lv_id TYPE i, - lv_rows TYPE i, - lv_formula TYPE string, - ls_settings TYPE zexcel_s_table_settings, - lo_table TYPE REF TO zcl_excel_table, - lv_value_lowercase TYPE string, - lv_syindex TYPE c LENGTH 3, - lv_errormessage TYPE string, "ins issue #237 - - lv_columns TYPE i, - lt_columns TYPE zexcel_t_fieldcatalog, - lv_maxcol TYPE i, - lv_maxrow TYPE i, - lo_iterator TYPE REF TO zcl_excel_collection_iterator, - lo_style_cond TYPE REF TO zcl_excel_style_cond, - lo_curtable TYPE REF TO zcl_excel_table. + lv_row_int TYPE zexcel_cell_row, + lv_first_row TYPE zexcel_cell_row, + lv_last_row TYPE zexcel_cell_row, + lv_column_int TYPE zexcel_cell_column, + lv_column_alpha TYPE zexcel_cell_column_alpha, + lt_field_catalog TYPE zexcel_t_fieldcatalog, + lv_id TYPE i, + lv_formula TYPE string, + ls_settings TYPE zexcel_s_table_settings, + lo_table TYPE REF TO zcl_excel_table, + lv_value_lowercase TYPE string, + lv_syindex TYPE c LENGTH 3, + lo_iterator TYPE REF TO zcl_excel_collection_iterator, + lo_style_cond TYPE REF TO zcl_excel_style_cond, + lo_curtable TYPE REF TO zcl_excel_table, + lt_other_table_settings TYPE ty_table_settings. DATA: ls_column_formula TYPE mty_s_column_formula, lv_mincol TYPE i. @@ -974,50 +995,26 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. SORT lt_field_catalog BY position. -*--------------------------------------------------------------------* -* issue #237 Check if overlapping areas exist Start -*--------------------------------------------------------------------* - "Get the number of columns for the current table - lt_columns = lt_field_catalog. - DELETE lt_columns WHERE dynpfld NE abap_true. - DESCRIBE TABLE lt_columns LINES lv_columns. - - "Calculate the top left row of the current table - lv_column_int = zcl_excel_common=>convert_column2int( ls_settings-top_left_column ). - lv_row_int = ls_settings-top_left_row. - - "Get number of row for the current table - DESCRIBE TABLE ip_table LINES lv_rows. - - "Calculate the bottom right row for the current table - lv_maxcol = lv_column_int + lv_columns - 1. - lv_maxrow = lv_row_int + lv_rows - 1. - ls_settings-bottom_right_column = zcl_excel_common=>convert_column2alpha( lv_maxcol ). - ls_settings-bottom_right_row = lv_maxrow. + calculate_table_bottom_right( + EXPORTING + ip_table = ip_table + it_field_catalog = lt_field_catalog + CHANGING + cs_settings = ls_settings ). - lv_column_int = zcl_excel_common=>convert_column2int( ls_settings-top_left_column ). +* Check if overlapping areas exist lo_iterator = me->tables->get_iterator( ). WHILE lo_iterator->has_next( ) EQ abap_true. - lo_curtable ?= lo_iterator->get_next( ). - IF ( ( ls_settings-top_left_row GE lo_curtable->settings-top_left_row AND ls_settings-top_left_row LE lo_curtable->settings-bottom_right_row ) - OR - ( ls_settings-bottom_right_row GE lo_curtable->settings-top_left_row AND ls_settings-bottom_right_row LE lo_curtable->settings-bottom_right_row ) - ) - AND - ( ( lv_column_int GE zcl_excel_common=>convert_column2int( lo_curtable->settings-top_left_column ) AND lv_column_int LE zcl_excel_common=>convert_column2int( lo_curtable->settings-bottom_right_column ) ) - OR - ( lv_maxcol GE zcl_excel_common=>convert_column2int( lo_curtable->settings-top_left_column ) AND lv_maxcol LE zcl_excel_common=>convert_column2int( lo_curtable->settings-bottom_right_column ) ) - ). - lv_errormessage = 'Table overlaps with previously bound table and will not be added to worksheet.'(400). - zcx_excel=>raise_text( lv_errormessage ). - ENDIF. - + APPEND lo_curtable->settings TO lt_other_table_settings. ENDWHILE. -*--------------------------------------------------------------------* -* issue #237 Check if overlapping areas exist End -*--------------------------------------------------------------------* + + check_table_overlapping( + is_table_settings = ls_settings + it_other_table_settings = lt_other_table_settings ). + +* Start filling the table CREATE OBJECT lo_table. lo_table->settings = ls_settings. @@ -1055,7 +1052,7 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ls_column_formula-table_top_left_row = lo_table->settings-top_left_row. ls_column_formula-table_bottom_right_row = lo_table->settings-bottom_right_row. ls_column_formula-table_left_column_int = lv_mincol. - ls_column_formula-table_right_column_int = lv_maxcol. + ls_column_formula-table_right_column_int = zcl_excel_common=>convert_column2int( lo_table->settings-bottom_right_column ). INSERT ls_column_formula INTO TABLE column_formulas. ENDIF. @@ -1175,7 +1172,7 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. *--------------------------------------------------------------------* IF -style_cond IS NOT INITIAL. lv_first_row = ls_settings-top_left_row + 1. " +1 to exclude header - lv_last_row = ls_settings-top_left_row + lv_rows. + lv_last_row = ls_settings-bottom_right_row. lo_style_cond = me->get_style_cond( -style_cond ). lo_style_cond->set_range( ip_start_column = lv_column_alpha ip_start_row = lv_first_row @@ -1196,7 +1193,7 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. IF ip_table IS INITIAL. es_table_settings-bottom_right_row = ls_settings-top_left_row + 2. "Last rows ELSE. - es_table_settings-bottom_right_row = ls_settings-top_left_row + lv_rows + 1. "Last rows + es_table_settings-bottom_right_row = ls_settings-bottom_right_row + 1. "Last rows ENDIF. " << Issue #291 @@ -1387,6 +1384,40 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ENDMETHOD. "CALCULATE_COLUMN_WIDTHS + METHOD calculate_table_bottom_right. + + DATA: lv_errormessage TYPE string, + lv_columns TYPE i, + lt_columns TYPE zexcel_t_fieldcatalog, + lv_maxrow TYPE i, + lo_iterator TYPE REF TO zcl_excel_collection_iterator, + lo_curtable TYPE REF TO zcl_excel_table, + lv_row_int TYPE zexcel_cell_row, + lv_column_int TYPE zexcel_cell_column, + lv_rows TYPE i, + lv_maxcol TYPE i. + + "Get the number of columns for the current table + lt_columns = it_field_catalog. + DELETE lt_columns WHERE dynpfld NE abap_true. + DESCRIBE TABLE lt_columns LINES lv_columns. + + "Calculate the top left row of the current table + lv_column_int = zcl_excel_common=>convert_column2int( cs_settings-top_left_column ). + lv_row_int = cs_settings-top_left_row. + + "Get number of row for the current table + DESCRIBE TABLE ip_table LINES lv_rows. + + "Calculate the bottom right row for the current table + lv_maxcol = lv_column_int + lv_columns - 1. + lv_maxrow = lv_row_int + lv_rows. + cs_settings-bottom_right_column = zcl_excel_common=>convert_column2alpha( lv_maxcol ). + cs_settings-bottom_right_row = lv_maxrow. + + ENDMETHOD. + + METHOD change_area_style. DATA: lv_row TYPE zexcel_cell_row, @@ -1881,6 +1912,41 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ENDMETHOD. + METHOD check_table_overlapping. + + DATA: lv_errormessage TYPE string, + lv_column_int TYPE zexcel_cell_column, + lv_maxcol TYPE i. + FIELD-SYMBOLS: + TYPE zexcel_s_table_settings. + + lv_column_int = zcl_excel_common=>convert_column2int( is_table_settings-top_left_column ). + lv_maxcol = zcl_excel_common=>convert_column2int( is_table_settings-bottom_right_column ). + + LOOP AT it_other_table_settings ASSIGNING . + + IF ( ( is_table_settings-top_left_row GE -top_left_row + AND is_table_settings-top_left_row LE -bottom_right_row ) + OR + ( is_table_settings-bottom_right_row GE -top_left_row + AND is_table_settings-bottom_right_row LE -bottom_right_row ) + ) + AND + ( ( lv_column_int GE zcl_excel_common=>convert_column2int( -top_left_column ) + AND lv_column_int LE zcl_excel_common=>convert_column2int( -bottom_right_column ) ) + OR + ( lv_maxcol GE zcl_excel_common=>convert_column2int( -top_left_column ) + AND lv_maxcol LE zcl_excel_common=>convert_column2int( -bottom_right_column ) ) + ). + lv_errormessage = 'Table overlaps with previously bound table and will not be added to worksheet.'(400). + zcx_excel=>raise_text( lv_errormessage ). + ENDIF. + + ENDLOOP. + + ENDMETHOD. + + METHOD class_constructor. c_messages-formula_id_only_is_possible = |{ 'If Formula ID is used, value and formula must be empty'(008) }|. @@ -2586,6 +2652,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. @@ -2690,6 +2757,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 . + ASSERT sy-subrc = 0. + IF IS NOT INITIAL. + EXIT. + ENDIF. + DELETE et_table INDEX lv_tabix. + lv_tabix = lv_tabix - 1. + ENDWHILE. + ENDIF. + ENDIF. @@ -2992,6 +3073,35 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ENDMETHOD. + METHOD normalize_style_parameter. + + DATA: lo_style_type TYPE REF TO cl_abap_typedescr. + FIELD-SYMBOLS: +