class ZCL_EXCEL_WORKSHEET definition public final create public . *"* public components of class ZCL_EXCEL_WORKSHEET *"* do not include other source files here!!! public section. type-pools ABAP . interfaces ZIF_EXCEL_SHEET_PROTECTION . constants C_BREAK_COLUMN type ZEXCEL_BREAK value 2. "#EC NOTEXT constants C_BREAK_NONE type ZEXCEL_BREAK value 0. "#EC NOTEXT constants C_BREAK_ROW type ZEXCEL_BREAK value 1. "#EC NOTEXT constants C_SHEET_STATE_HIDDEN type ZEXCEL_SHEET_STATE value 'hidden'. "#EC NOTEXT constants C_SHEET_STATE_VERYHIDDEN type ZEXCEL_SHEET_STATE value 'veryHidden'. "#EC NOTEXT constants C_SHEET_STATE_VISIBLE type ZEXCEL_SHEET_STATE value 'visible'. "#EC NOTEXT data SHEET_CONTENT type ZEXCEL_T_CELL_DATA . data SHEET_CONTENT_MERGE type ZEXCEL_T_CELL_DATA . data SHEET_SETUP type ref to ZCL_EXCEL_SHEET_SETUP . data SHEET_STATE type ZEXCEL_SHEET_STATE . data TITLE type ZEXCEL_SHEET_TITLE value 'Worksheet'. "#EC NOTEXT . methods ADD_DRAWING importing !IP_DRAWING type ref to ZCL_EXCEL_DRAWING . methods ADD_NEW_CONDITIONAL_STYLE returning value(EO_CONDITIONAL_STYLE) type ref to ZCL_EXCEL_STYLE_CONDITIONAL . methods ADD_NEW_DATA_VALIDATION returning value(EO_DATA_VALIDATION) type ref to ZCL_EXCEL_DATA_VALIDATION . methods BIND_TABLE importing !IP_TABLE type STANDARD TABLE !IT_FIELD_CATALOG type ZEXCEL_T_FIELDCATALOG optional !IS_TABLE_SETTINGS type ZEXCEL_S_TABLE_SETTINGS optional . methods CONSTRUCTOR importing !IP_EXCEL type ref to ZCL_EXCEL !IP_TITLE type ZEXCEL_SHEET_TITLE optional . methods DELETE_MERGE . methods FREEZE_PANES importing !IP_NUM_COLUMNS type I optional !IP_NUM_ROWS type I optional raising ZCX_EXCEL . methods GET_ACTIVE_CELL returning value(EP_ACTIVE_CELL) type STRING . methods GET_CELL importing !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA !IP_ROW type ZEXCEL_CELL_ROW exporting !EP_VALUE type ZEXCEL_CELL_VALUE !EP_RC type SYSUBRC . methods GET_COLUMN_DIMENSION importing !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA returning value(R_COLUMN_DIMENSION) type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME . methods GET_COLUMN_DIMENSIONS returning value(R_COLUMN_DIMENSION) type ZEXCEL_T_WORKSHEET_COLUMNDIME . methods GET_COND_STYLES_ITERATOR returning value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . methods GET_DATA_VALIDATIONS_ITERATOR returning value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . methods GET_DATA_VALIDATIONS_SIZE returning value(EP_SIZE) type I . methods GET_DEFAULT_COLUMN_DIMENSION returning value(R_COLUMN_DIMENSION) type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME . methods GET_DEFAULT_ROW_DIMENSION returning value(R_ROW_DIMENSION) type ref to ZCL_EXCEL_WORKSHEET_ROWDIMENSI . methods GET_DIMENSION_RANGE returning value(EP_DIMENSION_RANGE) type STRING . methods GET_DRAWINGS returning value(R_DRAWINGS) type ref to ZCL_EXCEL_DRAWINGS . methods GET_DRAWINGS_ITERATOR returning value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . methods GET_FREEZE_CELL exporting !EP_ROW type ZEXCEL_CELL_ROW !EP_COLUMN type ZEXCEL_CELL_COLUMN . methods GET_GUID returning value(EP_GUID) type OLTPGUID16 . methods GET_HIGHEST_COLUMN returning value(R_HIGHEST_COLUMN) type ZEXCEL_CELL_COLUMN . methods GET_HIGHEST_ROW returning value(R_HIGHEST_ROW) type INT4 . methods GET_MERGE returning value(MERGE_RANGE) type STRING_TABLE . methods GET_ROW_DIMENSION importing !IP_ROW type INT4 returning value(R_ROW_DIMENSION) type ref to ZCL_EXCEL_WORKSHEET_ROWDIMENSI . methods GET_ROW_DIMENSIONS returning value(R_ROW_DIMENSION) type ZEXCEL_T_WORKSHEET_ROWDIMENSIO . methods GET_HYPERLINKS_SIZE returning value(EP_SIZE) type I . methods GET_TABLES_ITERATOR returning value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . methods GET_TABLES_SIZE returning value(EP_SIZE) type I . methods SET_CELL importing !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA !IP_ROW type ZEXCEL_CELL_ROW !IP_VALUE type SIMPLE optional !IP_FORMULA type ZEXCEL_CELL_FORMULA optional !IP_STYLE type ZEXCEL_CELL_STYLE optional !IP_HYPERLINK type ref to ZCL_EXCEL_HYPERLINK optional . methods GET_HYPERLINKS_ITERATOR returning value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . methods SET_CELL_STYLE importing !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA !IP_ROW type ZEXCEL_CELL_ROW !IP_STYLE type ZEXCEL_CELL_STYLE raising ZCX_EXCEL . methods SET_MERGE importing !IP_COLUMN_START type ZEXCEL_CELL_COLUMN_ALPHA optional !IP_COLUMN_END type ZEXCEL_CELL_COLUMN_ALPHA optional !IP_ROW type ZEXCEL_CELL_ROW optional . methods SET_TABLE importing !IP_TABLE type STANDARD TABLE !IP_HDR_STYLE type ZEXCEL_CELL_STYLE optional !IP_BODY_STYLE type ZEXCEL_CELL_STYLE optional !IP_TABLE_TITLE type STRING !IP_TOP_LEFT_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA default 'B' !IP_TOP_LEFT_ROW type ZEXCEL_CELL_ROW default 3 . methods CALCULATE_COLUMN_WIDTHS . *"* protected components of class ZCL_EXCEL_WORKSHEET *"* do not include other source files here!!! protected section. *"* private components of class ZCL_EXCEL_WORKSHEET *"* do not include other source files here!!! private section. data ACTIVE_CELL type ZEXCEL_S_CELL_DATA . data COLUMN_DIMENSIONS type ZEXCEL_T_WORKSHEET_COLUMNDIME . data CONDITIONAL_STYLES type ref to ZCL_EXCEL_STYLES_CONDITIONAL . data DATA_VALIDATIONS type ref to ZCL_EXCEL_DATA_VALIDATIONS . data DEFAULT_COLUMN_DIMENSION type ref to ZCL_EXCEL_WORKSHEET_COLUMNDIME . data DEFAULT_ROW_DIMENSION type ref to ZCL_EXCEL_WORKSHEET_ROWDIMENSI . data DRAWINGS type ref to ZCL_EXCEL_DRAWINGS . data EXCEL type ref to ZCL_EXCEL . data FREEZE_PANE_CELL_COLUMN type ZEXCEL_CELL_COLUMN . data FREEZE_PANE_CELL_ROW type ZEXCEL_CELL_ROW . data GUID type OLTPGUID16 . data LOWER_CELL type ZEXCEL_S_CELL_DATA . data ROW_DIMENSIONS type ZEXCEL_T_WORKSHEET_ROWDIMENSIO . data TABLES type ref to CL_OBJECT_COLLECTION . data UPPER_CELL type ZEXCEL_S_CELL_DATA . data HYPERLINKS type ref to CL_OBJECT_COLLECTION . methods UPDATE_DIMENSION_RANGE . *"* local class implementation for public class *"* use this source file for the implementation part of *"* local helper classes *"* use this source file for any type declarations (class *"* definitions, interfaces or data types) you need for method *"* implementation or private method's signature *"* use this source file for any macro definitions you need *"* in the implementation part of the class ABAP method ZIF_EXCEL_SHEET_PROTECTION~INITIALIZE. me->zif_excel_sheet_protection~protected = zif_excel_sheet_protection=>c_unprotected. CLEAR me->zif_excel_sheet_protection~password. me->zif_excel_sheet_protection~auto_filter = zif_excel_sheet_protection=>c_noactive. me->zif_excel_sheet_protection~delete_columns = zif_excel_sheet_protection=>c_noactive. me->zif_excel_sheet_protection~delete_rows = zif_excel_sheet_protection=>c_noactive. me->zif_excel_sheet_protection~format_cells = zif_excel_sheet_protection=>c_noactive. me->zif_excel_sheet_protection~format_columns = zif_excel_sheet_protection=>c_noactive. me->zif_excel_sheet_protection~format_rows = zif_excel_sheet_protection=>c_noactive. me->zif_excel_sheet_protection~insert_columns = zif_excel_sheet_protection=>c_noactive. me->zif_excel_sheet_protection~insert_hyperlinks = zif_excel_sheet_protection=>c_noactive. me->zif_excel_sheet_protection~insert_rows = zif_excel_sheet_protection=>c_noactive. me->zif_excel_sheet_protection~objects = zif_excel_sheet_protection=>c_noactive. me->zif_excel_sheet_protection~password = zif_excel_sheet_protection=>c_noactive. me->zif_excel_sheet_protection~pivot_tables = zif_excel_sheet_protection=>c_noactive. me->zif_excel_sheet_protection~protected = zif_excel_sheet_protection=>c_noactive. me->zif_excel_sheet_protection~scenarios = zif_excel_sheet_protection=>c_noactive. me->zif_excel_sheet_protection~select_locked_cells = zif_excel_sheet_protection=>c_noactive. me->zif_excel_sheet_protection~select_unlocked_cells = zif_excel_sheet_protection=>c_noactive. me->zif_excel_sheet_protection~sheet = zif_excel_sheet_protection=>c_noactive. me->zif_excel_sheet_protection~sort = zif_excel_sheet_protection=>c_noactive. endmethod. method ADD_DRAWING. drawings->add( ip_drawing ). endmethod. method ADD_NEW_CONDITIONAL_STYLE. CREATE OBJECT eo_conditional_style. conditional_styles->add( eo_conditional_style ). endmethod. method ADD_NEW_DATA_VALIDATION. CREATE OBJECT eo_data_validation. data_validations->add( eo_data_validation ). endmethod. method BIND_TABLE. DATA: lv_row_int TYPE zexcel_cell_row, lv_first_row TYPE zexcel_cell_row, lv_last_row TYPE zexcel_cell_row, lv_column_int TYPE zexcel_cell_column, lv_column_alpha TYPE zexcel_cell_column_alpha, lt_field_catalog TYPE zexcel_t_fieldcatalog, lv_id TYPE i, lv_rows TYPE i, lv_formula TYPE string, ls_settings TYPE zexcel_s_table_settings, lo_table TYPE REF TO zcl_excel_table, lt_column_name_buffer TYPE SORTED TABLE OF string WITH UNIQUE KEY table_line, lv_value TYPE string, lv_syindex TYPE char3. CONSTANTS: lc_top_left_column TYPE zexcel_cell_column_alpha VALUE 'B', lc_top_left_row TYPE zexcel_cell_row VALUE '3'. FIELD-SYMBOLS: <ls_field_catalog> TYPE zexcel_s_fieldcatalog, <fs_table_line> TYPE ANY, <fs_fldval> TYPE ANY. ls_settings = is_table_settings. IF ls_settings-top_left_column IS INITIAL. ls_settings-top_left_column = lc_top_left_column. ENDIF. IF ls_settings-table_style IS INITIAL. ls_settings-table_style = zcl_excel_table=>builtinstyle_medium2. ENDIF. IF ls_settings-top_left_row IS INITIAL. ls_settings-top_left_row = lc_top_left_row. ENDIF. IF it_field_catalog IS NOT SUPPLIED. lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = ip_table ). ELSE. lt_field_catalog = it_field_catalog. ENDIF. CREATE OBJECT lo_table. lo_table->settings = ls_settings. lo_table->set_data( ir_data = ip_table ). lv_id = me->excel->get_next_table_id( ). lo_table->set_id( iv_id = lv_id ). * lo_table->fieldcat = lt_field_catalog[]. me->tables->add( lo_table ). lv_column_int = zcl_excel_common=>convert_column2int( ls_settings-top_left_column ). lv_row_int = ls_settings-top_left_row. " get the row number DESCRIBE TABLE ip_table LINES lv_rows. * 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 lv_value = <ls_field_catalog>-scrtext_m. WHILE 1 = 1. READ TABLE lt_column_name_buffer TRANSPORTING NO FIELDS WITH KEY table_line = lv_value BINARY SEARCH. IF sy-subrc <> 0. <ls_field_catalog>-scrtext_m = lv_value. INSERT lv_value INTO TABLE lt_column_name_buffer. EXIT. ELSE. lv_syindex = sy-index. CONCATENATE <ls_field_catalog>-scrtext_m lv_syindex INTO lv_value. ENDIF. ENDWHILE. " First of all write column header me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_value = lv_value ). ADD 1 TO lv_row_int. LOOP AT ip_table ASSIGNING <fs_table_line>. ASSIGN COMPONENT <ls_field_catalog>-fieldname OF STRUCTURE <fs_table_line> TO <fs_fldval>. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_value = <fs_fldval> ). ADD 1 TO lv_row_int. ENDLOOP. " totals IF <ls_field_catalog>-totals_function IS NOT INITIAL. lv_formula = lo_table->get_totals_formula( ip_column = <ls_field_catalog>-scrtext_m ip_function = <ls_field_catalog>-totals_function ). me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_formula = lv_formula ). ENDIF. lv_row_int = ls_settings-top_left_row. ADD 1 TO lv_column_int. " conditional formatting IF <ls_field_catalog>-cond_style IS NOT INITIAL. lv_first_row = ls_settings-top_left_row + 1. " +1 to exclude header lv_last_row = ls_settings-top_left_row + lv_rows. <ls_field_catalog>-cond_style->set_range( ip_start_column = lv_column_alpha ip_start_row = lv_first_row ip_stop_column = lv_column_alpha ip_stop_row = lv_last_row ). ENDIF. ENDLOOP. " Set field catalog lo_table->fieldcat = lt_field_catalog[]. endmethod. METHOD calculate_column_widths. TYPES: BEGIN OF t_auto_size, col_index TYPE int4, width TYPE float, END OF t_auto_size. TYPES: tt_auto_size TYPE TABLE OF t_auto_size. DATA: column_dimensions TYPE zexcel_t_worksheet_columndime. DATA: column_dimension TYPE REF TO zcl_excel_worksheet_columndime. DATA: auto_size TYPE flag. DATA: auto_sizes TYPE tt_auto_size. DATA: col_alpha TYPE zexcel_cell_column_alpha. DATA: cell_value TYPE zexcel_cell_value. DATA: count TYPE int4. DATA: highest_row TYPE int4. DATA: width TYPE i. FIELD-SYMBOLS: <column_dimension> LIKE LINE OF column_dimensions. FIELD-SYMBOLS: <auto_size> LIKE LINE OF auto_sizes. column_dimensions[] = me->get_column_dimensions( ). LOOP AT column_dimensions ASSIGNING <column_dimension>. auto_size = <column_dimension>-column_dimension->get_auto_size( ). IF auto_size = abap_true. APPEND INITIAL LINE TO auto_sizes ASSIGNING <auto_size>. <auto_size>-col_index = <column_dimension>-column_dimension->get_column_index( ). <auto_size>-width = -1. ENDIF. ENDLOOP. " There is only something to do if there are some auto-size columns IF NOT auto_sizes IS INITIAL. highest_row = me->get_highest_row( ). LOOP AT auto_sizes ASSIGNING <auto_size>. col_alpha = zcl_excel_common=>convert_column2alpha( <auto_size>-col_index ). count = 1. WHILE count <= highest_row. me->get_cell( EXPORTING ip_column = col_alpha " Cell Column ip_row = count " Cell Row IMPORTING ep_value = cell_value " Cell Value ). " For an easy start we just take the number of characters as the width " TODO: Calculate width using Font Size and Font Type width = STRLEN( cell_value ). IF width > <auto_size>-width. <auto_size>-width = width. ENDIF. count = count + 1. ENDWHILE. column_dimension = me->get_column_dimension( col_alpha ). column_dimension->set_width( <auto_size>-width ). ENDLOOP. ENDIF. ENDMETHOD. method CONSTRUCTOR. me->excel = ip_excel. CALL FUNCTION 'GUID_CREATE' IMPORTING ev_guid_16 = me->guid. IF ip_title IS NOT INITIAL. title = ip_title. ELSE. title = me->guid. ENDIF. sheet_state = me->c_sheet_state_visible. CREATE OBJECT sheet_setup. CREATE OBJECT conditional_styles. CREATE OBJECT data_validations. CREATE OBJECT tables. CREATE OBJECT drawings. me->zif_excel_sheet_protection~initialize( ). CREATE OBJECT hyperlinks. * initialize active cell coordinates active_cell-cell_row = 1. active_cell-cell_column = 1. * inizialize dimension range lower_cell-cell_row = 1. lower_cell-cell_column = 1. upper_cell-cell_row = 1. upper_cell-cell_column = 1. endmethod. method DELETE_MERGE. DELETE sheet_content_merge INDEX 1. DELETE sheet_content_merge INDEX 1. endmethod. method FREEZE_PANES. data: lv_xsplit type i, lv_ysplit type i. IF ip_num_columns IS NOT SUPPLIED AND ip_num_rows IS NOT SUPPLIED. RAISE EXCEPTION TYPE zcx_excel EXPORTING error = 'Pleas provide number of rows and/or columns to freeze'. ENDIF. IF ip_num_columns IS SUPPLIED AND ip_num_columns <= 0. RAISE EXCEPTION TYPE zcx_excel EXPORTING error = 'Number of columns to freeze should be positive'. ENDIF. IF ip_num_rows IS SUPPLIED AND ip_num_rows <= 0. RAISE EXCEPTION TYPE zcx_excel EXPORTING error = 'Number of rows to freeze should be positive'. ENDIF. freeze_pane_cell_column = ip_num_columns + 1. freeze_pane_cell_row = ip_num_rows + 1. endmethod. method GET_ACTIVE_CELL. DATA: lv_active_column TYPE zexcel_cell_column_alpha, lv_active_row TYPE string. lv_active_column = zcl_excel_common=>convert_column2alpha( active_cell-cell_column ). lv_active_row = active_cell-cell_row. SHIFT lv_active_row RIGHT DELETING TRAILING space. SHIFT lv_active_row LEFT DELETING LEADING space. CONCATENATE lv_active_column lv_active_row INTO ep_active_cell. endmethod. method GET_CELL. DATA: lv_column TYPE zexcel_cell_column, ls_sheet_content TYPE zexcel_s_cell_data. FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. lv_column = zcl_excel_common=>convert_column2int( ip_column ). READ TABLE sheet_content INTO ls_sheet_content WITH TABLE KEY cell_row = ip_row cell_column = lv_column. ep_rc = sy-subrc. ep_value = ls_sheet_content-cell_value. endmethod. method GET_COLUMN_DIMENSION. FIELD-SYMBOLS: <fs_column_dimension> LIKE LINE OF column_dimensions. READ TABLE me->column_dimensions ASSIGNING <fs_column_dimension> WITH KEY column = ip_column. IF NOT <fs_column_dimension> IS ASSIGNED. CREATE OBJECT r_column_dimension EXPORTING ip_index = ip_column. APPEND INITIAL LINE TO me->column_dimensions ASSIGNING <fs_column_dimension>. <fs_column_dimension>-column = ip_column. <fs_column_dimension>-column_dimension = r_column_dimension. ELSE. r_column_dimension = <fs_column_dimension>-column_dimension. ENDIF. endmethod. method GET_COLUMN_DIMENSIONS. r_column_dimension[] = me->column_dimensions[]. endmethod. method GET_COND_STYLES_ITERATOR. eo_iterator = me->conditional_styles->get_iterator( ). endmethod. method GET_DATA_VALIDATIONS_ITERATOR. eo_iterator = me->data_validations->get_iterator( ). endmethod. method GET_DATA_VALIDATIONS_SIZE. ep_size = me->data_validations->size( ). endmethod. method GET_DEFAULT_COLUMN_DIMENSION. r_column_dimension = me->default_column_dimension. endmethod. method GET_DEFAULT_ROW_DIMENSION. r_row_dimension = me->default_row_dimension. endmethod. method GET_DIMENSION_RANGE. me->update_dimension_range( ). IF upper_cell EQ lower_cell. "only one cell ep_dimension_range = upper_cell-cell_coords. ELSE. CONCATENATE upper_cell-cell_coords ':' lower_cell-cell_coords INTO ep_dimension_range. ENDIF. endmethod. method GET_DRAWINGS. r_drawings = drawings. endmethod. method GET_DRAWINGS_ITERATOR. eo_iterator = drawings->get_iterator( ). endmethod. method GET_FREEZE_CELL. ep_row = me->freeze_pane_cell_row. ep_column = me->freeze_pane_cell_column. endmethod. method GET_GUID. ep_guid = me->guid. endmethod. method GET_HIGHEST_COLUMN. me->update_dimension_range( ). r_highest_column = me->lower_cell-cell_column. endmethod. method GET_HIGHEST_ROW. me->update_dimension_range( ). r_highest_row = me->lower_cell-cell_row. endmethod. method GET_HYPERLINKS_ITERATOR. eo_iterator = hyperlinks->get_iterator( ). endmethod. method GET_HYPERLINKS_SIZE. ep_size = hyperlinks->size( ). endmethod. 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: <fs_sheet_content> TYPE zexcel_s_cell_data. DESCRIBE TABLE sheet_content_merge LINES lv_count. 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 ). 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. CONCATENATE range_from range_to INTO lv_merge_range SEPARATED BY ':'. 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. * IF range_from NE space AND range_to NE space. * CONCATENATE range_from range_to INTO ep_merge_range * SEPARATED BY ':'. * ENDIF. endmethod. method GET_ROW_DIMENSION. FIELD-SYMBOLS: <fs_row_dimension> LIKE LINE OF row_dimensions. READ TABLE me->row_dimensions ASSIGNING <fs_row_dimension> WITH KEY row = ip_row. IF NOT <fs_row_dimension> IS ASSIGNED. CREATE OBJECT r_row_dimension EXPORTING ip_index = ip_row. APPEND INITIAL LINE TO me->row_dimensions ASSIGNING <fs_row_dimension>. <fs_row_dimension>-row = ip_row. <fs_row_dimension>-row_dimension = r_row_dimension. ELSE. r_row_dimension = <fs_row_dimension>-row_dimension. ENDIF. endmethod. method GET_ROW_DIMENSIONS. r_row_dimension[] = me->row_dimensions[]. endmethod. method GET_TABLES_ITERATOR. eo_iterator = tables->if_object_collection~get_iterator( ). endmethod. method GET_TABLES_SIZE. ep_size = tables->if_object_collection~size( ). endmethod. method SET_CELL. DATA: lv_column TYPE zexcel_cell_column, ls_sheet_content TYPE zexcel_s_cell_data, lv_row_alpha TYPE string, lv_value TYPE zexcel_cell_value, lv_data_type TYPE zexcel_cell_data_type, lv_value_type TYPE abap_typekind, lo_style TYPE REF TO zcl_excel_style, lv_style_guid TYPE zexcel_cell_style. FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. IF ip_value IS NOT SUPPLIED AND ip_formula IS NOT SUPPLIED. RAISE EXCEPTION TYPE zcx_excel EXPORTING error = 'Pleas provide the vaue or formula'. ENDIF. lv_style_guid = ip_style. IF ip_value IS SUPPLIED. DESCRIBE FIELD ip_value TYPE lv_value_type. CASE lv_value_type. WHEN cl_abap_typedescr=>typekind_int OR cl_abap_typedescr=>typekind_int1 OR cl_abap_typedescr=>typekind_int2 OR cl_abap_typedescr=>typekind_float OR cl_abap_typedescr=>typekind_packed. lv_value = zcl_excel_common=>number_to_excel_string( ip_value = ip_value ). WHEN cl_abap_typedescr=>typekind_char OR cl_abap_typedescr=>typekind_string OR cl_abap_typedescr=>typekind_num. lv_value = ip_value. lv_data_type = 's'. WHEN cl_abap_typedescr=>typekind_date. lv_value = zcl_excel_common=>date_to_excel_string( ip_value = ip_value ). IF ip_style IS NOT SUPPLIED. "get default date format for user in case parameter is initial lo_style = excel->add_new_style( ). cl_abap_datfm=>get_date_format_des( IMPORTING ex_dateformat = lo_style->number_format->format_code ). lv_style_guid = lo_style->get_guid( ). ENDIF. WHEN cl_abap_typedescr=>typekind_time. lv_value = zcl_excel_common=>time_to_excel_string( ip_value = ip_value ). IF ip_style IS NOT SUPPLIED. "get default time format for user in case parameter is initial lo_style = excel->add_new_style( ). lo_style->number_format->format_code = zcl_excel_style_number_format=>c_format_date_time6. lv_style_guid = lo_style->get_guid( ). ENDIF. WHEN OTHERS. RAISE EXCEPTION TYPE zcx_excel EXPORTING error = 'Invalid data type of input value'. ENDCASE. ENDIF. IF ip_hyperlink IS BOUND. ip_hyperlink->set_cell_reference( ip_column = ip_column ip_row = ip_row ). me->hyperlinks->add( ip_hyperlink ). ENDIF. lv_column = zcl_excel_common=>convert_column2int( ip_column ). READ TABLE sheet_content ASSIGNING <fs_sheet_content> WITH KEY cell_row = ip_row cell_column = lv_column. IF sy-subrc EQ 0. <fs_sheet_content>-cell_value = lv_value. <fs_sheet_content>-cell_formula = ip_formula. <fs_sheet_content>-cell_style = lv_style_guid. <fs_sheet_content>-data_type = lv_data_type. ELSE. ls_sheet_content-cell_row = ip_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-cell_style = lv_style_guid. ls_sheet_content-data_type = lv_data_type. lv_row_alpha = ip_row. SHIFT lv_row_alpha RIGHT DELETING TRAILING space. SHIFT lv_row_alpha LEFT DELETING LEADING space. CONCATENATE ip_column lv_row_alpha INTO ls_sheet_content-cell_coords. APPEND ls_sheet_content TO sheet_content. SORT sheet_content BY cell_row cell_column. " me->update_dimension_range( ). ENDIF. endmethod. method SET_CELL_STYLE. DATA: lv_column TYPE zexcel_cell_column, ls_sheet_content TYPE zexcel_s_cell_data, lv_row_alpha TYPE string, lo_style TYPE REF TO zcl_excel_style, lv_style_guid TYPE zexcel_cell_style. FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. lv_style_guid = ip_style. lv_column = zcl_excel_common=>convert_column2int( ip_column ). READ TABLE sheet_content ASSIGNING <fs_sheet_content> WITH KEY cell_row = ip_row cell_column = lv_column. IF sy-subrc EQ 0. <fs_sheet_content>-cell_style = lv_style_guid. ELSE. RAISE EXCEPTION TYPE zcx_excel EXPORTING error = 'No Data in this cell'. ENDIF. endmethod. 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. FIELD-SYMBOLS: <fs_sheet_content> TYPE zexcel_s_cell_data. 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. APPEND ls_sheet_content TO sheet_content_merge. ls_sheet_content-cell_row = ip_row. ls_sheet_content-cell_column = lv_column_end. lv_row_alpha = ip_row. 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. APPEND ls_sheet_content TO sheet_content_merge. endmethod. method SET_TABLE. DATA: lo_tabdescr TYPE REF TO cl_abap_structdescr, lr_data TYPE REF TO data, ls_newline TYPE REF TO data, ls_header TYPE x030l, lt_dfies TYPE ddfields, lv_row_header TYPE zexcel_cell_row VALUE '2', lv_col_header TYPE zexcel_cell_column_alpha VALUE 'B', lv_row_int TYPE zexcel_cell_row, lv_column_int TYPE zexcel_cell_column, lv_column_alpha TYPE zexcel_cell_column_alpha, lv_cell_value TYPE zexcel_cell_value. FIELD-SYMBOLS: <fs_table_line> TYPE ANY, <fs_fldval> TYPE ANY, <fs_dfies> TYPE dfies, <fs_cell_value> TYPE zexcel_cell_value. lv_column_int = zcl_excel_common=>convert_column2int( ip_top_left_column ). lv_row_int = ip_top_left_row. CREATE DATA lr_data LIKE LINE OF ip_table. lo_tabdescr ?= cl_abap_structdescr=>describe_by_data_ref( lr_data ). ls_header = lo_tabdescr->get_ddic_header( ). lt_dfies = lo_tabdescr->get_ddic_field_list( ). * It is better to loop column by column LOOP AT lt_dfies ASSIGNING <fs_dfies>. lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ). " First of all write column header lv_cell_value = <fs_dfies>-scrtext_m. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_value = lv_cell_value ip_style = ip_hdr_style ). ADD 1 TO lv_row_int. LOOP AT ip_table ASSIGNING <fs_table_line>. ASSIGN COMPONENT <fs_dfies>-fieldname OF STRUCTURE <fs_table_line> TO <fs_fldval>. MOVE <fs_fldval> TO lv_cell_value. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_value = lv_cell_value ip_style = ip_body_style ). ADD 1 TO lv_row_int. ENDLOOP. lv_row_int = ip_top_left_row. ADD 1 TO lv_column_int. ENDLOOP. endmethod. method UPDATE_DIMENSION_RANGE. DATA: ls_sheet_content TYPE zexcel_s_cell_data, lt_sheet_content TYPE zexcel_t_cell_data_unsorted, lv_row_alpha TYPE string, lv_column_alpha TYPE zexcel_cell_column_alpha. * update dimension range lt_sheet_content = sheet_content. "upper left corner SORT lt_sheet_content BY cell_row. READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. upper_cell-cell_row = ls_sheet_content-cell_row. SORT lt_sheet_content BY cell_column. READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. upper_cell-cell_column = ls_sheet_content-cell_column. lv_row_alpha = upper_cell-cell_row. lv_column_alpha = zcl_excel_common=>convert_column2alpha( upper_cell-cell_column ). SHIFT lv_row_alpha RIGHT DELETING TRAILING space. SHIFT lv_row_alpha LEFT DELETING LEADING space. CONCATENATE lv_column_alpha lv_row_alpha INTO upper_cell-cell_coords. "bottom right corner SORT lt_sheet_content BY cell_row DESCENDING. READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. lower_cell-cell_row = ls_sheet_content-cell_row. SORT lt_sheet_content BY cell_column DESCENDING. READ TABLE lt_sheet_content INDEX 1 INTO ls_sheet_content. lower_cell-cell_column = ls_sheet_content-cell_column. lv_row_alpha = lower_cell-cell_row. lv_column_alpha = zcl_excel_common=>convert_column2alpha( lower_cell-cell_column ). SHIFT lv_row_alpha RIGHT DELETING TRAILING space. SHIFT lv_row_alpha LEFT DELETING LEADING space. CONCATENATE lv_column_alpha lv_row_alpha INTO lower_cell-cell_coords. endmethod.