diff --git a/src/demos/zdemo_excel1.prog.abap b/src/demos/zdemo_excel1.prog.abap index 4806939..e1505a1 100644 --- a/src/demos/zdemo_excel1.prog.abap +++ b/src/demos/zdemo_excel1.prog.abap @@ -32,7 +32,7 @@ START-OF-SELECTION. lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = lv_date ). lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = lv_time ). lo_hyperlink = zcl_excel_hyperlink=>create_external_link( iv_url = 'https://abap2xlsx.github.io/abap2xlsx' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 4 ip_value = 'Click here to visit abap2xlsx homepage' ip_hyperlink = lo_hyperlink ). + lo_worksheet->set_cell( ip_columnrow = 'B4' ip_value = 'Click here to visit abap2xlsx homepage' ip_hyperlink = lo_hyperlink ). lo_worksheet->set_cell( ip_column = 'B' ip_row = 6 ip_value = '你好,世界' ). lo_worksheet->set_cell( ip_column = 'C' ip_row = 6 ip_value = '(Chinese)' ). diff --git a/src/demos/zdemo_excel13.prog.abap b/src/demos/zdemo_excel13.prog.abap index bb9d2ae..514191d 100644 --- a/src/demos/zdemo_excel13.prog.abap +++ b/src/demos/zdemo_excel13.prog.abap @@ -56,12 +56,10 @@ START-OF-SELECTION. lo_worksheet->set_merge( ip_row = 4 ip_column_start = 'B' ip_column_end = 'G' ). " Test also if merge works when oher merged chells are empty - lo_worksheet->set_cell( ip_row = 6 ip_column = 'B' ip_value = 'Tomato' ). - lo_worksheet->set_merge( ip_row = 6 ip_column_start = 'B' ip_column_end = 'G' ). + lo_worksheet->set_merge( ip_range = 'B6:G6' ip_value = 'Tomato' ). " Test the patch provided by Victor Alekhin to merge cells in one column - lo_worksheet->set_cell( ip_row = 8 ip_column = 'B' ip_value = 'Merge cells also over multiple rows by Victor Alekhin' ). - lo_worksheet->set_merge( ip_row = 8 ip_column_start = 'B' ip_column_end = 'G' ip_row_to = 10 ). + lo_worksheet->set_merge( ip_range = 'B8:G10' ip_value = 'Merge cells also over multiple rows by Victor Alekhin' ). " Test the patch provided by Alexander Budeyev with different column merges lo_worksheet->set_cell( ip_row = 12 ip_column = 'B' ip_value = 'Merge cells with different merges by Alexander Budeyev' ). diff --git a/src/demos/zdemo_excel15.prog.abap b/src/demos/zdemo_excel15.prog.abap index f5c0709..1772aa2 100644 --- a/src/demos/zdemo_excel15.prog.abap +++ b/src/demos/zdemo_excel15.prog.abap @@ -127,8 +127,7 @@ START-OF-SELECTION. IF -input = sheet_with_date_formats. worksheet->get_cell( EXPORTING - ip_column = 'A' - ip_row = 4 + ip_columnrow = 'A4' IMPORTING ep_value = value ). diff --git a/src/demos/zdemo_excel35.prog.abap b/src/demos/zdemo_excel35.prog.abap index 32f8b04..1241229 100644 --- a/src/demos/zdemo_excel35.prog.abap +++ b/src/demos/zdemo_excel35.prog.abap @@ -123,7 +123,7 @@ START-OF-SELECTION. " Get active sheet lo_worksheet = lo_excel->get_active_worksheet( ). lo_worksheet->set_title( ip_title = 'Styles' ). - lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). + lo_worksheet->set_cell( ip_columnrow = 'B2' ip_value = 'Hello world' ). lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = 'Bold text' ip_style = lv_style_bold_guid ). lo_worksheet->set_cell( ip_column = 'D' ip_row = 4 ip_value = 'Underlined text' ip_style = lv_style_underline_guid ). lo_worksheet->set_cell( ip_column = 'B' ip_row = 5 ip_value = 'Filled text' ip_style = lv_style_filled_guid ). @@ -133,7 +133,7 @@ START-OF-SELECTION. " Fill the cell and apply one style lo_worksheet->set_cell( ip_column = 'B' ip_row = 6 ip_value = 'Filled text' ip_style = lv_style_filled_guid ). " Change the style - lo_worksheet->set_cell_style( ip_column = 'B' ip_row = 6 ip_style = lv_style_filled_green_guid ). + lo_worksheet->set_cell_style( ip_columnrow = 'B6' ip_style = lv_style_filled_green_guid ). " Add Style to an empty cell to test Fix for Issue "#44 Exception ZCX_EXCEL thrown when style is set for an empty cell " https://code.sdn.sap.com/spaces/abap2xlsx/tickets/44-exception-zcx_excel-thrown-when-style-is-set-for-an-empty-cell @@ -142,8 +142,7 @@ START-OF-SELECTION. * Demonstrate how to retroactivly change the cellstyle *Filled text and underlinded text - lo_worksheet->change_cell_style( ip_column = 'B' - ip_row = 5 + lo_worksheet->change_cell_style( ip_columnrow = 'B5' ip_font_bold = abap_true ip_font_italic = abap_true ). diff --git a/src/demos/zdemo_excel40.prog.abap b/src/demos/zdemo_excel40.prog.abap index 54bf595..57ddf89 100644 --- a/src/demos/zdemo_excel40.prog.abap +++ b/src/demos/zdemo_excel40.prog.abap @@ -31,10 +31,7 @@ START-OF-SELECTION. * These marked cells will be used for repeatable rows/columns on printpages *--------------------------------------------------------------------* lo_worksheet->set_area( - ip_column_start = 1 - ip_column_end = 20 - ip_row = 1 - ip_row_to = 100 + ip_range = 'A1:T100' ip_formula = 'CHAR(64+COLUMN())&TEXT(ROW(),"????????0")' ip_area = lo_worksheet->c_area-whole ). @@ -42,19 +39,13 @@ START-OF-SELECTION. lo_style_changer->set_fill_filltype( zcl_excel_style_fill=>c_fill_solid ). lo_style_changer->set_fill_fgcolor_rgb( zcl_excel_style_color=>c_yellow ). lo_worksheet->change_area_style( - ip_column_start = 1 - ip_column_end = 20 - ip_row = 1 - ip_row_to = 3 + ip_range = 'A1:T3' ip_style_changer = lo_style_changer ). lo_style_changer = zcl_excel_style_changer=>create( lo_excel ). lo_style_changer->set_font_color_rgb( zcl_excel_style_color=>c_red ). lo_worksheet->change_area_style( - ip_column_start = 1 - ip_column_end = 4 - ip_row = 1 - ip_row_to = 100 + ip_range = 'A1:D100' ip_style_changer = lo_style_changer ). *--------------------------------------------------------------------* diff --git a/src/zcl_excel_common.clas.abap b/src/zcl_excel_common.clas.abap index 62614f9..16fecb5 100644 --- a/src/zcl_excel_common.clas.abap +++ b/src/zcl_excel_common.clas.abap @@ -42,15 +42,20 @@ CLASS zcl_excel_common DEFINITION IMPORTING !i_columnrow TYPE clike EXPORTING - !e_column TYPE zexcel_cell_column_alpha - !e_row TYPE zexcel_cell_row . + !e_column TYPE zexcel_cell_column_alpha + !e_column_int TYPE zexcel_cell_column + !e_row TYPE zexcel_cell_row + RAISING + zcx_excel. CLASS-METHODS convert_range2column_a_row IMPORTING !i_range TYPE clike !i_allow_1dim_range TYPE abap_bool DEFAULT abap_false EXPORTING !e_column_start TYPE zexcel_cell_column_alpha + !e_column_start_int TYPE zexcel_cell_column !e_column_end TYPE zexcel_cell_column_alpha + !e_column_end_int TYPE zexcel_cell_column !e_row_start TYPE zexcel_cell_row !e_row_end TYPE zexcel_cell_row !e_sheet TYPE clike @@ -493,6 +498,9 @@ CLASS zcl_excel_common IMPLEMENTATION. FIND REGEX '^(\D+)(\d+)$' IN lv_columnrow SUBMATCHES e_column pane_cell_row_a. + IF e_column_int IS SUPPLIED. + e_column_int = convert_column2int( ip_column = e_column ). + ENDIF. e_row = pane_cell_row_a. ENDMETHOD. @@ -589,6 +597,13 @@ CLASS zcl_excel_common IMPLEMENTATION. e_row = e_row_end ). ENDIF. + IF e_column_start_int IS SUPPLIED AND e_column_start IS NOT INITIAL. + e_column_start_int = convert_column2int( e_column_start ). + ENDIF. + IF e_column_end_int IS SUPPLIED AND e_column_end IS NOT INITIAL. + e_column_end_int = convert_column2int( e_column_end ). + ENDIF. + e_sheet = unescape_string( lv_sheet ). " Return in unescaped form ENDMETHOD. diff --git a/src/zcl_excel_common.clas.testclasses.abap b/src/zcl_excel_common.clas.testclasses.abap index 3828002..7d229d1 100644 --- a/src/zcl_excel_common.clas.testclasses.abap +++ b/src/zcl_excel_common.clas.testclasses.abap @@ -12,6 +12,15 @@ CLASS lcl_excel_common_test DEFINITION FOR TESTING PRIVATE SECTION. * ================ + TYPES: BEGIN OF ty_convert_range2column_a_row, + column_start TYPE zexcel_cell_column_alpha, + column_start_int TYPE zexcel_cell_column, + column_end TYPE zexcel_cell_column_alpha, + column_end_int TYPE zexcel_cell_column, + row_start TYPE zexcel_cell_row, + row_end TYPE zexcel_cell_row, + sheet TYPE string, + END OF ty_convert_range2column_a_row. DATA: lx_excel TYPE REF TO zcx_excel, ls_symsg_act LIKE sy, " actual messageinformation of exception @@ -24,9 +33,11 @@ CLASS lcl_excel_common_test DEFINITION FOR TESTING METHODS: convert_column2alpha_last FOR TESTING. METHODS: convert_column2alpha_oob FOR TESTING. METHODS convert_column2int_basic FOR TESTING. + METHODS convert_column2int_from_int FOR TESTING RAISING cx_static_check. METHODS convert_column2int_maxcol FOR TESTING. METHODS convert_column2int_oob_empty FOR TESTING. METHODS convert_column2int_oob_invalid FOR TESTING. + METHODS convert_columnrow2column_a_row FOR TESTING RAISING cx_static_check. METHODS date_to_excel_string1 FOR TESTING RAISING cx_static_check. METHODS date_to_excel_string2 FOR TESTING RAISING cx_static_check. METHODS date_to_excel_string3 FOR TESTING RAISING cx_static_check. @@ -46,6 +57,13 @@ CLASS lcl_excel_common_test DEFINITION FOR TESTING METHODS time_to_excel_string4 FOR TESTING RAISING cx_static_check. METHODS: split_file FOR TESTING. METHODS: convert_range2column_a_row FOR TESTING RAISING cx_static_check. + METHODS: assert_convert_range2column_a_ + IMPORTING + i_range TYPE clike + i_allow_1dim_range TYPE abap_bool DEFAULT abap_false + is_exp TYPE ty_convert_range2column_a_row + RAISING + cx_static_check. METHODS: describe_structure FOR TESTING. METHODS macro_calculate_cell_distance IMPORTING @@ -238,6 +256,17 @@ CLASS lcl_excel_common_test IMPLEMENTATION. ENDMETHOD. "convert_column2int_basic. + METHOD convert_column2int_from_int. + + DATA ep_column TYPE zexcel_cell_column. + + ep_column = zcl_excel_common=>convert_column2int( 5 ). + + cl_abap_unit_assert=>assert_equals( act = ep_column exp = 5 ). + + ENDMETHOD. + + METHOD convert_column2int_maxcol. * ========================== * Test 2. Max column @@ -309,6 +338,27 @@ CLASS lcl_excel_common_test IMPLEMENTATION. ENDMETHOD. "convert_column2int_oob_invalid. + METHOD convert_columnrow2column_a_row. + + DATA: column TYPE zexcel_cell_column_alpha, + column_int TYPE zexcel_cell_column, + row TYPE zexcel_cell_row. + + zcl_excel_common=>convert_columnrow2column_a_row( + EXPORTING + i_columnrow = 'B6' + IMPORTING + e_column = column + e_column_int = column_int + e_row = row ). + + cl_abap_unit_assert=>assert_equals( act = column exp = 'B' msg = 'Invalid column (alpha)' ). + cl_abap_unit_assert=>assert_equals( act = column_int exp = 2 msg = 'Invalid column (numeric)' ). + cl_abap_unit_assert=>assert_equals( act = row exp = 6 msg = 'Invalid row' ). + + ENDMETHOD. + + METHOD date_to_excel_string1. DATA ep_value TYPE zexcel_cell_value. @@ -764,261 +814,147 @@ CLASS lcl_excel_common_test IMPLEMENTATION. ENDMETHOD. "split_file METHOD convert_range2column_a_row. - DATA: lv_range TYPE string. - DATA: lv_column_start TYPE zexcel_cell_column_alpha, - lv_column_end TYPE zexcel_cell_column_alpha, - lv_row_start TYPE zexcel_cell_row, - lv_row_end TYPE zexcel_cell_row, - lv_sheet TYPE string. + DATA: lv_range TYPE string, + ls_exp TYPE ty_convert_range2column_a_row. * a) input empty --> nothing to do - zcl_excel_common=>convert_range2column_a_row( - EXPORTING - i_range = lv_range - IMPORTING - e_column_start = lv_column_start " Cell Column Start - e_column_end = lv_column_end " Cell Column End - e_row_start = lv_row_start " Cell Row - e_row_end = lv_row_end " Cell Row - e_sheet = lv_sheet " Title - ). + lv_range = ''. + + CLEAR ls_exp. + + assert_convert_range2column_a_( i_range = lv_range is_exp = ls_exp ). - cl_abap_unit_assert=>assert_equals( - act = lv_column_start - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( - act = lv_column_end - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( - act = lv_row_start - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( - act = lv_row_end - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( - act = lv_sheet - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). * b) sheetname existing - starts with ' example 'Sheet 1'!$B$6:$D$13 lv_range = `'Sheet 1'!$B$6:$D$13`. - zcl_excel_common=>convert_range2column_a_row( - EXPORTING - i_range = lv_range - IMPORTING - e_column_start = lv_column_start " Cell Column Start - e_column_end = lv_column_end " Cell Column End - e_row_start = lv_row_start " Cell Row - e_row_end = lv_row_end " Cell Row - e_sheet = lv_sheet " Title - ). - cl_abap_unit_assert=>assert_equals( - act = lv_column_start - exp = 'B' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( - act = lv_column_end - exp = 'D' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( - act = lv_row_start - exp = '6' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( - act = lv_row_end - exp = '13' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( - act = lv_sheet - exp = 'Sheet 1' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). + CLEAR ls_exp. + ls_exp-column_start = 'B'. + ls_exp-column_start_int = 2. + ls_exp-column_end = 'D'. + ls_exp-column_end_int = 4. + ls_exp-row_start = 6. + ls_exp-row_end = 13. + ls_exp-sheet = 'Sheet 1'. + + assert_convert_range2column_a_( i_range = lv_range is_exp = ls_exp ). + * c) sheetname existing - does not start with ' example Sheet1!$B$6:$D$13 lv_range = `Sheet1!B6:$D$13`. - zcl_excel_common=>convert_range2column_a_row( - EXPORTING - i_range = lv_range - IMPORTING - e_column_start = lv_column_start " Cell Column Start - e_column_end = lv_column_end " Cell Column End - e_row_start = lv_row_start " Cell Row - e_row_end = lv_row_end " Cell Row - e_sheet = lv_sheet " Title - ). - cl_abap_unit_assert=>assert_equals( - act = lv_column_start - exp = 'B' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( - act = lv_column_end - exp = 'D' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( - act = lv_row_start - exp = '6' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( - act = lv_row_end - exp = '13' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( - act = lv_sheet - exp = 'Sheet1' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). + CLEAR ls_exp. + ls_exp-column_start = 'B'. + ls_exp-column_start_int = 2. + ls_exp-column_end = 'D'. + ls_exp-column_end_int = 4. + ls_exp-row_start = 6. + ls_exp-row_end = 13. + ls_exp-sheet = 'Sheet1'. + + assert_convert_range2column_a_( i_range = lv_range is_exp = ls_exp ). + * d) no sheetname - just area example $B$6:$D$13 lv_range = `$B$6:D13`. - zcl_excel_common=>convert_range2column_a_row( - EXPORTING - i_range = lv_range - IMPORTING - e_column_start = lv_column_start " Cell Column Start - e_column_end = lv_column_end " Cell Column End - e_row_start = lv_row_start " Cell Row - e_row_end = lv_row_end " Cell Row - e_sheet = lv_sheet " Title - ). - cl_abap_unit_assert=>assert_equals( - act = lv_column_start - exp = 'B' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( - act = lv_column_end - exp = 'D' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( - act = lv_row_start - exp = '6' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( - act = lv_row_end - exp = '13' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( - act = lv_sheet - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). + CLEAR ls_exp. + ls_exp-column_start = 'B'. + ls_exp-column_start_int = 2. + ls_exp-column_end = 'D'. + ls_exp-column_end_int = 4. + ls_exp-row_start = 6. + ls_exp-row_end = 13. + + assert_convert_range2column_a_( i_range = lv_range is_exp = ls_exp ). ********************************************************************** * 1 Dimensional Ranges - Ros or Cols Only (eg Print Tiles) * lv_range = `$2:$7`. - zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = lv_range - i_allow_1dim_range = abap_false - IMPORTING e_column_start = lv_column_start - e_column_end = lv_column_end - e_row_start = lv_row_start - e_row_end = lv_row_end - e_sheet = lv_sheet ). - cl_abap_unit_assert=>assert_equals( act = lv_column_start - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( act = lv_column_end - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( act = lv_row_start - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( act = lv_row_end - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( act = lv_sheet - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). + CLEAR ls_exp. + + assert_convert_range2column_a_( i_range = lv_range i_allow_1dim_range = abap_false is_exp = ls_exp ). *** lv_range = `$2:$7`. - zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = lv_range - i_allow_1dim_range = abap_true - IMPORTING e_column_start = lv_column_start - e_column_end = lv_column_end - e_row_start = lv_row_start - e_row_end = lv_row_end - e_sheet = lv_sheet ). - cl_abap_unit_assert=>assert_equals( act = lv_column_start - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( act = lv_column_end - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( act = lv_row_start - exp = '2' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( act = lv_row_end - exp = '7' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( act = lv_sheet - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). + CLEAR ls_exp. + ls_exp-row_start = 2. + ls_exp-row_end = 7. + + assert_convert_range2column_a_( i_range = lv_range i_allow_1dim_range = abap_true is_exp = ls_exp ). + *** lv_range = `Sheet3!$D:$I`. - zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = lv_range - i_allow_1dim_range = abap_true - IMPORTING e_column_start = lv_column_start - e_column_end = lv_column_end - e_row_start = lv_row_start - e_row_end = lv_row_end - e_sheet = lv_sheet ). - cl_abap_unit_assert=>assert_equals( act = lv_column_start - exp = 'D' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( act = lv_column_end - exp = 'I' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( act = lv_row_start - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( act = lv_row_end - exp = '' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). - cl_abap_unit_assert=>assert_equals( act = lv_sheet - exp = 'Sheet3' - msg = 'Conversion of range failed' - level = if_aunit_constants=>critical ). + CLEAR ls_exp. + ls_exp-column_start = 'D'. + ls_exp-column_start_int = 4. + ls_exp-column_end = 'I'. + ls_exp-column_end_int = 9. + ls_exp-sheet = 'Sheet3'. + + assert_convert_range2column_a_( i_range = lv_range i_allow_1dim_range = abap_true is_exp = ls_exp ). + ENDMETHOD. "convert_range2column_a_row + METHOD assert_convert_range2column_a_. + + DATA: ls_act TYPE ty_convert_range2column_a_row, + lv_message TYPE string. + + zcl_excel_common=>convert_range2column_a_row( + EXPORTING + i_range = i_range + i_allow_1dim_range = i_allow_1dim_range + IMPORTING + e_column_start = ls_act-column_start + e_column_start_int = ls_act-column_start_int + e_column_end = ls_act-column_end + e_column_end_int = ls_act-column_end_int + e_row_start = ls_act-row_start + e_row_end = ls_act-row_end + e_sheet = ls_act-sheet ). + + lv_message = `Invalid column start (alpha) for ` && i_range. + cl_abap_unit_assert=>assert_equals( + act = ls_act-column_start + exp = is_exp-column_start + msg = lv_message ). + lv_message = `Invalid column start (numeric) for ` && i_range. + cl_abap_unit_assert=>assert_equals( + act = ls_act-column_start_int + exp = is_exp-column_start_int + msg = lv_message ). + lv_message = `Invalid column end (alpha) for ` && i_range. + cl_abap_unit_assert=>assert_equals( + act = ls_act-column_end + exp = is_exp-column_end + msg = lv_message ). + lv_message = `Invalid column end (numeric) for ` && i_range. + cl_abap_unit_assert=>assert_equals( + act = ls_act-column_end_int + exp = is_exp-column_end_int + msg = lv_message ). + lv_message = `Invalid row start for ` && i_range. + cl_abap_unit_assert=>assert_equals( + act = ls_act-row_start + exp = is_exp-row_start + msg = lv_message ). + lv_message = `Invalid row end for ` && i_range. + cl_abap_unit_assert=>assert_equals( + act = ls_act-row_end + exp = is_exp-row_end + msg = lv_message ). + lv_message = `Invalid sheet for ` && i_range. + cl_abap_unit_assert=>assert_equals( + act = ls_act-sheet + exp = is_exp-sheet + msg = lv_message ). + + ENDMETHOD. + + METHOD describe_structure. DATA: ls_test TYPE zexcel_pane. DATA: lo_structdescr TYPE REF TO cl_abap_structdescr. diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index 0760cc5..ef1cd36 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -181,17 +181,19 @@ CLASS zcl_excel_worksheet DEFINITION zcx_excel . METHODS change_area_style IMPORTING - !ip_column_start TYPE simple + !ip_range TYPE csequence OPTIONAL + !ip_column_start TYPE simple OPTIONAL !ip_column_end TYPE simple OPTIONAL - !ip_row TYPE zexcel_cell_row + !ip_row TYPE zexcel_cell_row OPTIONAL !ip_row_to TYPE zexcel_cell_row OPTIONAL !ip_style_changer TYPE REF TO zif_excel_style_changer RAISING zcx_excel . METHODS change_cell_style IMPORTING - !ip_column TYPE simple - !ip_row TYPE zexcel_cell_row + !ip_columnrow TYPE csequence OPTIONAL + !ip_column TYPE simple OPTIONAL + !ip_row TYPE zexcel_cell_row OPTIONAL !ip_complete TYPE zexcel_s_cstyle_complete OPTIONAL !ip_xcomplete TYPE zexcel_s_cstylex_complete OPTIONAL !ip_font TYPE zexcel_s_cstyle_font OPTIONAL @@ -333,15 +335,16 @@ CLASS zcl_excel_worksheet DEFINITION zcx_excel . METHODS get_cell IMPORTING - !ip_column TYPE simple - !ip_row TYPE zexcel_cell_row + !ip_columnrow TYPE csequence OPTIONAL + !ip_column TYPE simple OPTIONAL + !ip_row TYPE zexcel_cell_row OPTIONAL EXPORTING - !ep_value TYPE zexcel_cell_value - !ep_rc TYPE sysubrc - !ep_style TYPE REF TO zcl_excel_style - !ep_guid TYPE zexcel_cell_style - !ep_formula TYPE zexcel_cell_formula - !et_rtf TYPE zexcel_t_rtf + !ep_value TYPE zexcel_cell_value + !ep_rc TYPE sysubrc + !ep_style TYPE REF TO zcl_excel_style + !ep_guid TYPE zexcel_cell_style + !ep_formula TYPE zexcel_cell_formula + !et_rtf TYPE zexcel_t_rtf RAISING zcx_excel . METHODS get_column @@ -483,8 +486,9 @@ CLASS zcl_excel_worksheet DEFINITION zcx_excel . METHODS set_cell IMPORTING - !ip_column TYPE simple - !ip_row TYPE zexcel_cell_row + !ip_columnrow TYPE csequence OPTIONAL + !ip_column TYPE simple OPTIONAL + !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 @@ -497,15 +501,17 @@ CLASS zcl_excel_worksheet DEFINITION zcx_excel . METHODS set_cell_formula IMPORTING - !ip_column TYPE simple - !ip_row TYPE zexcel_cell_row - !ip_formula TYPE zexcel_cell_formula + !ip_columnrow TYPE csequence OPTIONAL + !ip_column TYPE simple OPTIONAL + !ip_row TYPE zexcel_cell_row OPTIONAL + !ip_formula TYPE zexcel_cell_formula RAISING zcx_excel . METHODS set_cell_style IMPORTING - !ip_column TYPE simple - !ip_row TYPE zexcel_cell_row + !ip_columnrow TYPE csequence OPTIONAL + !ip_column TYPE simple OPTIONAL + !ip_row TYPE zexcel_cell_row OPTIONAL !ip_style TYPE zexcel_cell_style RAISING zcx_excel . @@ -526,10 +532,11 @@ CLASS zcl_excel_worksheet DEFINITION !it_ignored_errors TYPE mty_th_ignored_errors . METHODS set_merge IMPORTING - !ip_column_start TYPE simple DEFAULT zcl_excel_common=>c_excel_sheet_min_col - !ip_column_end TYPE simple DEFAULT zcl_excel_common=>c_excel_sheet_max_col - !ip_row TYPE zexcel_cell_row DEFAULT zcl_excel_common=>c_excel_sheet_min_row - !ip_row_to TYPE zexcel_cell_row DEFAULT zcl_excel_common=>c_excel_sheet_max_row + !ip_range TYPE csequence OPTIONAL + !ip_column_start TYPE simple OPTIONAL + !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_value TYPE simple OPTIONAL "added parameter !ip_formula TYPE zexcel_cell_formula OPTIONAL "added parameter @@ -589,6 +596,7 @@ CLASS zcl_excel_worksheet DEFINITION zcx_excel . METHODS set_merge_style IMPORTING + !ip_range TYPE csequence OPTIONAL !ip_column_start TYPE simple OPTIONAL !ip_column_end TYPE simple OPTIONAL !ip_row TYPE zexcel_cell_row OPTIONAL @@ -598,9 +606,10 @@ CLASS zcl_excel_worksheet DEFINITION zcx_excel . METHODS set_area_formula IMPORTING - !ip_column_start TYPE simple + !ip_range TYPE csequence OPTIONAL + !ip_column_start TYPE simple OPTIONAL !ip_column_end TYPE simple OPTIONAL - !ip_row TYPE zexcel_cell_row + !ip_row TYPE zexcel_cell_row OPTIONAL !ip_row_to TYPE zexcel_cell_row OPTIONAL !ip_formula TYPE zexcel_cell_formula !ip_merge TYPE abap_bool OPTIONAL @@ -609,9 +618,10 @@ CLASS zcl_excel_worksheet DEFINITION zcx_excel . METHODS set_area_style IMPORTING - !ip_column_start TYPE simple + !ip_range TYPE csequence OPTIONAL + !ip_column_start TYPE simple OPTIONAL !ip_column_end TYPE simple OPTIONAL - !ip_row TYPE zexcel_cell_row + !ip_row TYPE zexcel_cell_row OPTIONAL !ip_row_to TYPE zexcel_cell_row OPTIONAL !ip_style TYPE zexcel_cell_style !ip_merge TYPE abap_bool OPTIONAL @@ -619,9 +629,10 @@ CLASS zcl_excel_worksheet DEFINITION zcx_excel . METHODS set_area IMPORTING - !ip_column_start TYPE simple + !ip_range TYPE csequence OPTIONAL + !ip_column_start TYPE simple OPTIONAL !ip_column_end TYPE simple OPTIONAL - !ip_row TYPE zexcel_cell_row + !ip_row TYPE zexcel_cell_row OPTIONAL !ip_row_to TYPE zexcel_cell_row OPTIONAL !ip_value TYPE simple OPTIONAL !ip_formula TYPE zexcel_cell_formula OPTIONAL @@ -638,9 +649,10 @@ CLASS zcl_excel_worksheet DEFINITION VALUE(rt_drawings) TYPE zexcel_t_drawings . METHODS set_area_hyperlink IMPORTING - !ip_column_start TYPE simple + !ip_range TYPE csequence OPTIONAL + !ip_column_start TYPE simple OPTIONAL !ip_column_end TYPE simple OPTIONAL - !ip_row TYPE zexcel_cell_row + !ip_row TYPE zexcel_cell_row OPTIONAL !ip_row_to TYPE zexcel_cell_row OPTIONAL !ip_url TYPE string !ip_is_internal TYPE abap_bool @@ -730,6 +742,30 @@ 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_columnrow_parameter + IMPORTING + ip_columnrow TYPE csequence OPTIONAL + ip_column TYPE simple OPTIONAL + ip_row TYPE zexcel_cell_row OPTIONAL + EXPORTING + ep_column TYPE zexcel_cell_column + ep_row TYPE zexcel_cell_row + RAISING + zcx_excel. + METHODS normalize_range_parameter + IMPORTING + ip_range TYPE csequence OPTIONAL + ip_column_start TYPE simple OPTIONAL + ip_column_end TYPE simple OPTIONAL + ip_row TYPE zexcel_cell_row OPTIONAL + ip_row_to TYPE zexcel_cell_row OPTIONAL + EXPORTING + ep_column_start TYPE zexcel_cell_column + ep_column_end TYPE zexcel_cell_column + ep_row TYPE zexcel_cell_row + ep_row_to TYPE zexcel_cell_row + RAISING + zcx_excel. METHODS print_title_set_range . METHODS update_dimension_range RAISING @@ -1402,45 +1438,20 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. DATA: lv_row TYPE zexcel_cell_row, lv_row_start TYPE zexcel_cell_row, lv_row_to TYPE zexcel_cell_row, - lv_column_int TYPE zexcel_cell_column_alpha, - lv_column TYPE zexcel_cell_column_alpha, - lv_column_start TYPE zexcel_cell_column_alpha, - lv_column_end TYPE zexcel_cell_column_alpha, - lv_column_start_int TYPE zexcel_cell_column_alpha, - lv_column_end_int TYPE zexcel_cell_column_alpha. + lv_column_int TYPE zexcel_cell_column, + lv_column_start_int TYPE zexcel_cell_column, + lv_column_end_int TYPE zexcel_cell_column. - lv_row_to = ip_row_to. - lv_row = ip_row. - - IF lv_row_to IS INITIAL OR ip_row_to IS NOT SUPPLIED. - lv_row_to = lv_row. - ENDIF. - - lv_column_start = ip_column_start. - lv_column_end = ip_column_end. - - IF lv_column_end IS INITIAL OR ip_column_end IS NOT SUPPLIED. - lv_column_end = lv_column_start. - ENDIF. - - lv_column_start_int = zcl_excel_common=>convert_column2int( lv_column_start ). - lv_column_end_int = zcl_excel_common=>convert_column2int( lv_column_end ). - - IF lv_column_start_int > lv_column_end_int OR lv_row > lv_row_to. - - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Wrong Merging Parameters'. - - ENDIF. + normalize_range_parameter( EXPORTING ip_range = ip_range + ip_column_start = ip_column_start ip_column_end = ip_column_end + ip_row = ip_row ip_row_to = ip_row_to + IMPORTING ep_column_start = lv_column_start_int ep_column_end = lv_column_end_int + ep_row = lv_row_start ep_row_to = lv_row_to ). lv_column_int = lv_column_start_int. - lv_row_start = lv_row. WHILE lv_column_int <= lv_column_end_int. - lv_column = zcl_excel_common=>convert_column2alpha( lv_column_int ). lv_row = lv_row_start. - WHILE lv_row <= lv_row_to. ip_style_changer->apply( ip_worksheet = me @@ -1458,8 +1469,15 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. METHOD change_cell_style. - DATA: changer TYPE REF TO zif_excel_style_changer. + DATA: changer TYPE REF TO zif_excel_style_changer, + column TYPE zexcel_cell_column, + row TYPE zexcel_cell_row. + normalize_columnrow_parameter( EXPORTING ip_columnrow = ip_columnrow + ip_column = ip_column + ip_row = ip_row + IMPORTING ep_column = column + ep_row = row ). changer = zcl_excel_style_changer=>create( excel = excel ). @@ -1822,8 +1840,8 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ep_guid = changer->apply( ip_worksheet = me - ip_column = ip_column - ip_row = ip_row ). + ip_column = column + ip_row = row ). ENDMETHOD. "CHANGE_CELL_STYLE @@ -2091,11 +2109,16 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. METHOD get_cell. DATA: lv_column TYPE zexcel_cell_column, + lv_row TYPE zexcel_cell_row, ls_sheet_content TYPE zexcel_s_cell_data. - lv_column = zcl_excel_common=>convert_column2int( ip_column ). + normalize_columnrow_parameter( EXPORTING ip_columnrow = ip_columnrow + ip_column = ip_column + ip_row = ip_row + IMPORTING ep_column = lv_column + ep_row = lv_row ). - READ TABLE sheet_content INTO ls_sheet_content WITH TABLE KEY cell_row = ip_row + READ TABLE sheet_content INTO ls_sheet_content WITH TABLE KEY cell_row = lv_row cell_column = lv_column. ep_rc = sy-subrc. @@ -2867,6 +2890,86 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ENDMETHOD. + METHOD normalize_columnrow_parameter. + + IF ( ( ip_column IS NOT INITIAL OR ip_row IS NOT INITIAL ) AND ip_columnrow IS NOT INITIAL ) + OR ( ip_column IS INITIAL AND ip_row IS INITIAL AND ip_columnrow IS INITIAL ). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Please provide either row and column, or cell reference'. + ENDIF. + + IF ip_columnrow IS NOT INITIAL. + zcl_excel_common=>convert_columnrow2column_a_row( + EXPORTING + i_columnrow = ip_columnrow + IMPORTING + e_column_int = ep_column + e_row = ep_row ). + ELSE. + ep_column = zcl_excel_common=>convert_column2int( ip_column ). + ep_row = ip_row. + ENDIF. + + ENDMETHOD. + + + METHOD normalize_range_parameter. + + DATA: lv_errormessage TYPE string. + + IF ( ( ip_column_start IS NOT INITIAL OR ip_column_end IS NOT INITIAL + OR ip_row IS NOT INITIAL OR ip_row_to IS NOT INITIAL ) AND ip_range IS NOT INITIAL ) + OR ( ip_column_start IS INITIAL AND ip_column_end IS INITIAL + AND ip_row IS INITIAL AND ip_row_to IS INITIAL AND ip_range IS INITIAL ). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = 'Please provide either row and column interval, or range reference'. + ENDIF. + + IF ip_range IS NOT INITIAL. + zcl_excel_common=>convert_range2column_a_row( + EXPORTING + i_range = ip_range + IMPORTING + e_column_start_int = ep_column_start + e_column_end_int = ep_column_end + e_row_start = ep_row + e_row_end = ep_row_to ). + ELSE. + IF ip_column_start IS INITIAL. + ep_column_start = zcl_excel_common=>c_excel_sheet_min_col. + ELSE. + ep_column_start = zcl_excel_common=>convert_column2int( ip_column_start ). + ENDIF. + IF ip_column_end IS INITIAL. + ep_column_end = ep_column_start. + ELSE. + ep_column_end = zcl_excel_common=>convert_column2int( ip_column_end ). + ENDIF. + ep_row = ip_row. + IF ep_row IS INITIAL. + ep_row = zcl_excel_common=>c_excel_sheet_min_row. + ENDIF. + ep_row_to = ip_row_to. + IF ep_row_to IS INITIAL. + ep_row_to = ep_row. + ENDIF. + ENDIF. + + IF ep_row > ep_row_to. + lv_errormessage = 'First row larger than last row'(405). + zcx_excel=>raise_text( lv_errormessage ). + ENDIF. + + IF ep_column_start > ep_column_end. + lv_errormessage = 'First column larger than last column'(406). + zcx_excel=>raise_text( lv_errormessage ). + ENDIF. + + ENDMETHOD. + + METHOD print_title_set_range. *--------------------------------------------------------------------* * issue#235 - repeat rows/columns @@ -2971,37 +3074,16 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. DATA: lv_row TYPE zexcel_cell_row, lv_row_start TYPE zexcel_cell_row, lv_row_end TYPE zexcel_cell_row, - lv_column_int TYPE zexcel_cell_column_alpha, + lv_column_int TYPE zexcel_cell_column, lv_column TYPE zexcel_cell_column_alpha, - lv_column_start TYPE zexcel_cell_column_alpha, - lv_column_end TYPE zexcel_cell_column_alpha, - lv_column_start_int TYPE zexcel_cell_column_alpha, - lv_column_end_int TYPE zexcel_cell_column_alpha. + lv_column_start_int TYPE zexcel_cell_column, + lv_column_end_int TYPE zexcel_cell_column. - lv_row_end = ip_row_to. - lv_row = ip_row. - - IF lv_row_end IS INITIAL OR ip_row_to IS NOT SUPPLIED. - lv_row_end = lv_row. - ENDIF. - - lv_column_start = ip_column_start. - lv_column_end = ip_column_end. - - IF lv_column_end IS INITIAL OR ip_column_end IS NOT SUPPLIED. - lv_column_end = lv_column_start. - ENDIF. - - lv_column_start_int = zcl_excel_common=>convert_column2int( lv_column_start ). - lv_column_end_int = zcl_excel_common=>convert_column2int( lv_column_end ). - - IF lv_column_start_int > lv_column_end_int OR lv_row > lv_row_end. - - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Wrong Merging Parameters'. - - ENDIF. + normalize_range_parameter( EXPORTING ip_range = ip_range + ip_column_start = ip_column_start ip_column_end = ip_column_end + ip_row = ip_row ip_row_to = ip_row_to + IMPORTING ep_column_start = lv_column_start_int ep_column_end = lv_column_end_int + ep_row = lv_row_start ep_row_to = lv_row_end ). " IP_AREA has been added to maintain ascending compatibility (see discussion in PR 869) IF ip_merge = abap_true OR ip_area = c_area-topleft. @@ -3009,8 +3091,8 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. IF ip_data_type IS SUPPLIED OR ip_abap_type IS SUPPLIED. - me->set_cell( ip_column = lv_column_start - ip_row = lv_row + me->set_cell( ip_column = lv_column_start_int + ip_row = lv_row_start ip_value = ip_value ip_formula = ip_formula ip_style = ip_style @@ -3020,8 +3102,8 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ELSE. - me->set_cell( ip_column = lv_column_start - ip_row = lv_row + me->set_cell( ip_column = lv_column_start_int + ip_row = lv_row_start ip_value = ip_value ip_formula = ip_formula ip_style = ip_style @@ -3032,7 +3114,6 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ELSE. lv_column_int = lv_column_start_int. - lv_row_start = lv_row. WHILE lv_column_int <= lv_column_end_int. lv_column = zcl_excel_common=>convert_column2alpha( lv_column_int ). @@ -3073,18 +3154,18 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. IF ip_style IS SUPPLIED. - me->set_area_style( ip_column_start = lv_column_start - ip_column_end = lv_column_end - ip_row = lv_row + me->set_area_style( ip_column_start = lv_column_start_int + ip_column_end = lv_column_end_int + ip_row = lv_row_start ip_row_to = lv_row_end ip_style = ip_style ). ENDIF. IF ip_merge IS SUPPLIED AND ip_merge = abap_true. - me->set_merge( ip_column_start = lv_column_start - ip_column_end = lv_column_end - ip_row = lv_row + me->set_merge( ip_column_start = lv_column_start_int + ip_column_end = lv_column_end_int + ip_row = lv_row_start ip_row_to = lv_row_end ). ENDIF. @@ -3093,45 +3174,29 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. METHOD set_area_formula. - DATA: ld_row TYPE zexcel_cell_row, - ld_row_start TYPE zexcel_cell_row, - ld_row_end TYPE zexcel_cell_row, - ld_column TYPE zexcel_cell_column_alpha, - ld_column_end TYPE zexcel_cell_column_alpha, - ld_column_int TYPE zexcel_cell_column_alpha, - ld_column_end_int TYPE zexcel_cell_column_alpha. + DATA: ld_row TYPE zexcel_cell_row, + ld_row_start TYPE zexcel_cell_row, + ld_row_end TYPE zexcel_cell_row, + ld_column TYPE zexcel_cell_column_alpha, + ld_column_int TYPE zexcel_cell_column, + ld_column_start_int TYPE zexcel_cell_column, + ld_column_end_int TYPE zexcel_cell_column. - ld_row_end = ip_row_to. - ld_row = ip_row. - IF ld_row_end IS INITIAL OR ip_row_to IS NOT SUPPLIED. - ld_row_end = ld_row. - ENDIF. - - ld_column = ip_column_start. - ld_column_end = ip_column_end. - - IF ld_column_end IS INITIAL OR ip_column_end IS NOT SUPPLIED. - ld_column_end = ld_column. - ENDIF. - - ld_column_int = zcl_excel_common=>convert_column2int( ld_column ). - ld_column_end_int = zcl_excel_common=>convert_column2int( ld_column_end ). - - IF ld_column_int > ld_column_end_int OR ld_row > ld_row_end. - RAISE EXCEPTION TYPE zcx_excel - EXPORTING - error = 'Wrong Merging Parameters'. - ENDIF. + normalize_range_parameter( EXPORTING ip_range = ip_range + ip_column_start = ip_column_start ip_column_end = ip_column_end + ip_row = ip_row ip_row_to = ip_row_to + IMPORTING ep_column_start = ld_column_start_int ep_column_end = ld_column_end_int + ep_row = ld_row_start ep_row_to = ld_row_end ). " IP_AREA has been added to maintain ascending compatibility (see discussion in PR 869) IF ip_merge = abap_true OR ip_area = c_area-topleft. - me->set_cell_formula( ip_column = ld_column ip_row = ld_row + me->set_cell_formula( ip_column = ld_column_start_int ip_row = ld_row_start ip_formula = ip_formula ). ELSE. - ld_row_start = ld_row. + ld_column_int = ld_column_start_int. WHILE ld_column_int <= ld_column_end_int. ld_column = zcl_excel_common=>convert_column2alpha( ld_column_int ). @@ -3150,8 +3215,8 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ENDIF. IF ip_merge IS SUPPLIED AND ip_merge = abap_true. - me->set_merge( ip_column_start = ld_column ip_row = ld_row - ip_column_end = ld_column_end ip_row_to = ld_row_end ). + me->set_merge( ip_column_start = ld_column_start_int ip_row = ld_row_start + ip_column_end = ld_column_end_int ip_row_to = ld_row_end ). ENDIF. ENDMETHOD. "set_area_formula @@ -3159,32 +3224,30 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. METHOD set_area_hyperlink. DATA: ld_row_start TYPE zexcel_cell_row, ld_row_end TYPE zexcel_cell_row, + ld_column_int TYPE zexcel_cell_column, ld_column_start_int TYPE zexcel_cell_column, ld_column_end_int TYPE zexcel_cell_column, ld_current_column TYPE zexcel_cell_column_alpha, ld_current_row TYPE zexcel_cell_row, - ld_value TYPE string. - DATA: lv_column TYPE zexcel_cell_column, - lo_hyperlink TYPE REF TO zcl_excel_hyperlink. + ld_value TYPE string, + ld_formula TYPE string. + DATA: lo_hyperlink TYPE REF TO zcl_excel_hyperlink. - ld_row_end = ip_row_to. - ld_row_start = ip_row. - IF ld_row_end IS INITIAL OR ip_row_to IS NOT SUPPLIED. - ld_row_end = ld_row_start. - ENDIF. - ld_column_start_int = zcl_excel_common=>convert_column2int( ip_column_start ). - ld_column_end_int = zcl_excel_common=>convert_column2int( ip_column_end ). - IF ld_column_end_int IS INITIAL OR ip_column_end IS NOT SUPPLIED. - ld_column_end_int = ld_column_start_int. - ENDIF. + normalize_range_parameter( EXPORTING ip_range = ip_range + ip_column_start = ip_column_start ip_column_end = ip_column_end + ip_row = ip_row ip_row_to = ip_row_to + IMPORTING ep_column_start = ld_column_start_int ep_column_end = ld_column_end_int + ep_row = ld_row_start ep_row_to = ld_row_end ). - WHILE ld_column_start_int <= ld_column_end_int. - ld_current_column = zcl_excel_common=>convert_column2alpha( ld_column_start_int ). + ld_column_int = ld_column_start_int. + WHILE ld_column_int <= ld_column_end_int. + ld_current_column = zcl_excel_common=>convert_column2alpha( ld_column_int ). ld_current_row = ld_row_start. WHILE ld_current_row <= ld_row_end. - me->get_cell( EXPORTING ip_column = ld_current_column ip_row = ld_current_row - IMPORTING ep_value = ld_value ). + me->get_cell( EXPORTING ip_column = ld_current_column ip_row = ld_current_row + IMPORTING ep_value = ld_value + ep_formula = ld_formula ). IF ip_is_internal = abap_true. lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = ip_url ). @@ -3192,11 +3255,11 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. lo_hyperlink = zcl_excel_hyperlink=>create_external_link( iv_url = ip_url ). ENDIF. - me->set_cell( ip_column = ld_current_column ip_row = ld_current_row ip_value = ld_value ip_hyperlink = lo_hyperlink ). + me->set_cell( ip_column = ld_current_column ip_row = ld_current_row ip_value = ld_value ip_formula = ld_formula ip_hyperlink = lo_hyperlink ). ADD 1 TO ld_current_row. ENDWHILE. - ADD 1 TO ld_column_start_int. + ADD 1 TO ld_column_int. ENDWHILE. ENDMETHOD. "SET_AREA_HYPERLINK @@ -3205,35 +3268,32 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. METHOD set_area_style. DATA: ld_row_start TYPE zexcel_cell_row, ld_row_end TYPE zexcel_cell_row, + ld_column_int TYPE zexcel_cell_column, ld_column_start_int TYPE zexcel_cell_column, ld_column_end_int TYPE zexcel_cell_column, ld_current_column TYPE zexcel_cell_column_alpha, ld_current_row TYPE zexcel_cell_row. - ld_row_end = ip_row_to. - ld_row_start = ip_row. - IF ld_row_end IS INITIAL OR ip_row_to IS NOT SUPPLIED. - ld_row_end = ld_row_start. - ENDIF. - ld_column_start_int = zcl_excel_common=>convert_column2int( ip_column_start ). - ld_column_end_int = zcl_excel_common=>convert_column2int( ip_column_end ). - IF ld_column_end_int IS INITIAL OR ip_column_end IS NOT SUPPLIED. - ld_column_end_int = ld_column_start_int. - ENDIF. + normalize_range_parameter( EXPORTING ip_range = ip_range + ip_column_start = ip_column_start ip_column_end = ip_column_end + ip_row = ip_row ip_row_to = ip_row_to + IMPORTING ep_column_start = ld_column_start_int ep_column_end = ld_column_end_int + ep_row = ld_row_start ep_row_to = ld_row_end ). - WHILE ld_column_start_int <= ld_column_end_int. - ld_current_column = zcl_excel_common=>convert_column2alpha( ld_column_start_int ). + ld_column_int = ld_column_start_int. + WHILE ld_column_int <= ld_column_end_int. + ld_current_column = zcl_excel_common=>convert_column2alpha( ld_column_int ). ld_current_row = ld_row_start. WHILE ld_current_row <= ld_row_end. me->set_cell_style( ip_row = ld_current_row ip_column = ld_current_column ip_style = ip_style ). ADD 1 TO ld_current_row. ENDWHILE. - ADD 1 TO ld_column_start_int. + ADD 1 TO ld_column_int. ENDWHILE. IF ip_merge IS SUPPLIED AND ip_merge = abap_true. - me->set_merge( ip_column_start = ip_column_start ip_row = ld_row_start - ip_column_end = ld_current_column ip_row_to = ld_row_end ). + me->set_merge( ip_column_start = ld_column_start_int ip_row = ld_row_start + ip_column_end = ld_column_end_int ip_row_to = ld_row_end ). ENDIF. ENDMETHOD. "SET_AREA_STYLE @@ -3242,6 +3302,7 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. DATA: lv_column TYPE zexcel_cell_column, ls_sheet_content TYPE zexcel_s_cell_data, + lv_row TYPE zexcel_cell_row, lv_row_alpha TYPE string, lv_col_alpha TYPE zexcel_cell_column_alpha, lv_value TYPE zexcel_cell_value, @@ -3268,18 +3329,23 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. zcx_excel=>raise_text( 'Please provide the value or formula' ). ENDIF. + normalize_columnrow_parameter( EXPORTING ip_columnrow = ip_columnrow + ip_column = ip_column + ip_row = ip_row + IMPORTING ep_column = lv_column + ep_row = lv_row ). + * Begin of change issue #152 - don't touch exisiting style if only value is passed - lv_column = zcl_excel_common=>convert_column2int( ip_column ). IF ip_column_formula_id <> 0. check_cell_column_formula( it_column_formulas = column_formulas ip_column_formula_id = ip_column_formula_id ip_formula = ip_formula ip_value = ip_value - ip_row = ip_row + ip_row = lv_row ip_column = lv_column ). ENDIF. - READ TABLE sheet_content ASSIGNING WITH TABLE KEY cell_row = ip_row " Changed to access via table key , Stefan Schmöcker, 2013-08-03 + READ TABLE sheet_content ASSIGNING WITH TABLE KEY cell_row = lv_row " Changed to access via table key , Stefan Schmöcker, 2013-08-03 cell_column = lv_column. IF sy-subrc = 0. IF ip_style IS INITIAL. @@ -3393,8 +3459,8 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ENDIF. IF ip_hyperlink IS BOUND. - ip_hyperlink->set_cell_reference( ip_column = ip_column - ip_row = ip_row ). + ip_hyperlink->set_cell_reference( ip_column = lv_column + ip_row = lv_row ). me->hyperlinks->add( ip_hyperlink ). ENDIF. @@ -3420,16 +3486,16 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. -cell_style = lv_style_guid. -data_type = lv_data_type. ELSE. - ls_sheet_content-cell_row = ip_row. + ls_sheet_content-cell_row = lv_row. ls_sheet_content-cell_column = lv_column. ls_sheet_content-cell_value = lv_value. ls_sheet_content-cell_formula = ip_formula. ls_sheet_content-column_formula_id = ip_column_formula_id. ls_sheet_content-cell_style = lv_style_guid. ls_sheet_content-data_type = lv_data_type. - lv_row_alpha = ip_row. + lv_row_alpha = lv_row. CONDENSE lv_row_alpha NO-GAPS. "ins #152 - replaced 2 shifts - should be faster - lv_col_alpha = zcl_excel_common=>convert_column2alpha( ip_column ). " issue #155 - less restrictive typing for ip_column + lv_col_alpha = zcl_excel_common=>convert_column2alpha( lv_column ). " issue #155 - less restrictive typing for ip_column CONCATENATE lv_col_alpha lv_row_alpha INTO ls_sheet_content-cell_coords. " issue #155 - less restrictive typing for ip_column INSERT ls_sheet_content INTO TABLE sheet_content ASSIGNING . "ins #152 - Now always holds the data @@ -3461,8 +3527,8 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ELSE. lo_format_code_datetime = stylemapping-complete_style-number_format-format_code. ENDIF. - me->change_cell_style( ip_column = ip_column - ip_row = ip_row + me->change_cell_style( ip_column = lv_column + ip_row = lv_row ip_number_format_format_code = lo_format_code_datetime ). WHEN cl_abap_typedescr=>typekind_time. @@ -3476,8 +3542,8 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ELSE. lo_format_code_datetime = stylemapping-complete_style-number_format-format_code. ENDIF. - me->change_cell_style( ip_column = ip_column - ip_row = ip_row + me->change_cell_style( ip_column = lv_column + ip_row = lv_row ip_number_format_format_code = lo_format_code_datetime ). ENDCASE. @@ -3486,8 +3552,8 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. * Fix issue #162 lv_value = ip_value. IF lv_value CS cl_abap_char_utilities=>cr_lf. - me->change_cell_style( ip_column = ip_column - ip_row = ip_row + me->change_cell_style( ip_column = lv_column + ip_row = lv_row ip_alignment_wraptext = abap_true ). ENDIF. * End of Fix issue #162 @@ -3498,6 +3564,7 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. METHOD set_cell_formula. DATA: lv_column TYPE zexcel_cell_column, + lv_row TYPE zexcel_cell_row, ls_sheet_content LIKE LINE OF me->sheet_content. FIELD-SYMBOLS: @@ -3506,12 +3573,17 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. *--------------------------------------------------------------------* * Get cell to set formula into *--------------------------------------------------------------------* - lv_column = zcl_excel_common=>convert_column2int( ip_column ). - READ TABLE me->sheet_content ASSIGNING WITH TABLE KEY cell_row = ip_row + normalize_columnrow_parameter( EXPORTING ip_columnrow = ip_columnrow + ip_column = ip_column + ip_row = ip_row + IMPORTING ep_column = lv_column + ep_row = lv_row ). + + READ TABLE me->sheet_content ASSIGNING WITH TABLE KEY cell_row = lv_row cell_column = lv_column. IF sy-subrc <> 0. " Create new entry in sheet_content if necessary CHECK ip_formula IS NOT INITIAL. " only create new entry in sheet_content when a formula is passed - ls_sheet_content-cell_row = ip_row. + ls_sheet_content-cell_row = lv_row. ls_sheet_content-cell_column = lv_column. INSERT ls_sheet_content INTO TABLE me->sheet_content ASSIGNING . ENDIF. @@ -3528,15 +3600,20 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. METHOD set_cell_style. DATA: lv_column TYPE zexcel_cell_column, + lv_row TYPE zexcel_cell_row, lv_style_guid TYPE zexcel_cell_style. FIELD-SYMBOLS: TYPE zexcel_s_cell_data. lv_style_guid = ip_style. - lv_column = zcl_excel_common=>convert_column2int( ip_column ). + normalize_columnrow_parameter( EXPORTING ip_columnrow = ip_columnrow + ip_column = ip_column + ip_row = ip_row + IMPORTING ep_column = lv_column + ep_row = lv_row ). - READ TABLE sheet_content ASSIGNING WITH KEY cell_row = ip_row + READ TABLE sheet_content ASSIGNING WITH KEY cell_row = lv_row cell_column = lv_column. IF sy-subrc EQ 0. @@ -3594,53 +3671,44 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. METHOD set_merge. DATA: ls_merge TYPE mty_merge, + lv_column_start TYPE zexcel_cell_column, + lv_column_end TYPE zexcel_cell_column, + lv_row TYPE zexcel_cell_row, + lv_row_to TYPE zexcel_cell_row, lv_errormessage TYPE string. - ... - "just after variables definition + normalize_range_parameter( EXPORTING ip_range = ip_range + ip_column_start = ip_column_start ip_column_end = ip_column_end + ip_row = ip_row ip_row_to = ip_row_to + IMPORTING ep_column_start = lv_column_start ep_column_end = lv_column_end + ep_row = lv_row ep_row_to = lv_row_to ). + IF ip_value IS SUPPLIED OR ip_formula IS SUPPLIED. " if there is a value or formula set the value to the top-left cell "maybe it is necessary to support other paramters for set_cell IF ip_value IS SUPPLIED. - me->set_cell( ip_row = ip_row ip_column = ip_column_start + me->set_cell( ip_row = lv_row ip_column = lv_column_start ip_value = ip_value ). ENDIF. IF ip_formula IS SUPPLIED. - me->set_cell( ip_row = ip_row ip_column = ip_column_start + me->set_cell( ip_row = lv_row ip_column = lv_column_start ip_value = ip_formula ). ENDIF. ENDIF. "call to set_merge_style to apply the style to all cells at the matrix IF ip_style IS SUPPLIED. - me->set_merge_style( ip_row = ip_row ip_column_start = ip_column_start - ip_row_to = ip_row_to ip_column_end = ip_column_end + me->set_merge_style( ip_row = lv_row ip_column_start = lv_column_start + ip_row_to = lv_row_to ip_column_end = lv_column_end ip_style = ip_style ). ENDIF. ... *--------------------------------------------------------------------* * Build new range area to insert into range table *--------------------------------------------------------------------* - ls_merge-row_from = ip_row. - IF ip_row IS SUPPLIED AND ip_row IS NOT INITIAL AND ip_row_to IS NOT SUPPLIED. - ls_merge-row_to = ls_merge-row_from. - ELSE. - ls_merge-row_to = ip_row_to. - ENDIF. - IF ls_merge-row_from > ls_merge-row_to. - lv_errormessage = 'Merge: First row larger then last row'(405). - zcx_excel=>raise_text( lv_errormessage ). - ENDIF. - - ls_merge-col_from = zcl_excel_common=>convert_column2int( ip_column_start ). - IF ip_column_start IS SUPPLIED AND ip_column_start IS NOT INITIAL AND ip_column_end IS NOT SUPPLIED. - ls_merge-col_to = ls_merge-col_from. - ELSE. - ls_merge-col_to = zcl_excel_common=>convert_column2int( ip_column_end ). - ENDIF. - IF ls_merge-col_from > ls_merge-col_to. - lv_errormessage = 'Merge: First column larger then last column'(406). - zcx_excel=>raise_text( lv_errormessage ). - ENDIF. + ls_merge-row_from = lv_row. + ls_merge-row_to = lv_row_to. + ls_merge-col_from = lv_column_start. + ls_merge-col_to = lv_column_end. *--------------------------------------------------------------------* * Check merge not overlapping with existing merges @@ -3665,31 +3733,29 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. METHOD set_merge_style. DATA: ld_row_start TYPE zexcel_cell_row, ld_row_end TYPE zexcel_cell_row, + ld_column_int TYPE zexcel_cell_column, ld_column_start TYPE zexcel_cell_column, ld_column_end TYPE zexcel_cell_column, ld_current_column TYPE zexcel_cell_column_alpha, ld_current_row TYPE zexcel_cell_row. - ld_row_end = ip_row_to. - ld_row_start = ip_row. - IF ld_row_end IS INITIAL. - ld_row_end = ld_row_start. - ENDIF. - ld_column_start = zcl_excel_common=>convert_column2int( ip_column_start ). - ld_column_end = zcl_excel_common=>convert_column2int( ip_column_end ). - IF ld_column_end IS INITIAL. - ld_column_end = ld_column_start. - ENDIF. + normalize_range_parameter( EXPORTING ip_range = ip_range + ip_column_start = ip_column_start ip_column_end = ip_column_end + ip_row = ip_row ip_row_to = ip_row_to + IMPORTING ep_column_start = ld_column_start ep_column_end = ld_column_end + ep_row = ld_row_start ep_row_to = ld_row_end ). + "set the style cell by cell - WHILE ld_column_start <= ld_column_end. - ld_current_column = zcl_excel_common=>convert_column2alpha( ld_column_start ). + ld_column_int = ld_column_start. + WHILE ld_column_int <= ld_column_end. + ld_current_column = zcl_excel_common=>convert_column2alpha( ld_column_int ). ld_current_row = ld_row_start. WHILE ld_current_row <= ld_row_end. me->set_cell_style( ip_row = ld_current_row ip_column = ld_current_column ip_style = ip_style ). ADD 1 TO ld_current_row. ENDWHILE. - ADD 1 TO ld_column_start. + ADD 1 TO ld_column_int. ENDWHILE. ENDMETHOD. "set_merge_style diff --git a/src/zcl_excel_worksheet.clas.testclasses.abap b/src/zcl_excel_worksheet.clas.testclasses.abap index b9bb8e7..7a6dd6e 100644 --- a/src/zcl_excel_worksheet.clas.testclasses.abap +++ b/src/zcl_excel_worksheet.clas.testclasses.abap @@ -1,5 +1,9 @@ +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_columnrow_param + ltc_normalize_range_param ltc_check_cell_column_formula. CLASS lcl_excel_worksheet_test DEFINITION FOR TESTING @@ -55,6 +59,87 @@ CLASS ltc_check_cell_column_formula DEFINITION FOR TESTING ENDCLASS. +CLASS ltc_normalize_columnrow_param DEFINITION FOR TESTING + RISK LEVEL HARMLESS + DURATION SHORT. + + PRIVATE SECTION. + TYPES : BEGIN OF ty_parameters, + BEGIN OF input, + columnrow TYPE string, + column TYPE string, + row TYPE zexcel_cell_row, + END OF input, + BEGIN OF output, + fails TYPE abap_bool, + column TYPE zexcel_cell_column, + row TYPE zexcel_cell_row, + END OF output, + END OF ty_parameters. + DATA: + cut TYPE REF TO zcl_excel_worksheet. "class under test + + METHODS setup. + METHODS: + test FOR TESTING RAISING cx_static_check, + all_parameters_passed FOR TESTING RAISING cx_static_check, + none_parameter_passed 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_range_param DEFINITION FOR TESTING + RISK LEVEL HARMLESS + DURATION SHORT. + + PRIVATE SECTION. + TYPES : BEGIN OF ty_parameters, + BEGIN OF input, + range TYPE string, + column_start TYPE string, + column_end TYPE string, + row TYPE zexcel_cell_row, + row_to TYPE zexcel_cell_row, + END OF input, + BEGIN OF output, + fails TYPE abap_bool, + column_start TYPE zexcel_cell_column, + column_end TYPE zexcel_cell_column, + row_start TYPE zexcel_cell_row, + row_end TYPE zexcel_cell_row, + END OF output, + END OF ty_parameters. + DATA: + cut TYPE REF TO zcl_excel_worksheet. "class under test + + METHODS setup. + METHODS: + range_one_cell FOR TESTING RAISING cx_static_check, + relative_range FOR TESTING RAISING cx_static_check, + invalid_range FOR TESTING RAISING cx_static_check, + absolute_range FOR TESTING RAISING cx_static_check, + reverse_range_not_supported FOR TESTING RAISING cx_static_check, + all_parameters_passed FOR TESTING RAISING cx_static_check, + none_parameter_passed FOR TESTING RAISING cx_static_check, + start_without_end 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 lcl_excel_worksheet_test IMPLEMENTATION. * ============================================== @@ -540,3 +625,246 @@ CLASS ltc_check_cell_column_formula IMPLEMENTATION. ENDMETHOD. ENDCLASS. + + +CLASS ltc_normalize_columnrow_param 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 test. + DATA: input TYPE ty_parameters-input, + exp TYPE ty_parameters-output. + + input-columnrow = 'B4'. + exp-column = 2. + exp-row = 4. + assert( input = input exp = exp ). + + ENDMETHOD. + + METHOD all_parameters_passed. + DATA: input TYPE ty_parameters-input, + exp TYPE ty_parameters-output. + + input-columnrow = 'B4'. + input-column = 'B'. + input-row = 4. + exp-fails = abap_true. + assert( input = input exp = exp ). + + ENDMETHOD. + + METHOD none_parameter_passed. + DATA: input TYPE ty_parameters-input, + exp TYPE ty_parameters-output. + + exp-fails = abap_true. + assert( input = input exp = exp ). + + ENDMETHOD. + + METHOD assert. + DATA: act TYPE ty_parameters-output, + error TYPE REF TO zcx_excel, + input_text TYPE string, + message TYPE string. + + TRY. + + cut->normalize_columnrow_parameter( EXPORTING ip_columnrow = input-columnrow + ip_column = input-column + ip_row = input-row + IMPORTING ep_column = act-column + ep_row = act-row ). + IF exp-fails = abap_true. + message = |Should have failed for { input_text }|. + cl_abap_unit_assert=>fail( msg = message ). + ENDIF. + + CATCH zcx_excel INTO error. + IF exp-fails = abap_false. + RAISE EXCEPTION error. + ENDIF. + RETURN. + ENDTRY. + + input_text = |input column/row { input-columnrow }, column { input-column }, row { input-row }|. + message = |Invalid column for { input_text }|. + cl_abap_unit_assert=>assert_equals( msg = message exp = exp-column act = act-column ). + message = |Invalid row for { input_text }|. + cl_abap_unit_assert=>assert_equals( msg = message exp = exp-row act = act-row ). + ENDMETHOD. + +ENDCLASS. + + +CLASS ltc_normalize_range_param 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 range_one_cell. + DATA: input TYPE ty_parameters-input, + exp TYPE ty_parameters-output. + + CLEAR: input, exp. + input-range = 'B4:B4'. + exp-column_start = 2. + exp-column_end = 2. + exp-row_start = 4. + exp-row_end = 4. + assert( input = input exp = exp ). + + ENDMETHOD. + + METHOD relative_range. + DATA: input TYPE ty_parameters-input, + exp TYPE ty_parameters-output. + + CLEAR: input, exp. + input-range = 'B4:AA10'. + exp-column_start = 2. + exp-column_end = 27. + exp-row_start = 4. + exp-row_end = 10. + assert( input = input exp = exp ). + + ENDMETHOD. + + METHOD absolute_range. + DATA: input TYPE ty_parameters-input, + exp TYPE ty_parameters-output. + + CLEAR: input, exp. + input-range = '$B$4:$AA$10'. + exp-column_start = 2. + exp-column_end = 27. + exp-row_start = 4. + exp-row_end = 10. + assert( input = input exp = exp ). + + ENDMETHOD. + + METHOD invalid_range. + DATA: input TYPE ty_parameters-input, + exp TYPE ty_parameters-output. + + CLEAR: input, exp. + input-range = 'B4'. + exp-fails = abap_true. + assert( input = input exp = exp ). + + ENDMETHOD. + + METHOD reverse_range_not_supported. + DATA: input TYPE ty_parameters-input, + exp TYPE ty_parameters-output. + + CLEAR: input, exp. + input-range = 'B4:A1'. + exp-fails = abap_true. + assert( input = input exp = exp ). + + ENDMETHOD. + + METHOD all_parameters_passed. + DATA: input TYPE ty_parameters-input, + exp TYPE ty_parameters-output. + + input-range = 'B4:B4'. + input-column_start = 'B'. + input-row = 4. + exp-fails = abap_true. + assert( input = input exp = exp ). + + ENDMETHOD. + + METHOD none_parameter_passed. + DATA: input TYPE ty_parameters-input, + exp TYPE ty_parameters-output. + + exp-fails = abap_true. + assert( input = input exp = exp ). + + ENDMETHOD. + + METHOD start_without_end. + DATA: input TYPE ty_parameters-input, + exp TYPE ty_parameters-output. + + input-column_start = 'B'. + input-row = 4. + exp-column_start = 2. + exp-column_end = 2. + exp-row_start = 4. + exp-row_end = 4. + assert( input = input exp = exp ). + + ENDMETHOD. + + METHOD assert. + DATA: act TYPE ty_parameters-output, + error TYPE REF TO zcx_excel, + input_text TYPE string, + message TYPE string. + + input_text = |input range { input-range }, column start { input-column_start }, column end { input-column_end }|. + + TRY. + + cut->normalize_range_parameter( EXPORTING ip_range = input-range + ip_column_start = input-column_start ip_column_end = input-column_end + ip_row = input-row ip_row_to = input-row_to + IMPORTING ep_column_start = act-column_start ep_column_end = act-column_end + ep_row = act-row_start ep_row_to = act-row_end ). + IF exp-fails = abap_true. + message = |Should have failed for { input_text }|. + cl_abap_unit_assert=>fail( msg = message ). + ENDIF. + + CATCH zcx_excel INTO error. + IF exp-fails = abap_false. + RAISE EXCEPTION error. + ENDIF. + RETURN. + ENDTRY. + + message = |Invalid column start for { input_text }|. + cl_abap_unit_assert=>assert_equals( msg = message exp = exp-column_start act = act-column_start ). + message = |Invalid column end for { input_text }|. + cl_abap_unit_assert=>assert_equals( msg = message exp = exp-column_end act = act-column_end ). + message = |Invalid row start for { input_text }|. + cl_abap_unit_assert=>assert_equals( msg = message exp = exp-row_start act = act-row_start ). + message = |Invalid row start for { input_text }|. + cl_abap_unit_assert=>assert_equals( msg = message exp = exp-row_end act = act-row_end ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/zcl_excel_worksheet.clas.xml b/src/zcl_excel_worksheet.clas.xml index edad9b8..f53acab 100644 --- a/src/zcl_excel_worksheet.clas.xml +++ b/src/zcl_excel_worksheet.clas.xml @@ -52,13 +52,13 @@ I 405 - Merge: First row larger then last row + First row larger than last row 60 I 406 - Merge: First column larger then last column + First column larger than last column 60