diff --git a/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk b/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk index a5c0f20..c70801c 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk @@ -1166,15 +1166,17 @@ ENDCLASS. "lcl_Excel_Common_Test ABAP - + + - - - + + + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk index 42e976d..1f6bdc6 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk @@ -1,35 +1,44 @@ - - - - - - + + - @@ -192,10 +201,13 @@ ENDCLASS. "lcl_gui_alv_grid DEFINITION - - + + + + + @@ -203,6 +215,9 @@ ENDCLASS. "lcl_gui_alv_grid DEFINITION + + + @@ -211,44 +226,44 @@ ENDCLASS. "lcl_gui_alv_grid DEFINITION ABAP SLIS SOI - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + + method ZIF_EXCEL_SHEET_PRINTSETTINGS~CLEAR_PRINT_REPEAT_COLUMNS. @@ -301,7 +316,7 @@ ENDCLASS. "lcl_gui_alv_grid DEFINITION method ZIF_EXCEL_SHEET_PRINTSETTINGS~SET_PRINT_REPEAT_COLUMNS. *--------------------------------------------------------------------* * issue#235 - repeat rows/columns -* - Stefan Schmöcker, 2012-12-02 +* - Stefan Schmöcker, 2012-12-02 *--------------------------------------------------------------------* DATA: lv_col_from_int TYPE i, @@ -350,7 +365,7 @@ ENDCLASS. "lcl_gui_alv_grid DEFINITION method ZIF_EXCEL_SHEET_PRINTSETTINGS~SET_PRINT_REPEAT_ROWS. *--------------------------------------------------------------------* * issue#235 - repeat rows/columns -* - Stefan Schmöcker, 2012-12-02 +* - Stefan Schmöcker, 2012-12-02 *--------------------------------------------------------------------* DATA: lv_errormessage TYPE string. @@ -2618,7 +2633,7 @@ ENDCLASS. "lcl_gui_alv_grid DEFINITION method BIND_TABLE. *--------------------------------------------------------------------* * issue #230 - Pimp my Code -* - Stefan Schmöcker, (wi p) 2012-12-01 +* - Stefan Schmöcker, (wi p) 2012-12-01 * - ... * aligning code * message made to support multilinguality @@ -3191,7 +3206,7 @@ ENDMETHOD. * ). * " For an easy start we just take the number of characters as the width * width = strlen( cell_value ). -* " Addition to solve issue #120, contribution by Stefan Schm#ƒÂ#cker +* " Addition to solve issue #120, contribution by Stefan Schmöcker * " Calculate width using Font Size and Font Type * IF cell_style IS BOUND * AND cell_style->font IS BOUND. @@ -3685,12 +3700,33 @@ ENDMETHOD. endmethod. - method DELETE_MERGE. + + + METHOD delete_merge. - DELETE sheet_content_merge INDEX 1. - DELETE sheet_content_merge INDEX 1. + FIELD-SYMBOLS: <ls_merged_cell> LIKE LINE OF me->mt_merged_cells. + DATA: is_merged TYPE abap_bool. +*--------------------------------------------------------------------* +* If cell information is passed delete merge including this cell, +* otherwise delete all merges +*--------------------------------------------------------------------* + IF ip_cell_column IS INITIAL + OR ip_cell_row IS INITIAL. + CLEAR me->mt_merged_cells. + ELSE. + LOOP AT me->mt_merged_cells ASSIGNING <ls_merged_cell>. - endmethod. + is_merged = me->is_cell_merged( ip_column = ip_cell_column + ip_row = ip_cell_row ). + IF is_merged = abap_true. + DELETE me->mt_merged_cells. " Delete this merge, that includes this cell + EXIT. + ENDIF. + + ENDLOOP. + ENDIF. + +ENDMETHOD. @@ -4078,78 +4114,30 @@ ENDMETHOD. - method GET_MERGE. + METHOD get_merge. - DATA: lv_column_start TYPE string, - lv_column_end TYPE string, - lv_row TYPE string, - lv_index TYPE sy-tabix, - ls_sheet_content TYPE zexcel_s_cell_data, - range_from TYPE string, - range_to TYPE string, - lv_merge_range TYPE string, - lv_count TYPE string. + FIELD-SYMBOLS: <ls_merged_cell> LIKE LINE OF me->mt_merged_cells. - FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + DATA: lv_col_from TYPE string, + lv_col_to TYPE string, + lv_row_from TYPE string, + lv_row_to TYPE string, + lv_merge_range TYPE string. - DESCRIBE TABLE sheet_content_merge LINES lv_count. + LOOP AT me->mt_merged_cells ASSIGNING <ls_merged_cell>. - WHILE lv_count GT lv_index. -* LOOP AT sheet_content_merge ASSIGNING <fs_sheet_content>. - lv_index = lv_index + 1. - READ TABLE sheet_content_merge ASSIGNING <fs_sheet_content> INDEX lv_index. - lv_column_start = zcl_excel_common=>convert_column2alpha( <fs_sheet_content>-cell_column ). - lv_row = <fs_sheet_content>-cell_row. - SHIFT lv_column_start RIGHT DELETING TRAILING space. - SHIFT lv_column_start LEFT DELETING LEADING space. - SHIFT lv_row RIGHT DELETING TRAILING space. - SHIFT lv_row LEFT DELETING LEADING space. - CONCATENATE lv_column_start lv_row - INTO range_from. - - lv_index = lv_index + 1. - READ TABLE sheet_content_merge ASSIGNING <fs_sheet_content> INDEX lv_index. - lv_column_end = zcl_excel_common=>convert_column2alpha( <fs_sheet_content>-cell_column ). - lv_row = <fs_sheet_content>-cell_row. - SHIFT lv_column_end RIGHT DELETING TRAILING space. - SHIFT lv_column_end LEFT DELETING LEADING space. - SHIFT lv_row RIGHT DELETING TRAILING space. - SHIFT lv_row LEFT DELETING LEADING space. - CONCATENATE lv_column_end lv_row - INTO range_to. - - CONCATENATE range_from range_to INTO lv_merge_range - SEPARATED BY ':'. + lv_col_from = zcl_excel_common=>convert_column2alpha( <ls_merged_cell>-col_from ). + lv_col_to = zcl_excel_common=>convert_column2alpha( <ls_merged_cell>-col_to ). + lv_row_from = <ls_merged_cell>-row_from. + lv_row_to = <ls_merged_cell>-row_to . + CONCATENATE lv_col_from lv_row_from ':' lv_col_to lv_row_to + INTO lv_merge_range. + CONDENSE lv_merge_range NO-GAPS. APPEND lv_merge_range TO merge_range. - ENDWHILE. -* ENDLOOP. -* READ TABLE sheet_content_merge ASSIGNING <fs_sheet_content> INDEX 1. -* IF sy-subrc EQ 0 AND <fs_sheet_content> IS ASSIGNED. -* lv_column_start = zcl_excel_common=>convert_column2alpha( <fs_sheet_content>-cell_column ). -* lv_row = <fs_sheet_content>-cell_row. -* SHIFT lv_column_start RIGHT DELETING TRAILING space. -* SHIFT lv_column_start LEFT DELETING LEADING space. -* SHIFT lv_row RIGHT DELETING TRAILING space. -* SHIFT lv_row LEFT DELETING LEADING space. -* CONCATENATE lv_column_start lv_row -* INTO range_from. -* ENDIF. -* READ TABLE sheet_content_merge ASSIGNING <fs_sheet_content> INDEX 2. -* IF sy-subrc EQ 0 AND <fs_sheet_content> IS ASSIGNED. -* lv_column_end = zcl_excel_common=>convert_column2alpha( <fs_sheet_content>-cell_column ). -* SHIFT lv_column_end RIGHT DELETING TRAILING space. -* SHIFT lv_column_end LEFT DELETING LEADING space. -* CONCATENATE lv_column_end lv_row -* INTO range_to. -* ENDIF. + ENDLOOP. -* IF range_from NE space AND range_to NE space. -* CONCATENATE range_from range_to INTO ep_merge_range -* SEPARATED BY ':'. -* ENDIF. - - endmethod. +ENDMETHOD. @@ -4235,11 +4223,11 @@ ENDMETHOD. - method GET_VALUE_TYPE. - DATA: lo_addit TYPE REF TO cl_abap_elemdescr, - ls_dfies TYPE dfies, - l_function TYPE funcname, - l_value(50) TYPE c. + METHOD get_value_type. + DATA: lo_addit TYPE REF TO cl_abap_elemdescr, + ls_dfies TYPE dfies, + l_function TYPE funcname, + l_value(50) TYPE c. ep_value = ip_value. ep_value_type = cl_abap_typedescr=>typekind_string. " Thats our default if something goes wrong. @@ -4266,18 +4254,22 @@ ENDMETHOD. IF sy-subrc = 0. CALL FUNCTION l_function EXPORTING - input = ip_value + input = ip_value IMPORTING * LONG_TEXT = - output = l_value + output = l_value * SHORT_TEXT = EXCEPTIONS - OTHERS = 1. + OTHERS = 1. IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ELSE. - ep_value = l_value. + TRY. + ep_value = l_value. + CATCH cx_root. + ep_value = ip_value. + ENDTRY. ENDIF. ENDIF. ENDIF. @@ -4286,31 +4278,36 @@ ENDMETHOD. ENDIF. ENDIF. - endmethod. +ENDMETHOD. - method IS_CELL_MERGED. - DATA lt_merge_range TYPE string_table. + METHOD is_cell_merged. - FIELD-SYMBOLS <lv_merge_range> LIKE LINE OF lt_merge_range. + DATA: lv_column TYPE i. + FIELD-SYMBOLS: <ls_merged_cell> LIKE LINE OF me->mt_merged_cells. - lt_merge_range = me->get_merge( ). + lv_column = zcl_excel_common=>convert_column2int( ip_column ). - LOOP AT lt_merge_range ASSIGNING <lv_merge_range>. - rp_is_merged = zcl_excel_common=>is_cell_in_range( - ip_column = ip_column - ip_row = ip_row - ip_range = <lv_merge_range> ). - IF rp_is_merged = abap_true. - EXIT. + rp_is_merged = abap_false. " Assume not in merged area + + LOOP AT me->mt_merged_cells ASSIGNING <ls_merged_cell>. + + IF <ls_merged_cell>-col_from <= lv_column + AND <ls_merged_cell>-col_to >= lv_column + AND <ls_merged_cell>-row_from <= ip_row + AND <ls_merged_cell>-row_to >= ip_row. + rp_is_merged = abap_true. " until we are proven different + RETURN. ENDIF. + ENDLOOP. -endmethod. + +ENDMETHOD. method PRINT_TITLE_SET_RANGE. @@ -4451,7 +4448,7 @@ endmethod. * Begin of change issue #152 - don't touch exisiting style if only value is passed * lv_style_guid = ip_style. lv_column = zcl_excel_common=>convert_column2int( ip_column ). - READ TABLE sheet_content ASSIGNING <fs_sheet_content> WITH TABLE KEY cell_row = ip_row " Changed to access via table key , Stefan Schmöcker, 2013-08-03 + READ TABLE sheet_content ASSIGNING <fs_sheet_content> WITH TABLE KEY cell_row = ip_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. @@ -4767,41 +4764,54 @@ endmethod. - method SET_MERGE. + METHOD set_merge. - DATA: lv_column_start TYPE zexcel_cell_column, - lv_column_end TYPE zexcel_cell_column, - ls_sheet_content TYPE zexcel_s_cell_data, - lv_row_alpha TYPE string. + DATA: ls_merge TYPE mty_merge, + lv_errormessage TYPE string. - FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. + FIELD-SYMBOLS: <ls_merge> LIKE LINE OF me->mt_merged_cells. - lv_column_start = zcl_excel_common=>convert_column2int( ip_column_start ). - lv_column_end = zcl_excel_common=>convert_column2int( ip_column_end ). - - ls_sheet_content-cell_row = ip_row. - ls_sheet_content-cell_column = lv_column_start. - lv_row_alpha = ip_row. - SHIFT lv_row_alpha RIGHT DELETING TRAILING space. - SHIFT lv_row_alpha LEFT DELETING LEADING space. - CONCATENATE ip_column_start lv_row_alpha INTO ls_sheet_content-cell_coords. - INSERT ls_sheet_content INTO TABLE sheet_content_merge. - - ls_sheet_content-cell_column = lv_column_end. - IF ip_row_to IS SUPPLIED. - ls_sheet_content-cell_row = ip_row_to. - lv_row_alpha = ip_row_to. - ELSE. - lv_row_alpha = ip_row. - ls_sheet_content-cell_row = ip_row. +*--------------------------------------------------------------------* +* Build new range area to insert into range table +*--------------------------------------------------------------------* + ls_merge-row_from = ip_row. + ls_merge-row_to = ip_row_to. + IF ls_merge-row_from > ls_merge-row_to. + lv_errormessage = 'Merge: First row larger then last row'(405). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. ENDIF. - SHIFT lv_row_alpha RIGHT DELETING TRAILING space. - SHIFT lv_row_alpha LEFT DELETING LEADING space. - CONCATENATE ip_column_end lv_row_alpha INTO ls_sheet_content-cell_coords. - INSERT ls_sheet_content INTO TABLE sheet_content_merge. + ls_merge-col_from = zcl_excel_common=>convert_column2int( ip_column_start ). + ls_merge-col_to = zcl_excel_common=>convert_column2int( ip_column_end ). + IF ls_merge-col_from > ls_merge-col_to. + lv_errormessage = 'Merge: First column larger then last column'(406). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. - endmethod. +*--------------------------------------------------------------------* +* Check merge not overlapping with existing merges +*--------------------------------------------------------------------* + LOOP AT me->mt_merged_cells TRANSPORTING NO FIELDS WHERE NOT ( row_from > ls_merge-row_to + OR row_to < ls_merge-row_from + OR col_from > ls_merge-col_to + OR col_to < ls_merge-col_from ). + lv_errormessage = 'Overlapping merges'(404). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + + ENDLOOP. + +*--------------------------------------------------------------------* +* Everything seems ok --> add to merge table +*--------------------------------------------------------------------* + INSERT ls_merge INTO TABLE me->mt_merged_cells. + +ENDMETHOD. @@ -4990,7 +5000,7 @@ ENDMETHOD. method SET_TITLE. *--------------------------------------------------------------------* * ToDos: -* 2do§1 The current coding for replacing a named ranges name +* 2do §1 The current coding for replacing a named ranges name * after renaming a sheet should be checked if it is * really working if sheetname should be escaped *--------------------------------------------------------------------* @@ -5066,7 +5076,7 @@ ENDMETHOD. * After changing this worksheet's title we have to adjust * all ranges that are referring to this worksheet. *--------------------------------------------------------------------* -* 2do§1 - Check if the following quickfix is solid +* 2do §1 - Check if the following quickfix is solid * I fear it isn't - but this implementation is better then * nothing at all since it handles a supposed majority of cases *--------------------------------------------------------------------*