mirror of
https://github.com/abap2xlsx/abap2xlsx.git
synced 2025-05-04 15:16:21 +08:00
Refactor headings logic in BIND_TABLE (#960)
* Refactor headings logic in BIND_TABLE to help proposing a change for #764 Co-authored-by: sandraros <sandra.rossi@gmail.com> Co-authored-by: Lars Hvam <larshp@hotmail.com> Co-authored-by: Abo <andrea@borgia.bo.it>
This commit is contained in:
parent
c80da26920
commit
2973d66594
|
@ -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 <ls_field_catalog> 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: <scrtxt1> TYPE any,
|
||||
<scrtxt2> TYPE any,
|
||||
<scrtxt3> TYPE any.
|
||||
|
||||
CASE iv_default_descr.
|
||||
WHEN 'M'.
|
||||
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt1>.
|
||||
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt2>.
|
||||
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt3>.
|
||||
WHEN 'S'.
|
||||
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt1>.
|
||||
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt2>.
|
||||
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt3>.
|
||||
WHEN 'L'.
|
||||
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt1>.
|
||||
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt2>.
|
||||
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt3>.
|
||||
WHEN OTHERS.
|
||||
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt1>.
|
||||
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt2>.
|
||||
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt3>.
|
||||
ENDCASE.
|
||||
|
||||
|
||||
IF <scrtxt1> IS NOT INITIAL.
|
||||
lv_value = <scrtxt1>.
|
||||
<ls_field_catalog>-scrtext_l = lv_value.
|
||||
ELSEIF <scrtxt2> IS NOT INITIAL.
|
||||
lv_value = <scrtxt2>.
|
||||
<ls_field_catalog>-scrtext_l = lv_value.
|
||||
ELSEIF <scrtxt3> IS NOT INITIAL.
|
||||
lv_value = <scrtxt3>.
|
||||
<ls_field_catalog>-scrtext_l = lv_value.
|
||||
ELSE.
|
||||
lv_value = 'Column'. " default value as Excel does
|
||||
<ls_field_catalog>-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.
|
||||
<ls_field_catalog>-scrtext_l = lv_value.
|
||||
INSERT lv_value_lowercase INTO TABLE lt_column_name_buffer.
|
||||
EXIT.
|
||||
ELSE.
|
||||
lv_syindex = sy-index.
|
||||
CONCATENATE <ls_field_catalog>-scrtext_l lv_syindex INTO lv_value.
|
||||
ENDIF.
|
||||
|
||||
ENDWHILE.
|
||||
" First of all write column header
|
||||
IF <ls_field_catalog>-style_header IS NOT INITIAL.
|
||||
me->set_cell( ip_column = lv_column_alpha
|
||||
ip_row = lv_row_int
|
||||
ip_value = lv_value
|
||||
ip_value = <ls_field_catalog>-scrtext_l
|
||||
ip_style = <ls_field_catalog>-style_header ).
|
||||
ELSE.
|
||||
me->set_cell( ip_column = lv_column_alpha
|
||||
ip_row = lv_row_int
|
||||
ip_value = lv_value ).
|
||||
ip_value = <ls_field_catalog>-scrtext_l ).
|
||||
ENDIF.
|
||||
|
||||
IF <ls_field_catalog>-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: <ls_field_catalog> TYPE zexcel_s_fieldcatalog,
|
||||
<scrtxt1> TYPE any,
|
||||
<scrtxt2> TYPE any,
|
||||
<scrtxt3> 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 <ls_field_catalog> WHERE dynpfld EQ abap_true.
|
||||
|
||||
CASE iv_default_descr.
|
||||
WHEN 'M'.
|
||||
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt1>.
|
||||
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt2>.
|
||||
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt3>.
|
||||
WHEN 'S'.
|
||||
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt1>.
|
||||
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt2>.
|
||||
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt3>.
|
||||
WHEN 'L'.
|
||||
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt1>.
|
||||
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt2>.
|
||||
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt3>.
|
||||
WHEN OTHERS.
|
||||
ASSIGN <ls_field_catalog>-scrtext_m TO <scrtxt1>.
|
||||
ASSIGN <ls_field_catalog>-scrtext_s TO <scrtxt2>.
|
||||
ASSIGN <ls_field_catalog>-scrtext_l TO <scrtxt3>.
|
||||
ENDCASE.
|
||||
|
||||
IF <scrtxt1> IS NOT INITIAL.
|
||||
<ls_field_catalog>-scrtext_l = <scrtxt1>.
|
||||
ELSEIF <scrtxt2> IS NOT INITIAL.
|
||||
<ls_field_catalog>-scrtext_l = <scrtxt2>.
|
||||
ELSEIF <scrtxt3> IS NOT INITIAL.
|
||||
<ls_field_catalog>-scrtext_l = <scrtxt3>.
|
||||
ELSE.
|
||||
<ls_field_catalog>-scrtext_l = 'Column'. " default value as Excel does
|
||||
ENDIF.
|
||||
|
||||
DO.
|
||||
lv_value_lowercase = <ls_field_catalog>-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 <ls_field_catalog>-scrtext_l lv_syindex INTO <ls_field_catalog>-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 )
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue
Block a user