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_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 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 GET_HYPERLINKS_SIZE
returning
value(EP_SIZE) type I .
methods GET_HYPERLINKS_ITERATOR
returning
value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR .*"* 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 classABAPMETHOD 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 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.