diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index e53cd0e65..0f6db8444 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -762,6 +762,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 @@ -952,8 +958,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, lo_iterator TYPE REF TO zcl_excel_collection_iterator, @@ -1022,75 +1026,26 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. lv_column_int = zcl_excel_common=>convert_column2int( ls_settings-top_left_column ). lv_row_int = ls_settings-top_left_row. + + 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. @@ -2973,6 +2928,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. + + DO. + 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. + ENDDO. + + 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 6cd36a00a..980caba12 100644 --- a/src/zcl_excel_worksheet.clas.testclasses.abap +++ b/src/zcl_excel_worksheet.clas.testclasses.abap @@ -1,3 +1,4 @@ +CLASS ltc_normalize_column_heading DEFINITION DEFERRED. CLASS ltc_normalize_columnrow_param DEFINITION DEFERRED. CLASS ltc_normalize_range_param DEFINITION DEFERRED. CLASS ltc_calculate_table_bottom_rig DEFINITION DEFERRED. @@ -6,6 +7,7 @@ CLASS ltc_check_cell_column_formula DEFINITION DEFERRED. CLASS ltc_check_overlapping DEFINITION DEFERRED. CLASS ltc_set_cell_value_types DEFINITION DEFERRED. CLASS zcl_excel_worksheet DEFINITION LOCAL FRIENDS + ltc_normalize_column_heading ltc_normalize_columnrow_param ltc_normalize_range_param ltc_calculate_table_bottom_rig @@ -122,6 +124,41 @@ CLASS ltc_check_overlapping 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. @@ -973,6 +1010,222 @@ CLASS ltc_check_overlapping 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.