CLASS zcl_excel_worksheet DEFINITION PUBLIC CREATE PUBLIC . PUBLIC SECTION. *"* public components of class ZCL_EXCEL_WORKSHEET *"* do not include other source files here!!! *"* protected components of class ZCL_EXCEL_WORKSHEET *"* do not include other source files here!!! *"* protected components of class ZCL_EXCEL_WORKSHEET *"* do not include other source files here!!! INTERFACES zif_excel_sheet_printsettings . INTERFACES zif_excel_sheet_properties . INTERFACES zif_excel_sheet_protection . INTERFACES zif_excel_sheet_vba_project . TYPES: BEGIN OF mty_s_outline_row, row_from TYPE i, row_to TYPE i, collapsed TYPE abap_bool, END OF mty_s_outline_row . TYPES: mty_ts_outlines_row TYPE SORTED TABLE OF mty_s_outline_row WITH UNIQUE KEY row_from row_to . TYPES: BEGIN OF mty_s_ignored_errors, "! Cell reference (e.g. "A1") or list like "A1 A2" or range "A1:G1" cell_coords TYPE zexcel_cell_coords, "! Ignore errors when cells contain formulas that result in an error. eval_error TYPE abap_bool, "! Ignore errors when formulas contain text formatted cells with years represented as 2 digits. two_digit_text_year TYPE abap_bool, "! Ignore errors when numbers are formatted as text or are preceded by an apostrophe. number_stored_as_text TYPE abap_bool, "! Ignore errors when a formula in a region of your WorkSheet differs from other formulas in the same region. formula TYPE abap_bool, "! Ignore errors when formulas omit certain cells in a region. formula_range TYPE abap_bool, "! Ignore errors when unlocked cells contain formulas. unlocked_formula TYPE abap_bool, "! Ignore errors when formulas refer to empty cells. empty_cell_reference TYPE abap_bool, "! Ignore errors when a cell's value in a Table does not comply with the Data Validation rules specified. list_data_validation TYPE abap_bool, "! Ignore errors when cells contain a value different from a calculated column formula. "! In other words, for a calculated column, a cell in that column is considered to have an error "! if its formula is different from the calculated column formula, or doesn't contain a formula at all. calculated_column TYPE abap_bool, END OF mty_s_ignored_errors . TYPES: mty_th_ignored_errors TYPE HASHED TABLE OF mty_s_ignored_errors WITH UNIQUE KEY cell_coords . TYPES: BEGIN OF mty_s_column_formula, id TYPE i, column TYPE zexcel_cell_column, formula TYPE string, table_top_left_row TYPE zexcel_cell_row, table_bottom_right_row TYPE zexcel_cell_row, table_left_column_int TYPE zexcel_cell_column, table_right_column_int TYPE zexcel_cell_column, END OF mty_s_column_formula . TYPES: mty_th_column_formula TYPE HASHED TABLE OF mty_s_column_formula WITH UNIQUE KEY id . TYPES: ty_doc_url TYPE c LENGTH 255 . TYPES: BEGIN OF mty_merge, row_from TYPE i, row_to TYPE i, col_from TYPE i, col_to TYPE i, END OF mty_merge . TYPES: mty_ts_merge TYPE SORTED TABLE OF mty_merge WITH UNIQUE KEY table_line . TYPES: ty_area TYPE c LENGTH 1 . CONSTANTS c_break_column TYPE zexcel_break VALUE 2 ##NO_TEXT. CONSTANTS c_break_none TYPE zexcel_break VALUE 0 ##NO_TEXT. CONSTANTS c_break_row TYPE zexcel_break VALUE 1 ##NO_TEXT. CONSTANTS: BEGIN OF c_area, whole TYPE ty_area VALUE 'W', "#EC NOTEXT topleft TYPE ty_area VALUE 'T', "#EC NOTEXT END OF c_area . DATA excel TYPE REF TO zcl_excel READ-ONLY . DATA print_gridlines TYPE zexcel_print_gridlines READ-ONLY VALUE abap_false ##NO_TEXT. DATA sheet_content TYPE zexcel_t_cell_data . DATA sheet_setup TYPE REF TO zcl_excel_sheet_setup . DATA show_gridlines TYPE zexcel_show_gridlines READ-ONLY VALUE abap_true ##NO_TEXT. DATA show_rowcolheaders TYPE zexcel_show_gridlines READ-ONLY VALUE abap_true ##NO_TEXT. DATA tabcolor TYPE zexcel_s_tabcolor READ-ONLY . DATA column_formulas TYPE mty_th_column_formula READ-ONLY . CLASS-DATA: BEGIN OF c_messages READ-ONLY, formula_id_only_is_possible TYPE string, column_formula_id_not_found TYPE string, formula_not_in_this_table TYPE string, formula_in_other_column TYPE string, END OF c_messages . DATA mt_merged_cells TYPE mty_ts_merge READ-ONLY . METHODS add_comment IMPORTING !ip_comment TYPE REF TO zcl_excel_comment . METHODS add_drawing IMPORTING !ip_drawing TYPE REF TO zcl_excel_drawing . METHODS add_new_column IMPORTING !ip_column TYPE simple RETURNING VALUE(eo_column) TYPE REF TO zcl_excel_column RAISING zcx_excel . METHODS add_new_style_cond IMPORTING !ip_dimension_range TYPE string DEFAULT 'A1' RETURNING VALUE(eo_style_cond) TYPE REF TO zcl_excel_style_cond . METHODS add_new_data_validation RETURNING VALUE(eo_data_validation) TYPE REF TO zcl_excel_data_validation . METHODS add_new_range RETURNING VALUE(eo_range) TYPE REF TO zcl_excel_range . METHODS add_new_row IMPORTING !ip_row TYPE simple RETURNING VALUE(eo_row) TYPE REF TO zcl_excel_row . METHODS bind_alv IMPORTING !io_alv TYPE REF TO object !it_table TYPE STANDARD TABLE !i_top TYPE i DEFAULT 1 !i_left TYPE i DEFAULT 1 !table_style TYPE zexcel_table_style OPTIONAL !i_table TYPE abap_bool DEFAULT abap_true RAISING zcx_excel . METHODS bind_alv_ole2 IMPORTING !i_document_url TYPE ty_doc_url DEFAULT space !i_xls TYPE c DEFAULT space !i_save_path TYPE string !io_alv TYPE REF TO cl_gui_alv_grid !it_listheader TYPE slis_t_listheader OPTIONAL !i_top TYPE i DEFAULT 1 !i_left TYPE i DEFAULT 1 !i_columns_header TYPE c DEFAULT 'X' !i_columns_autofit TYPE c DEFAULT 'X' !i_format_col_header TYPE soi_format_item OPTIONAL !i_format_subtotal TYPE soi_format_item OPTIONAL !i_format_total TYPE soi_format_item OPTIONAL EXCEPTIONS miss_guide ex_transfer_kkblo_error fatal_error inv_data_range dim_mismatch_vkey dim_mismatch_sema error_in_sema . 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 VALUE(iv_default_descr) TYPE c OPTIONAL !iv_no_line_if_empty TYPE abap_bool DEFAULT abap_false !ip_conv_exit_length TYPE abap_bool DEFAULT abap_false EXPORTING !es_table_settings TYPE zexcel_s_table_settings RAISING zcx_excel . METHODS calculate_column_widths RAISING zcx_excel . METHODS change_area_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 !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_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 !ip_xfont TYPE zexcel_s_cstylex_font OPTIONAL !ip_fill TYPE zexcel_s_cstyle_fill OPTIONAL !ip_xfill TYPE zexcel_s_cstylex_fill OPTIONAL !ip_borders TYPE zexcel_s_cstyle_borders OPTIONAL !ip_xborders TYPE zexcel_s_cstylex_borders OPTIONAL !ip_alignment TYPE zexcel_s_cstyle_alignment OPTIONAL !ip_xalignment TYPE zexcel_s_cstylex_alignment OPTIONAL !ip_number_format_format_code TYPE zexcel_number_format OPTIONAL !ip_protection TYPE zexcel_s_cstyle_protection OPTIONAL !ip_xprotection TYPE zexcel_s_cstylex_protection OPTIONAL !ip_font_bold TYPE flag OPTIONAL !ip_font_color TYPE zexcel_s_style_color OPTIONAL !ip_font_color_rgb TYPE zexcel_style_color_argb OPTIONAL !ip_font_color_indexed TYPE zexcel_style_color_indexed OPTIONAL !ip_font_color_theme TYPE zexcel_style_color_theme OPTIONAL !ip_font_color_tint TYPE zexcel_style_color_tint OPTIONAL !ip_font_family TYPE zexcel_style_font_family OPTIONAL !ip_font_italic TYPE flag OPTIONAL !ip_font_name TYPE zexcel_style_font_name OPTIONAL !ip_font_scheme TYPE zexcel_style_font_scheme OPTIONAL !ip_font_size TYPE zexcel_style_font_size OPTIONAL !ip_font_strikethrough TYPE flag OPTIONAL !ip_font_underline TYPE flag OPTIONAL !ip_font_underline_mode TYPE zexcel_style_font_underline OPTIONAL !ip_fill_filltype TYPE zexcel_fill_type OPTIONAL !ip_fill_rotation TYPE zexcel_rotation OPTIONAL !ip_fill_fgcolor TYPE zexcel_s_style_color OPTIONAL !ip_fill_fgcolor_rgb TYPE zexcel_style_color_argb OPTIONAL !ip_fill_fgcolor_indexed TYPE zexcel_style_color_indexed OPTIONAL !ip_fill_fgcolor_theme TYPE zexcel_style_color_theme OPTIONAL !ip_fill_fgcolor_tint TYPE zexcel_style_color_tint OPTIONAL !ip_fill_bgcolor TYPE zexcel_s_style_color OPTIONAL !ip_fill_bgcolor_rgb TYPE zexcel_style_color_argb OPTIONAL !ip_fill_bgcolor_indexed TYPE zexcel_style_color_indexed OPTIONAL !ip_fill_bgcolor_theme TYPE zexcel_style_color_theme OPTIONAL !ip_fill_bgcolor_tint TYPE zexcel_style_color_tint OPTIONAL !ip_borders_allborders TYPE zexcel_s_cstyle_border OPTIONAL !ip_fill_gradtype_type TYPE zexcel_s_gradient_type-type OPTIONAL !ip_fill_gradtype_degree TYPE zexcel_s_gradient_type-degree OPTIONAL !ip_xborders_allborders TYPE zexcel_s_cstylex_border OPTIONAL !ip_borders_diagonal TYPE zexcel_s_cstyle_border OPTIONAL !ip_fill_gradtype_bottom TYPE zexcel_s_gradient_type-bottom OPTIONAL !ip_fill_gradtype_top TYPE zexcel_s_gradient_type-top OPTIONAL !ip_xborders_diagonal TYPE zexcel_s_cstylex_border OPTIONAL !ip_borders_diagonal_mode TYPE zexcel_diagonal OPTIONAL !ip_fill_gradtype_right TYPE zexcel_s_gradient_type-right OPTIONAL !ip_borders_down TYPE zexcel_s_cstyle_border OPTIONAL !ip_fill_gradtype_left TYPE zexcel_s_gradient_type-left OPTIONAL !ip_fill_gradtype_position1 TYPE zexcel_s_gradient_type-position1 OPTIONAL !ip_xborders_down TYPE zexcel_s_cstylex_border OPTIONAL !ip_borders_left TYPE zexcel_s_cstyle_border OPTIONAL !ip_fill_gradtype_position2 TYPE zexcel_s_gradient_type-position2 OPTIONAL !ip_fill_gradtype_position3 TYPE zexcel_s_gradient_type-position3 OPTIONAL !ip_xborders_left TYPE zexcel_s_cstylex_border OPTIONAL !ip_borders_right TYPE zexcel_s_cstyle_border OPTIONAL !ip_xborders_right TYPE zexcel_s_cstylex_border OPTIONAL !ip_borders_top TYPE zexcel_s_cstyle_border OPTIONAL !ip_xborders_top TYPE zexcel_s_cstylex_border OPTIONAL !ip_alignment_horizontal TYPE zexcel_alignment OPTIONAL !ip_alignment_vertical TYPE zexcel_alignment OPTIONAL !ip_alignment_textrotation TYPE zexcel_text_rotation OPTIONAL !ip_alignment_wraptext TYPE flag OPTIONAL !ip_alignment_shrinktofit TYPE flag OPTIONAL !ip_alignment_indent TYPE zexcel_indent OPTIONAL !ip_protection_hidden TYPE zexcel_cell_protection OPTIONAL !ip_protection_locked TYPE zexcel_cell_protection OPTIONAL !ip_borders_allborders_style TYPE zexcel_border OPTIONAL !ip_borders_allborders_color TYPE zexcel_s_style_color OPTIONAL !ip_borders_allbo_color_rgb TYPE zexcel_style_color_argb OPTIONAL !ip_borders_allbo_color_indexed TYPE zexcel_style_color_indexed OPTIONAL !ip_borders_allbo_color_theme TYPE zexcel_style_color_theme OPTIONAL !ip_borders_allbo_color_tint TYPE zexcel_style_color_tint OPTIONAL !ip_borders_diagonal_style TYPE zexcel_border OPTIONAL !ip_borders_diagonal_color TYPE zexcel_s_style_color OPTIONAL !ip_borders_diagonal_color_rgb TYPE zexcel_style_color_argb OPTIONAL !ip_borders_diagonal_color_inde TYPE zexcel_style_color_indexed OPTIONAL !ip_borders_diagonal_color_them TYPE zexcel_style_color_theme OPTIONAL !ip_borders_diagonal_color_tint TYPE zexcel_style_color_tint OPTIONAL !ip_borders_down_style TYPE zexcel_border OPTIONAL !ip_borders_down_color TYPE zexcel_s_style_color OPTIONAL !ip_borders_down_color_rgb TYPE zexcel_style_color_argb OPTIONAL !ip_borders_down_color_indexed TYPE zexcel_style_color_indexed OPTIONAL !ip_borders_down_color_theme TYPE zexcel_style_color_theme OPTIONAL !ip_borders_down_color_tint TYPE zexcel_style_color_tint OPTIONAL !ip_borders_left_style TYPE zexcel_border OPTIONAL !ip_borders_left_color TYPE zexcel_s_style_color OPTIONAL !ip_borders_left_color_rgb TYPE zexcel_style_color_argb OPTIONAL !ip_borders_left_color_indexed TYPE zexcel_style_color_indexed OPTIONAL !ip_borders_left_color_theme TYPE zexcel_style_color_theme OPTIONAL !ip_borders_left_color_tint TYPE zexcel_style_color_tint OPTIONAL !ip_borders_right_style TYPE zexcel_border OPTIONAL !ip_borders_right_color TYPE zexcel_s_style_color OPTIONAL !ip_borders_right_color_rgb TYPE zexcel_style_color_argb OPTIONAL !ip_borders_right_color_indexed TYPE zexcel_style_color_indexed OPTIONAL !ip_borders_right_color_theme TYPE zexcel_style_color_theme OPTIONAL !ip_borders_right_color_tint TYPE zexcel_style_color_tint OPTIONAL !ip_borders_top_style TYPE zexcel_border OPTIONAL !ip_borders_top_color TYPE zexcel_s_style_color OPTIONAL !ip_borders_top_color_rgb TYPE zexcel_style_color_argb OPTIONAL !ip_borders_top_color_indexed TYPE zexcel_style_color_indexed OPTIONAL !ip_borders_top_color_theme TYPE zexcel_style_color_theme OPTIONAL !ip_borders_top_color_tint TYPE zexcel_style_color_tint OPTIONAL RETURNING VALUE(ep_guid) TYPE zexcel_cell_style RAISING zcx_excel . CLASS-METHODS class_constructor . METHODS constructor IMPORTING !ip_excel TYPE REF TO zcl_excel !ip_title TYPE zexcel_sheet_title OPTIONAL RAISING zcx_excel . METHODS delete_merge IMPORTING !ip_cell_column TYPE simple OPTIONAL !ip_cell_row TYPE zexcel_cell_row OPTIONAL RAISING zcx_excel . METHODS delete_row_outline IMPORTING !iv_row_from TYPE i !iv_row_to TYPE i RAISING zcx_excel . 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 RAISING zcx_excel . METHODS get_cell IMPORTING !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 RAISING zcx_excel . METHODS get_column IMPORTING !ip_column TYPE simple RETURNING VALUE(eo_column) TYPE REF TO zcl_excel_column RAISING zcx_excel . METHODS get_columns RETURNING VALUE(eo_columns) TYPE REF TO zcl_excel_columns RAISING zcx_excel . METHODS get_columns_iterator RETURNING VALUE(eo_iterator) TYPE REF TO zcl_excel_collection_iterator RAISING zcx_excel . METHODS get_style_cond_iterator RETURNING VALUE(eo_iterator) TYPE REF TO zcl_excel_collection_iterator . METHODS get_data_validations_iterator RETURNING VALUE(eo_iterator) TYPE REF TO zcl_excel_collection_iterator . METHODS get_data_validations_size RETURNING VALUE(ep_size) TYPE i . METHODS get_default_column RETURNING VALUE(eo_column) TYPE REF TO zcl_excel_column RAISING zcx_excel . METHODS get_default_excel_date_format RETURNING VALUE(ep_default_excel_date_format) TYPE zexcel_number_format . METHODS get_default_excel_time_format RETURNING VALUE(ep_default_excel_time_format) TYPE zexcel_number_format . METHODS get_default_row RETURNING VALUE(eo_row) TYPE REF TO zcl_excel_row . METHODS get_dimension_range RETURNING VALUE(ep_dimension_range) TYPE string RAISING zcx_excel . METHODS get_comments RETURNING VALUE(r_comments) TYPE REF TO zcl_excel_comments . METHODS get_drawings IMPORTING !ip_type TYPE zexcel_drawing_type OPTIONAL RETURNING VALUE(r_drawings) TYPE REF TO zcl_excel_drawings . METHODS get_comments_iterator RETURNING VALUE(eo_iterator) TYPE REF TO zcl_excel_collection_iterator . METHODS get_drawings_iterator IMPORTING !ip_type TYPE zexcel_drawing_type RETURNING VALUE(eo_iterator) TYPE REF TO zcl_excel_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 sysuuid_x16 . METHODS get_highest_column RETURNING VALUE(r_highest_column) TYPE zexcel_cell_column RAISING zcx_excel . METHODS get_highest_row RETURNING VALUE(r_highest_row) TYPE int4 RAISING zcx_excel . METHODS get_hyperlinks_iterator RETURNING VALUE(eo_iterator) TYPE REF TO zcl_excel_collection_iterator . METHODS get_hyperlinks_size RETURNING VALUE(ep_size) TYPE i . METHODS get_ignored_errors RETURNING VALUE(rt_ignored_errors) TYPE mty_th_ignored_errors . METHODS get_merge RETURNING VALUE(merge_range) TYPE string_table RAISING zcx_excel . METHODS get_pagebreaks RETURNING VALUE(ro_pagebreaks) TYPE REF TO zcl_excel_worksheet_pagebreaks RAISING zcx_excel . METHODS get_ranges_iterator RETURNING VALUE(eo_iterator) TYPE REF TO zcl_excel_collection_iterator . METHODS get_row IMPORTING !ip_row TYPE int4 RETURNING VALUE(eo_row) TYPE REF TO zcl_excel_row . METHODS get_rows RETURNING VALUE(eo_rows) TYPE REF TO zcl_excel_rows . METHODS get_rows_iterator RETURNING VALUE(eo_iterator) TYPE REF TO zcl_excel_collection_iterator . METHODS get_row_outlines RETURNING VALUE(rt_row_outlines) TYPE mty_ts_outlines_row . METHODS get_style_cond IMPORTING !ip_guid TYPE zexcel_cell_style RETURNING VALUE(eo_style_cond) TYPE REF TO zcl_excel_style_cond . METHODS get_tabcolor RETURNING VALUE(ev_tabcolor) TYPE zexcel_s_tabcolor . METHODS get_tables_iterator RETURNING VALUE(eo_iterator) TYPE REF TO zcl_excel_collection_iterator . METHODS get_tables_size RETURNING VALUE(ep_size) TYPE i . METHODS get_title IMPORTING !ip_escaped TYPE flag DEFAULT '' RETURNING VALUE(ep_title) TYPE zexcel_sheet_title . METHODS is_cell_merged IMPORTING !ip_column TYPE simple !ip_row TYPE zexcel_cell_row RETURNING VALUE(rp_is_merged) TYPE abap_bool RAISING zcx_excel . METHODS set_cell IMPORTING !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 any OPTIONAL !ip_hyperlink TYPE REF TO zcl_excel_hyperlink OPTIONAL !ip_data_type TYPE zexcel_cell_data_type OPTIONAL !ip_abap_type TYPE abap_typekind OPTIONAL !it_rtf TYPE zexcel_t_rtf OPTIONAL !ip_column_formula_id TYPE mty_s_column_formula-id OPTIONAL !ip_conv_exit_length TYPE abap_bool DEFAULT abap_false RAISING zcx_excel . METHODS set_cell_formula IMPORTING !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_columnrow TYPE csequence OPTIONAL !ip_column TYPE simple OPTIONAL !ip_row TYPE zexcel_cell_row OPTIONAL !ip_style TYPE any RAISING zcx_excel . METHODS set_column_width IMPORTING !ip_column TYPE simple !ip_width_fix TYPE simple DEFAULT 0 !ip_width_autosize TYPE flag DEFAULT 'X' RAISING zcx_excel . METHODS set_default_excel_date_format IMPORTING !ip_default_excel_date_format TYPE zexcel_number_format RAISING zcx_excel . METHODS set_ignored_errors IMPORTING !it_ignored_errors TYPE mty_th_ignored_errors . METHODS set_merge 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 !ip_style TYPE any OPTIONAL !ip_value TYPE simple OPTIONAL "added parameter !ip_formula TYPE zexcel_cell_formula OPTIONAL "added parameter RAISING zcx_excel . METHODS set_print_gridlines IMPORTING !i_print_gridlines TYPE zexcel_print_gridlines . METHODS set_row_height IMPORTING !ip_row TYPE simple !ip_height_fix TYPE simple RAISING zcx_excel . METHODS set_row_outline IMPORTING !iv_row_from TYPE i !iv_row_to TYPE i !iv_collapsed TYPE abap_bool RAISING zcx_excel . METHODS set_show_gridlines IMPORTING !i_show_gridlines TYPE zexcel_show_gridlines . METHODS set_show_rowcolheaders IMPORTING !i_show_rowcolheaders TYPE zexcel_show_rowcolheader . METHODS set_tabcolor IMPORTING !iv_tabcolor TYPE zexcel_s_tabcolor . METHODS set_table IMPORTING !ip_table TYPE STANDARD TABLE !ip_hdr_style TYPE any OPTIONAL !ip_body_style TYPE any 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 !ip_transpose TYPE abap_bool OPTIONAL !ip_no_header TYPE abap_bool OPTIONAL RAISING zcx_excel . METHODS set_title IMPORTING !ip_title TYPE zexcel_sheet_title RAISING zcx_excel . METHODS get_table IMPORTING !iv_skipped_rows TYPE int4 DEFAULT 0 !iv_skipped_cols TYPE int4 DEFAULT 0 !iv_max_col TYPE int4 OPTIONAL !iv_max_row TYPE int4 OPTIONAL !iv_skip_bottom_empty_rows TYPE abap_bool DEFAULT abap_false EXPORTING !et_table TYPE STANDARD TABLE RAISING 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 !ip_row_to TYPE zexcel_cell_row OPTIONAL !ip_style TYPE any OPTIONAL RAISING zcx_excel . METHODS set_area_formula 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 !ip_formula TYPE zexcel_cell_formula !ip_merge TYPE abap_bool OPTIONAL !ip_area TYPE ty_area DEFAULT c_area-topleft RAISING zcx_excel . METHODS set_area_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 !ip_row_to TYPE zexcel_cell_row OPTIONAL !ip_style TYPE any !ip_merge TYPE abap_bool OPTIONAL RAISING zcx_excel . METHODS set_area 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 !ip_value TYPE simple OPTIONAL !ip_formula TYPE zexcel_cell_formula OPTIONAL !ip_style TYPE any OPTIONAL !ip_hyperlink TYPE REF TO zcl_excel_hyperlink OPTIONAL !ip_data_type TYPE zexcel_cell_data_type OPTIONAL !ip_abap_type TYPE abap_typekind OPTIONAL !ip_merge TYPE abap_bool OPTIONAL !ip_area TYPE ty_area DEFAULT c_area-topleft RAISING zcx_excel . METHODS get_header_footer_drawings RETURNING VALUE(rt_drawings) TYPE zexcel_t_drawings . METHODS set_area_hyperlink 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 !ip_url TYPE string !ip_is_internal TYPE abap_bool RAISING zcx_excel . "! excel upload, counterpart to BIND_TABLE "! @parameter it_field_catalog | field catalog, used to derive correct types "! @parameter iv_begin_row | starting row, by default 2 to skip header "! @parameter et_data | generic internal table, there may be conversion losses "! @parameter er_data | ref to internal table of string columns, to get raw data without conversion losses. METHODS convert_to_table IMPORTING !it_field_catalog TYPE zexcel_t_fieldcatalog OPTIONAL !iv_begin_row TYPE int4 DEFAULT 2 EXPORTING !et_data TYPE STANDARD TABLE !er_data TYPE REF TO data RAISING zcx_excel . PROTECTED SECTION. METHODS set_table_reference IMPORTING !ip_column TYPE zexcel_cell_column !ip_row TYPE zexcel_cell_row !ir_table TYPE REF TO zcl_excel_table !ip_fieldname TYPE zexcel_fieldname !ip_header TYPE abap_bool RAISING zcx_excel . PRIVATE SECTION. *"* private components of class ZCL_EXCEL_WORKSHEET *"* do not include other source files here!!! TYPES ty_table_settings TYPE STANDARD TABLE OF zexcel_s_table_settings WITH DEFAULT KEY. DATA active_cell TYPE zexcel_s_cell_data . DATA charts TYPE REF TO zcl_excel_drawings . DATA columns TYPE REF TO zcl_excel_columns . DATA row_default TYPE REF TO zcl_excel_row . DATA column_default TYPE REF TO zcl_excel_column . DATA styles_cond TYPE REF TO zcl_excel_styles_cond . DATA data_validations TYPE REF TO zcl_excel_data_validations . DATA default_excel_date_format TYPE zexcel_number_format . DATA default_excel_time_format TYPE zexcel_number_format . DATA comments TYPE REF TO zcl_excel_comments . DATA drawings TYPE REF TO zcl_excel_drawings . DATA freeze_pane_cell_column TYPE zexcel_cell_column . DATA freeze_pane_cell_row TYPE zexcel_cell_row . DATA guid TYPE sysuuid_x16 . DATA hyperlinks TYPE REF TO zcl_excel_collection . DATA lower_cell TYPE zexcel_s_cell_data . DATA mo_pagebreaks TYPE REF TO zcl_excel_worksheet_pagebreaks . DATA mt_row_outlines TYPE mty_ts_outlines_row . DATA print_title_col_from TYPE zexcel_cell_column_alpha . DATA print_title_col_to TYPE zexcel_cell_column_alpha . DATA print_title_row_from TYPE zexcel_cell_row . DATA print_title_row_to TYPE zexcel_cell_row . DATA ranges TYPE REF TO zcl_excel_ranges . DATA rows TYPE REF TO zcl_excel_rows . DATA tables TYPE REF TO zcl_excel_collection . DATA title TYPE zexcel_sheet_title VALUE 'Worksheet'. "#EC NOTEXT . . . . . . . . . . . . . . . . . . . . . . . . . . . . " . DATA upper_cell TYPE zexcel_s_cell_data . DATA mt_ignored_errors TYPE mty_th_ignored_errors. DATA right_to_left TYPE abap_bool. METHODS calculate_cell_width IMPORTING !ip_column TYPE simple !ip_row TYPE zexcel_cell_row RETURNING VALUE(ep_width) TYPE f RAISING zcx_excel . CLASS-METHODS calculate_table_bottom_right IMPORTING ip_table TYPE STANDARD TABLE it_field_catalog TYPE zexcel_t_fieldcatalog CHANGING cs_settings TYPE zexcel_s_table_settings RAISING zcx_excel. CLASS-METHODS check_cell_column_formula IMPORTING it_column_formulas TYPE mty_th_column_formula ip_column_formula_id TYPE mty_s_column_formula-id ip_formula TYPE zexcel_cell_formula ip_value TYPE simple ip_row TYPE zexcel_cell_row ip_column TYPE zexcel_cell_column RAISING zcx_excel. METHODS check_rtf IMPORTING !ip_value TYPE simple VALUE(ip_style) TYPE zexcel_cell_style OPTIONAL CHANGING !ct_rtf TYPE zexcel_t_rtf RAISING zcx_excel . CLASS-METHODS check_table_overlapping IMPORTING is_table_settings TYPE zexcel_s_table_settings it_other_table_settings TYPE ty_table_settings RAISING zcx_excel. METHODS clear_initial_colorxfields IMPORTING is_color TYPE zexcel_s_style_color CHANGING cs_xcolor TYPE zexcel_s_cstylex_color. METHODS create_data_conv_exit_length IMPORTING !ip_value TYPE simple RETURNING VALUE(ep_value) TYPE REF TO data. METHODS generate_title RETURNING VALUE(ep_title) TYPE zexcel_sheet_title . METHODS get_value_type IMPORTING !ip_value TYPE simple EXPORTING !ep_value TYPE simple !ep_value_type TYPE abap_typekind . METHODS move_supplied_borders IMPORTING iv_border_supplied TYPE abap_bool is_border TYPE zexcel_s_cstyle_border iv_xborder_supplied TYPE abap_bool is_xborder TYPE zexcel_s_cstylex_border CHANGING cs_complete_style_border TYPE zexcel_s_cstyle_border cs_complete_stylex_border TYPE zexcel_s_cstylex_border. METHODS normalize_column_heading_texts IMPORTING iv_default_descr TYPE c it_field_catalog TYPE zexcel_t_fieldcatalog RETURNING VALUE(result) TYPE zexcel_t_fieldcatalog. METHODS normalize_columnrow_parameter IMPORTING ip_columnrow TYPE csequence OPTIONAL 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. CLASS-METHODS normalize_style_parameter IMPORTING !ip_style_or_guid TYPE any RETURNING VALUE(rv_guid) TYPE zexcel_cell_style RAISING zcx_excel . METHODS print_title_set_range . METHODS update_dimension_range RAISING zcx_excel . ENDCLASS. CLASS zcl_excel_worksheet IMPLEMENTATION. METHOD add_comment. comments->include( ip_comment ). ENDMETHOD. "add_comment METHOD add_drawing. CASE ip_drawing->get_type( ). WHEN zcl_excel_drawing=>type_image. drawings->include( ip_drawing ). WHEN zcl_excel_drawing=>type_chart. charts->include( ip_drawing ). ENDCASE. ENDMETHOD. "ADD_DRAWING METHOD add_new_column. DATA: lv_column_alpha TYPE zexcel_cell_column_alpha. lv_column_alpha = zcl_excel_common=>convert_column2alpha( ip_column ). CREATE OBJECT eo_column EXPORTING ip_index = lv_column_alpha ip_excel = me->excel ip_worksheet = me. columns->add( eo_column ). ENDMETHOD. "ADD_NEW_COLUMN METHOD add_new_data_validation. CREATE OBJECT eo_data_validation. data_validations->add( eo_data_validation ). ENDMETHOD. "ADD_NEW_DATA_VALIDATION METHOD add_new_range. * Create default blank range CREATE OBJECT eo_range. ranges->add( eo_range ). ENDMETHOD. "ADD_NEW_RANGE METHOD add_new_row. CREATE OBJECT eo_row EXPORTING ip_index = ip_row. rows->add( eo_row ). ENDMETHOD. "ADD_NEW_ROW METHOD add_new_style_cond. CREATE OBJECT eo_style_cond EXPORTING ip_dimension_range = ip_dimension_range. styles_cond->add( eo_style_cond ). ENDMETHOD. "ADD_NEW_STYLE_COND METHOD bind_alv. DATA: lo_converter TYPE REF TO zcl_excel_converter. CREATE OBJECT lo_converter. TRY. lo_converter->convert( EXPORTING io_alv = io_alv it_table = it_table i_row_int = i_top i_column_int = i_left i_table = i_table i_style_table = table_style io_worksheet = me CHANGING co_excel = excel ). CATCH zcx_excel . ENDTRY. ENDMETHOD. "BIND_ALV METHOD bind_alv_ole2. CALL METHOD ('ZCL_EXCEL_OLE')=>('BIND_ALV_OLE2') EXPORTING i_document_url = i_document_url i_xls = i_xls i_save_path = i_save_path io_alv = io_alv it_listheader = it_listheader i_top = i_top i_left = i_left i_columns_header = i_columns_header i_columns_autofit = i_columns_autofit i_format_col_header = i_format_col_header i_format_subtotal = i_format_subtotal i_format_total = i_format_total EXCEPTIONS miss_guide = 1 ex_transfer_kkblo_error = 2 fatal_error = 3 inv_data_range = 4 dim_mismatch_vkey = 5 dim_mismatch_sema = 6 error_in_sema = 7 OTHERS = 8. IF sy-subrc <> 0. CASE sy-subrc. WHEN 1. RAISE miss_guide. WHEN 2. RAISE ex_transfer_kkblo_error. WHEN 3. RAISE fatal_error. WHEN 4. RAISE inv_data_range. WHEN 5. RAISE dim_mismatch_vkey. WHEN 6. RAISE dim_mismatch_sema. WHEN 7. RAISE error_in_sema. ENDCASE. ENDIF. ENDMETHOD. "BIND_ALV_OLE2 METHOD bind_table. *--------------------------------------------------------------------* * issue #230 - Pimp my Code * - Stefan Schmöcker, (wi p) 2012-12-01 * - ... * aligning code * message made to support multilinguality *--------------------------------------------------------------------* * issue #237 - Check if overlapping areas exist * - Alessandro Iannacci 2012-12-01 * changes: - Added raise if overlaps are detected *--------------------------------------------------------------------* CONSTANTS: lc_top_left_column TYPE zexcel_cell_column_alpha VALUE 'A', lc_top_left_row TYPE zexcel_cell_row VALUE 1. 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_formula TYPE string, ls_settings TYPE zexcel_s_table_settings, lo_table TYPE REF TO zcl_excel_table, lv_value_lowercase TYPE string, lv_syindex TYPE c LENGTH 3, lo_iterator TYPE REF TO zcl_excel_collection_iterator, lo_style_cond TYPE REF TO zcl_excel_style_cond, lo_curtable TYPE REF TO zcl_excel_table, lt_other_table_settings TYPE ty_table_settings. DATA: ls_column_formula TYPE mty_s_column_formula, lv_mincol TYPE i. FIELD-SYMBOLS: TYPE zexcel_s_fieldcatalog, TYPE zexcel_s_fieldcatalog, TYPE any, 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 ip_conv_exit_length = ip_conv_exit_length ). ELSE. lt_field_catalog = it_field_catalog. ENDIF. SORT lt_field_catalog BY position. calculate_table_bottom_right( EXPORTING ip_table = ip_table it_field_catalog = lt_field_catalog CHANGING cs_settings = ls_settings ). * Check if overlapping areas exist lo_iterator = me->tables->get_iterator( ). WHILE lo_iterator->has_next( ) EQ abap_true. lo_curtable ?= lo_iterator->get_next( ). APPEND lo_curtable->settings TO lt_other_table_settings. ENDWHILE. check_table_overlapping( is_table_settings = ls_settings it_other_table_settings = lt_other_table_settings ). * Start filling the table 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 ). 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. lt_field_catalog = normalize_column_heading_texts( iv_default_descr = iv_default_descr it_field_catalog = lt_field_catalog ). * It is better to loop column by column (only visible column) LOOP AT lt_field_catalog ASSIGNING WHERE dynpfld EQ abap_true. lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ). " First of all write column header IF -style_header IS NOT INITIAL. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_value = -column_name ip_style = -style_header ). ELSE. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_value = -column_name ). ENDIF. me->set_table_reference( ip_column = lv_column_int ip_row = lv_row_int ir_table = lo_table ip_fieldname = -fieldname ip_header = abap_true ). IF -column_formula IS NOT INITIAL. ls_column_formula-id = lines( column_formulas ) + 1. ls_column_formula-column = lv_column_int. ls_column_formula-formula = -column_formula. ls_column_formula-table_top_left_row = lo_table->settings-top_left_row. ls_column_formula-table_bottom_right_row = lo_table->settings-bottom_right_row. ls_column_formula-table_left_column_int = lv_mincol. ls_column_formula-table_right_column_int = zcl_excel_common=>convert_column2int( lo_table->settings-bottom_right_column ). INSERT ls_column_formula INTO TABLE column_formulas. ENDIF. ADD 1 TO lv_row_int. LOOP AT ip_table ASSIGNING . ASSIGN COMPONENT -fieldname OF STRUCTURE TO . " issue #290 Add formula support in table IF -formula EQ abap_true. IF -style IS NOT INITIAL. IF -abap_type IS NOT INITIAL. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_formula = ip_abap_type = -abap_type ip_style = -style ). ELSE. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_formula = ip_style = -style ). ENDIF. ELSEIF -abap_type IS NOT INITIAL. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_formula = ip_abap_type = -abap_type ). ELSE. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_formula = ). ENDIF. ELSEIF -column_formula IS NOT INITIAL. " Column formulas IF -style IS NOT INITIAL. IF -abap_type IS NOT INITIAL. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_column_formula_id = ls_column_formula-id ip_abap_type = -abap_type ip_style = -style ). ELSE. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_column_formula_id = ls_column_formula-id ip_style = -style ). ENDIF. ELSEIF -abap_type IS NOT INITIAL. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_column_formula_id = ls_column_formula-id ip_abap_type = -abap_type ). ELSE. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_column_formula_id = ls_column_formula-id ). ENDIF. ELSE. IF -style IS NOT INITIAL. IF -abap_type IS NOT INITIAL. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_value = ip_abap_type = -abap_type ip_style = -style ip_conv_exit_length = ip_conv_exit_length ). ELSE. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_value = ip_style = -style ip_conv_exit_length = ip_conv_exit_length ). ENDIF. ELSE. IF -abap_type IS NOT INITIAL. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_abap_type = -abap_type ip_value = ip_conv_exit_length = ip_conv_exit_length ). ELSE. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_value = ip_conv_exit_length = ip_conv_exit_length ). ENDIF. ENDIF. ENDIF. ADD 1 TO lv_row_int. ENDLOOP. IF sy-subrc <> 0 AND iv_no_line_if_empty = abap_false. "create empty row if table has no data me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_value = space ). ADD 1 TO lv_row_int. ENDIF. *--------------------------------------------------------------------* " totals *--------------------------------------------------------------------* IF -totals_function IS NOT INITIAL. lv_formula = lo_table->get_totals_formula( ip_column = -column_name ip_function = -totals_function ). IF -style_total IS NOT INITIAL. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_formula = lv_formula ip_style = -style_total ). ELSE. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_formula = lv_formula ). ENDIF. ENDIF. lv_row_int = ls_settings-top_left_row. ADD 1 TO lv_column_int. *--------------------------------------------------------------------* " conditional formatting *--------------------------------------------------------------------* IF -style_cond IS NOT INITIAL. lv_first_row = ls_settings-top_left_row + 1. " +1 to exclude header lv_last_row = ls_settings-bottom_right_row. lo_style_cond = me->get_style_cond( -style_cond ). lo_style_cond->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[]. es_table_settings = ls_settings. es_table_settings-bottom_right_column = lv_column_alpha. " >> Issue #291 IF ip_table IS INITIAL. es_table_settings-bottom_right_row = ls_settings-top_left_row + 2. "Last rows ELSE. es_table_settings-bottom_right_row = ls_settings-bottom_right_row + 1. "Last rows ENDIF. " << Issue #291 ENDMETHOD. "BIND_TABLE METHOD calculate_cell_width. *--------------------------------------------------------------------* * issue #293 - Roberto Bianco * - Christian Assig 2014-03-14 * * changes: - Calculate widths using SAPscript font metrics * (transaction SE73) * - Calculate the width of dates * - Add additional width for auto filter buttons * - Add cell padding to simulate Excel behavior *--------------------------------------------------------------------* DATA: ld_cell_value TYPE zexcel_cell_value, ld_style_guid TYPE zexcel_cell_style, ls_stylemapping TYPE zexcel_s_stylemapping, lo_table_object TYPE REF TO object, lo_table TYPE REF TO zcl_excel_table, ld_table_top_left_column TYPE zexcel_cell_column, ld_table_bottom_right_column TYPE zexcel_cell_column, ld_flag_contains_auto_filter TYPE abap_bool VALUE abap_false, ld_flag_bold TYPE abap_bool VALUE abap_false, ld_flag_italic TYPE abap_bool VALUE abap_false, ld_date TYPE d, ld_date_char TYPE c LENGTH 50, ld_font_height TYPE tdfontsize VALUE zcl_excel_font=>lc_default_font_height, ld_font_name TYPE zexcel_style_font_name VALUE zcl_excel_font=>lc_default_font_name. " Determine cell content and cell style me->get_cell( EXPORTING ip_column = ip_column ip_row = ip_row IMPORTING ep_value = ld_cell_value ep_guid = ld_style_guid ). " ABAP2XLSX uses tables to define areas containing headers and " auto-filters. Find out if the current cell is in the header " of one of these tables. LOOP AT me->tables->collection INTO lo_table_object. " Downcast: OBJECT -> ZCL_EXCEL_TABLE lo_table ?= lo_table_object. " Convert column letters to corresponding integer values ld_table_top_left_column = zcl_excel_common=>convert_column2int( lo_table->settings-top_left_column ). ld_table_bottom_right_column = zcl_excel_common=>convert_column2int( lo_table->settings-bottom_right_column ). " Is the current cell part of the table header? IF ip_column BETWEEN ld_table_top_left_column AND ld_table_bottom_right_column AND ip_row EQ lo_table->settings-top_left_row. " Current cell is part of the table header " -> Assume that an auto filter is present and that the font is " bold ld_flag_contains_auto_filter = abap_true. ld_flag_bold = abap_true. ENDIF. ENDLOOP. " If a style GUID is present, read style attributes IF ld_style_guid IS NOT INITIAL. TRY. " Read style attributes ls_stylemapping = me->excel->get_style_to_guid( ld_style_guid ). " If the current cell contains the default date format, " convert the cell value to a date and calculate its length IF ls_stylemapping-complete_style-number_format-format_code = zcl_excel_style_number_format=>c_format_date_std. " Convert excel date to ABAP date ld_date = zcl_excel_common=>excel_string_to_date( ld_cell_value ). " Format ABAP date using user's formatting settings WRITE ld_date TO ld_date_char. " Remember the formatted date to calculate the cell size ld_cell_value = ld_date_char. ENDIF. " Read the font size and convert it to the font height " used by SAPscript (multiplication by 10) IF ls_stylemapping-complete_stylex-font-size = abap_true. ld_font_height = ls_stylemapping-complete_style-font-size * 10. ENDIF. " If set, remember the font name IF ls_stylemapping-complete_stylex-font-name = abap_true. ld_font_name = ls_stylemapping-complete_style-font-name. ENDIF. " If set, remember whether font is bold and italic. IF ls_stylemapping-complete_stylex-font-bold = abap_true. ld_flag_bold = ls_stylemapping-complete_style-font-bold. ENDIF. IF ls_stylemapping-complete_stylex-font-italic = abap_true. ld_flag_italic = ls_stylemapping-complete_style-font-italic. ENDIF. CATCH zcx_excel. "#EC NO_HANDLER " Style GUID is present, but style was not found " Continue with default values ENDTRY. ENDIF. ep_width = zcl_excel_font=>calculate_text_width( iv_font_name = ld_font_name iv_font_height = ld_font_height iv_flag_bold = ld_flag_bold iv_flag_italic = ld_flag_italic iv_cell_value = ld_cell_value ). " If the current cell contains an auto filter, make it a bit wider. " The size used by the auto filter button does not depend on the font " size. IF ld_flag_contains_auto_filter = abap_true. ADD 2 TO ep_width. ENDIF. ENDMETHOD. METHOD calculate_column_widths. TYPES: BEGIN OF t_auto_size, col_index TYPE int4, width TYPE f, END OF t_auto_size. TYPES: tt_auto_size TYPE TABLE OF t_auto_size. DATA: lo_column_iterator TYPE REF TO zcl_excel_collection_iterator, lo_column TYPE REF TO zcl_excel_column. DATA: auto_size TYPE flag. DATA: auto_sizes TYPE tt_auto_size. DATA: count TYPE int4. DATA: highest_row TYPE int4. DATA: width TYPE f. FIELD-SYMBOLS: LIKE LINE OF auto_sizes. lo_column_iterator = me->get_columns_iterator( ). WHILE lo_column_iterator->has_next( ) = abap_true. lo_column ?= lo_column_iterator->get_next( ). auto_size = lo_column->get_auto_size( ). IF auto_size = abap_true. APPEND INITIAL LINE TO auto_sizes ASSIGNING . -col_index = lo_column->get_column_index( ). -width = -1. ENDIF. ENDWHILE. " 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 . count = 1. WHILE count <= highest_row. * Do not check merged cells IF is_cell_merged( ip_column = -col_index ip_row = count ) = abap_false. width = calculate_cell_width( ip_column = -col_index " issue #155 - less restrictive typing for ip_column ip_row = count ). IF width > -width. -width = width. ENDIF. ENDIF. count = count + 1. ENDWHILE. lo_column = me->get_column( -col_index ). " issue #155 - less restrictive typing for ip_column lo_column->set_width( -width ). ENDLOOP. ENDIF. ENDMETHOD. "CALCULATE_COLUMN_WIDTHS METHOD calculate_table_bottom_right. DATA: lv_errormessage TYPE string, lv_columns TYPE i, lt_columns TYPE zexcel_t_fieldcatalog, lv_maxrow TYPE i, lo_iterator TYPE REF TO zcl_excel_collection_iterator, lo_curtable TYPE REF TO zcl_excel_table, lv_row_int TYPE zexcel_cell_row, lv_column_int TYPE zexcel_cell_column, lv_rows TYPE i, lv_maxcol TYPE i. "Get the number of columns for the current table lt_columns = it_field_catalog. DELETE lt_columns WHERE dynpfld NE abap_true. DESCRIBE TABLE lt_columns LINES lv_columns. "Calculate the top left row of the current table lv_column_int = zcl_excel_common=>convert_column2int( cs_settings-top_left_column ). lv_row_int = cs_settings-top_left_row. "Get number of row for the current table DESCRIBE TABLE ip_table LINES lv_rows. "Calculate the bottom right row for the current table lv_maxcol = lv_column_int + lv_columns - 1. lv_maxrow = lv_row_int + lv_rows. cs_settings-bottom_right_column = zcl_excel_common=>convert_column2alpha( lv_maxcol ). cs_settings-bottom_right_row = lv_maxrow. ENDMETHOD. METHOD change_area_style. 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, lv_column_start_int TYPE zexcel_cell_column, lv_column_end_int TYPE zexcel_cell_column. 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. WHILE lv_column_int <= lv_column_end_int. lv_row = lv_row_start. WHILE lv_row <= lv_row_to. ip_style_changer->apply( ip_worksheet = me ip_column = lv_column_int ip_row = lv_row ). ADD 1 TO lv_row. ENDWHILE. ADD 1 TO lv_column_int. ENDWHILE. ENDMETHOD. METHOD change_cell_style. 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 ). IF ip_complete IS SUPPLIED. IF ip_xcomplete IS NOT SUPPLIED. zcx_excel=>raise_text( 'Complete styleinfo has to be supplied with corresponding X-field' ). ENDIF. changer->set_complete( ip_complete = ip_complete ip_xcomplete = ip_xcomplete ). ENDIF. IF ip_font IS SUPPLIED. IF ip_xfont IS SUPPLIED. changer->set_complete_font( ip_font = ip_font ip_xfont = ip_xfont ). ELSE. changer->set_complete_font( ip_font = ip_font ). ENDIF. ENDIF. IF ip_fill IS SUPPLIED. IF ip_xfill IS SUPPLIED. changer->set_complete_fill( ip_fill = ip_fill ip_xfill = ip_xfill ). ELSE. changer->set_complete_fill( ip_fill = ip_fill ). ENDIF. ENDIF. IF ip_borders IS SUPPLIED. IF ip_xborders IS SUPPLIED. changer->set_complete_borders( ip_borders = ip_borders ip_xborders = ip_xborders ). ELSE. changer->set_complete_borders( ip_borders = ip_borders ). ENDIF. ENDIF. IF ip_alignment IS SUPPLIED. IF ip_xalignment IS SUPPLIED. changer->set_complete_alignment( ip_alignment = ip_alignment ip_xalignment = ip_xalignment ). ELSE. changer->set_complete_alignment( ip_alignment = ip_alignment ). ENDIF. ENDIF. IF ip_protection IS SUPPLIED. IF ip_xprotection IS SUPPLIED. changer->set_complete_protection( ip_protection = ip_protection ip_xprotection = ip_xprotection ). ELSE. changer->set_complete_protection( ip_protection = ip_protection ). ENDIF. ENDIF. IF ip_borders_allborders IS SUPPLIED. IF ip_xborders_allborders IS SUPPLIED. changer->set_complete_borders_all( ip_borders_allborders = ip_borders_allborders ip_xborders_allborders = ip_xborders_allborders ). ELSE. changer->set_complete_borders_all( ip_borders_allborders = ip_borders_allborders ). ENDIF. ENDIF. IF ip_borders_diagonal IS SUPPLIED. IF ip_xborders_diagonal IS SUPPLIED. changer->set_complete_borders_diagonal( ip_borders_diagonal = ip_borders_diagonal ip_xborders_diagonal = ip_xborders_diagonal ). ELSE. changer->set_complete_borders_diagonal( ip_borders_diagonal = ip_borders_diagonal ). ENDIF. ENDIF. IF ip_borders_down IS SUPPLIED. IF ip_xborders_down IS SUPPLIED. changer->set_complete_borders_down( ip_borders_down = ip_borders_down ip_xborders_down = ip_xborders_down ). ELSE. changer->set_complete_borders_down( ip_borders_down = ip_borders_down ). ENDIF. ENDIF. IF ip_borders_left IS SUPPLIED. IF ip_xborders_left IS SUPPLIED. changer->set_complete_borders_left( ip_borders_left = ip_borders_left ip_xborders_left = ip_xborders_left ). ELSE. changer->set_complete_borders_left( ip_borders_left = ip_borders_left ). ENDIF. ENDIF. IF ip_borders_right IS SUPPLIED. IF ip_xborders_right IS SUPPLIED. changer->set_complete_borders_right( ip_borders_right = ip_borders_right ip_xborders_right = ip_xborders_right ). ELSE. changer->set_complete_borders_right( ip_borders_right = ip_borders_right ). ENDIF. ENDIF. IF ip_borders_top IS SUPPLIED. IF ip_xborders_top IS SUPPLIED. changer->set_complete_borders_top( ip_borders_top = ip_borders_top ip_xborders_top = ip_xborders_top ). ELSE. changer->set_complete_borders_top( ip_borders_top = ip_borders_top ). ENDIF. ENDIF. IF ip_number_format_format_code IS SUPPLIED. changer->set_number_format( ip_number_format_format_code ). ENDIF. IF ip_font_bold IS SUPPLIED. changer->set_font_bold( ip_font_bold ). ENDIF. IF ip_font_color IS SUPPLIED. changer->set_font_color( ip_font_color ). ENDIF. IF ip_font_color_rgb IS SUPPLIED. changer->set_font_color_rgb( ip_font_color_rgb ). ENDIF. IF ip_font_color_indexed IS SUPPLIED. changer->set_font_color_indexed( ip_font_color_indexed ). ENDIF. IF ip_font_color_theme IS SUPPLIED. changer->set_font_color_theme( ip_font_color_theme ). ENDIF. IF ip_font_color_tint IS SUPPLIED. changer->set_font_color_tint( ip_font_color_tint ). ENDIF. IF ip_font_family IS SUPPLIED. changer->set_font_family( ip_font_family ). ENDIF. IF ip_font_italic IS SUPPLIED. changer->set_font_italic( ip_font_italic ). ENDIF. IF ip_font_name IS SUPPLIED. changer->set_font_name( ip_font_name ). ENDIF. IF ip_font_scheme IS SUPPLIED. changer->set_font_scheme( ip_font_scheme ). ENDIF. IF ip_font_size IS SUPPLIED. changer->set_font_size( ip_font_size ). ENDIF. IF ip_font_strikethrough IS SUPPLIED. changer->set_font_strikethrough( ip_font_strikethrough ). ENDIF. IF ip_font_underline IS SUPPLIED. changer->set_font_underline( ip_font_underline ). ENDIF. IF ip_font_underline_mode IS SUPPLIED. changer->set_font_underline_mode( ip_font_underline_mode ). ENDIF. IF ip_fill_filltype IS SUPPLIED. changer->set_fill_filltype( ip_fill_filltype ). ENDIF. IF ip_fill_rotation IS SUPPLIED. changer->set_fill_rotation( ip_fill_rotation ). ENDIF. IF ip_fill_fgcolor IS SUPPLIED. changer->set_fill_fgcolor( ip_fill_fgcolor ). ENDIF. IF ip_fill_fgcolor_rgb IS SUPPLIED. changer->set_fill_fgcolor_rgb( ip_fill_fgcolor_rgb ). ENDIF. IF ip_fill_fgcolor_indexed IS SUPPLIED. changer->set_fill_fgcolor_indexed( ip_fill_fgcolor_indexed ). ENDIF. IF ip_fill_fgcolor_theme IS SUPPLIED. changer->set_fill_fgcolor_theme( ip_fill_fgcolor_theme ). ENDIF. IF ip_fill_fgcolor_tint IS SUPPLIED. changer->set_fill_fgcolor_tint( ip_fill_fgcolor_tint ). ENDIF. IF ip_fill_bgcolor IS SUPPLIED. changer->set_fill_bgcolor( ip_fill_bgcolor ). ENDIF. IF ip_fill_bgcolor_rgb IS SUPPLIED. changer->set_fill_bgcolor_rgb( ip_fill_bgcolor_rgb ). ENDIF. IF ip_fill_bgcolor_indexed IS SUPPLIED. changer->set_fill_bgcolor_indexed( ip_fill_bgcolor_indexed ). ENDIF. IF ip_fill_bgcolor_theme IS SUPPLIED. changer->set_fill_bgcolor_theme( ip_fill_bgcolor_theme ). ENDIF. IF ip_fill_bgcolor_tint IS SUPPLIED. changer->set_fill_bgcolor_tint( ip_fill_bgcolor_tint ). ENDIF. IF ip_fill_gradtype_type IS SUPPLIED. changer->set_fill_gradtype_type( ip_fill_gradtype_type ). ENDIF. IF ip_fill_gradtype_degree IS SUPPLIED. changer->set_fill_gradtype_degree( ip_fill_gradtype_degree ). ENDIF. IF ip_fill_gradtype_bottom IS SUPPLIED. changer->set_fill_gradtype_bottom( ip_fill_gradtype_bottom ). ENDIF. IF ip_fill_gradtype_left IS SUPPLIED. changer->set_fill_gradtype_left( ip_fill_gradtype_left ). ENDIF. IF ip_fill_gradtype_top IS SUPPLIED. changer->set_fill_gradtype_top( ip_fill_gradtype_top ). ENDIF. IF ip_fill_gradtype_right IS SUPPLIED. changer->set_fill_gradtype_right( ip_fill_gradtype_right ). ENDIF. IF ip_fill_gradtype_position1 IS SUPPLIED. changer->set_fill_gradtype_position1( ip_fill_gradtype_position1 ). ENDIF. IF ip_fill_gradtype_position2 IS SUPPLIED. changer->set_fill_gradtype_position2( ip_fill_gradtype_position2 ). ENDIF. IF ip_fill_gradtype_position3 IS SUPPLIED. changer->set_fill_gradtype_position3( ip_fill_gradtype_position3 ). ENDIF. IF ip_borders_diagonal_mode IS SUPPLIED. changer->set_borders_diagonal_mode( ip_borders_diagonal_mode ). ENDIF. IF ip_alignment_horizontal IS SUPPLIED. changer->set_alignment_horizontal( ip_alignment_horizontal ). ENDIF. IF ip_alignment_vertical IS SUPPLIED. changer->set_alignment_vertical( ip_alignment_vertical ). ENDIF. IF ip_alignment_textrotation IS SUPPLIED. changer->set_alignment_textrotation( ip_alignment_textrotation ). ENDIF. IF ip_alignment_wraptext IS SUPPLIED. changer->set_alignment_wraptext( ip_alignment_wraptext ). ENDIF. IF ip_alignment_shrinktofit IS SUPPLIED. changer->set_alignment_shrinktofit( ip_alignment_shrinktofit ). ENDIF. IF ip_alignment_indent IS SUPPLIED. changer->set_alignment_indent( ip_alignment_indent ). ENDIF. IF ip_protection_hidden IS SUPPLIED. changer->set_protection_hidden( ip_protection_hidden ). ENDIF. IF ip_protection_locked IS SUPPLIED. changer->set_protection_locked( ip_protection_locked ). ENDIF. IF ip_borders_allborders_style IS SUPPLIED. changer->set_borders_allborders_style( ip_borders_allborders_style ). ENDIF. IF ip_borders_allborders_color IS SUPPLIED. changer->set_borders_allborders_color( ip_borders_allborders_color ). ENDIF. IF ip_borders_allbo_color_rgb IS SUPPLIED. changer->set_borders_allbo_color_rgb( ip_borders_allbo_color_rgb ). ENDIF. IF ip_borders_allbo_color_indexed IS SUPPLIED. changer->set_borders_allbo_color_indexe( ip_borders_allbo_color_indexed ). ENDIF. IF ip_borders_allbo_color_theme IS SUPPLIED. changer->set_borders_allbo_color_theme( ip_borders_allbo_color_theme ). ENDIF. IF ip_borders_allbo_color_tint IS SUPPLIED. changer->set_borders_allbo_color_tint( ip_borders_allbo_color_tint ). ENDIF. IF ip_borders_diagonal_style IS SUPPLIED. changer->set_borders_diagonal_style( ip_borders_diagonal_style ). ENDIF. IF ip_borders_diagonal_color IS SUPPLIED. changer->set_borders_diagonal_color( ip_borders_diagonal_color ). ENDIF. IF ip_borders_diagonal_color_rgb IS SUPPLIED. changer->set_borders_diagonal_color_rgb( ip_borders_diagonal_color_rgb ). ENDIF. IF ip_borders_diagonal_color_inde IS SUPPLIED. changer->set_borders_diagonal_color_ind( ip_borders_diagonal_color_inde ). ENDIF. IF ip_borders_diagonal_color_them IS SUPPLIED. changer->set_borders_diagonal_color_the( ip_borders_diagonal_color_them ). ENDIF. IF ip_borders_diagonal_color_tint IS SUPPLIED. changer->set_borders_diagonal_color_tin( ip_borders_diagonal_color_tint ). ENDIF. IF ip_borders_down_style IS SUPPLIED. changer->set_borders_down_style( ip_borders_down_style ). ENDIF. IF ip_borders_down_color IS SUPPLIED. changer->set_borders_down_color( ip_borders_down_color ). ENDIF. IF ip_borders_down_color_rgb IS SUPPLIED. changer->set_borders_down_color_rgb( ip_borders_down_color_rgb ). ENDIF. IF ip_borders_down_color_indexed IS SUPPLIED. changer->set_borders_down_color_indexed( ip_borders_down_color_indexed ). ENDIF. IF ip_borders_down_color_theme IS SUPPLIED. changer->set_borders_down_color_theme( ip_borders_down_color_theme ). ENDIF. IF ip_borders_down_color_tint IS SUPPLIED. changer->set_borders_down_color_tint( ip_borders_down_color_tint ). ENDIF. IF ip_borders_left_style IS SUPPLIED. changer->set_borders_left_style( ip_borders_left_style ). ENDIF. IF ip_borders_left_color IS SUPPLIED. changer->set_borders_left_color( ip_borders_left_color ). ENDIF. IF ip_borders_left_color_rgb IS SUPPLIED. changer->set_borders_left_color_rgb( ip_borders_left_color_rgb ). ENDIF. IF ip_borders_left_color_indexed IS SUPPLIED. changer->set_borders_left_color_indexed( ip_borders_left_color_indexed ). ENDIF. IF ip_borders_left_color_theme IS SUPPLIED. changer->set_borders_left_color_theme( ip_borders_left_color_theme ). ENDIF. IF ip_borders_left_color_tint IS SUPPLIED. changer->set_borders_left_color_tint( ip_borders_left_color_tint ). ENDIF. IF ip_borders_right_style IS SUPPLIED. changer->set_borders_right_style( ip_borders_right_style ). ENDIF. IF ip_borders_right_color IS SUPPLIED. changer->set_borders_right_color( ip_borders_right_color ). ENDIF. IF ip_borders_right_color_rgb IS SUPPLIED. changer->set_borders_right_color_rgb( ip_borders_right_color_rgb ). ENDIF. IF ip_borders_right_color_indexed IS SUPPLIED. changer->set_borders_right_color_indexe( ip_borders_right_color_indexed ). ENDIF. IF ip_borders_right_color_theme IS SUPPLIED. changer->set_borders_right_color_theme( ip_borders_right_color_theme ). ENDIF. IF ip_borders_right_color_tint IS SUPPLIED. changer->set_borders_right_color_tint( ip_borders_right_color_tint ). ENDIF. IF ip_borders_top_style IS SUPPLIED. changer->set_borders_top_style( ip_borders_top_style ). ENDIF. IF ip_borders_top_color IS SUPPLIED. changer->set_borders_top_color( ip_borders_top_color ). ENDIF. IF ip_borders_top_color_rgb IS SUPPLIED. changer->set_borders_top_color_rgb( ip_borders_top_color_rgb ). ENDIF. IF ip_borders_top_color_indexed IS SUPPLIED. changer->set_borders_top_color_indexed( ip_borders_top_color_indexed ). ENDIF. IF ip_borders_top_color_theme IS SUPPLIED. changer->set_borders_top_color_theme( ip_borders_top_color_theme ). ENDIF. IF ip_borders_top_color_tint IS SUPPLIED. changer->set_borders_top_color_tint( ip_borders_top_color_tint ). ENDIF. ep_guid = changer->apply( ip_worksheet = me ip_column = column ip_row = row ). ENDMETHOD. "CHANGE_CELL_STYLE METHOD check_cell_column_formula. FIELD-SYMBOLS TYPE zcl_excel_worksheet=>mty_s_column_formula. IF ip_value IS NOT INITIAL OR ip_formula IS NOT INITIAL. zcx_excel=>raise_text( c_messages-formula_id_only_is_possible ). ENDIF. READ TABLE it_column_formulas WITH TABLE KEY id = ip_column_formula_id ASSIGNING . IF sy-subrc <> 0. zcx_excel=>raise_text( c_messages-column_formula_id_not_found ). ENDIF. IF ip_row < -table_top_left_row + 1 OR ip_row > -table_bottom_right_row + 1 OR ip_column < -table_left_column_int OR ip_column > -table_right_column_int. zcx_excel=>raise_text( c_messages-formula_not_in_this_table ). ENDIF. IF ip_column <> -column. zcx_excel=>raise_text( c_messages-formula_in_other_column ). ENDIF. ENDMETHOD. METHOD check_rtf. DATA: lo_style TYPE REF TO zcl_excel_style, lo_iterator TYPE REF TO zcl_excel_collection_iterator, lv_next_rtf_offset TYPE i, lv_tabix TYPE i, lv_value TYPE string, lv_val_length TYPE i, ls_rtf LIKE LINE OF ct_rtf. FIELD-SYMBOLS: LIKE LINE OF ct_rtf. IF ip_style IS NOT SUPPLIED. ip_style = excel->get_default_style( ). ENDIF. lo_iterator = excel->get_styles_iterator( ). WHILE lo_iterator->has_next( ) = abap_true. lo_style ?= lo_iterator->get_next( ). IF lo_style->get_guid( ) = ip_style. EXIT. ENDIF. CLEAR lo_style. ENDWHILE. lv_next_rtf_offset = 0. LOOP AT ct_rtf ASSIGNING . lv_tabix = sy-tabix. IF lv_next_rtf_offset < -offset. ls_rtf-offset = lv_next_rtf_offset. ls_rtf-length = -offset - lv_next_rtf_offset. ls_rtf-font = lo_style->font->get_structure( ). INSERT ls_rtf INTO ct_rtf INDEX lv_tabix. ELSEIF lv_next_rtf_offset > -offset. RAISE EXCEPTION TYPE zcx_excel EXPORTING error = 'Gaps or overlaps in RTF data offset/length specs'. ENDIF. lv_next_rtf_offset = -offset + -length. ENDLOOP. lv_value = ip_value. lv_val_length = strlen( lv_value ). IF lv_val_length > lv_next_rtf_offset. ls_rtf-offset = lv_next_rtf_offset. ls_rtf-length = lv_val_length - lv_next_rtf_offset. ls_rtf-font = lo_style->font->get_structure( ). INSERT ls_rtf INTO TABLE ct_rtf. ELSEIF lv_val_length > lv_next_rtf_offset. RAISE EXCEPTION TYPE zcx_excel EXPORTING error = 'RTF specs length is not equal to value length'. ENDIF. ENDMETHOD. METHOD check_table_overlapping. DATA: lv_errormessage TYPE string, lv_column_int TYPE zexcel_cell_column, lv_maxcol TYPE i. FIELD-SYMBOLS: TYPE zexcel_s_table_settings. lv_column_int = zcl_excel_common=>convert_column2int( is_table_settings-top_left_column ). lv_maxcol = zcl_excel_common=>convert_column2int( is_table_settings-bottom_right_column ). LOOP AT it_other_table_settings ASSIGNING . IF ( ( is_table_settings-top_left_row GE -top_left_row AND is_table_settings-top_left_row LE -bottom_right_row ) OR ( is_table_settings-bottom_right_row GE -top_left_row AND is_table_settings-bottom_right_row LE -bottom_right_row ) ) AND ( ( lv_column_int GE zcl_excel_common=>convert_column2int( -top_left_column ) AND lv_column_int LE zcl_excel_common=>convert_column2int( -bottom_right_column ) ) OR ( lv_maxcol GE zcl_excel_common=>convert_column2int( -top_left_column ) AND lv_maxcol LE zcl_excel_common=>convert_column2int( -bottom_right_column ) ) ). lv_errormessage = 'Table overlaps with previously bound table and will not be added to worksheet.'(400). zcx_excel=>raise_text( lv_errormessage ). ENDIF. ENDLOOP. ENDMETHOD. METHOD class_constructor. c_messages-formula_id_only_is_possible = |{ 'If Formula ID is used, value and formula must be empty'(008) }|. c_messages-column_formula_id_not_found = |{ 'The Column Formula does not exist'(009) }|. c_messages-formula_not_in_this_table = |{ 'The cell uses a Column Formula which should be part of the same table'(010) }|. c_messages-formula_in_other_column = |{ 'The cell uses a Column Formula which is in a different column'(011) }|. ENDMETHOD. METHOD clear_initial_colorxfields. IF is_color-rgb IS INITIAL. CLEAR cs_xcolor-rgb. ENDIF. IF is_color-indexed IS INITIAL. CLEAR cs_xcolor-indexed. ENDIF. IF is_color-theme IS INITIAL. CLEAR cs_xcolor-theme. ENDIF. IF is_color-tint IS INITIAL. CLEAR cs_xcolor-tint. ENDIF. ENDMETHOD. METHOD constructor. DATA: lv_title TYPE zexcel_sheet_title. me->excel = ip_excel. me->guid = zcl_excel_obsolete_func_wrap=>guid_create( ). " ins issue #379 - replacement for outdated function call IF ip_title IS NOT INITIAL. lv_title = ip_title. ELSE. lv_title = me->generate_title( ). " ins issue #154 - Names of worksheets ENDIF. me->set_title( ip_title = lv_title ). CREATE OBJECT sheet_setup. CREATE OBJECT styles_cond. CREATE OBJECT data_validations. CREATE OBJECT tables. CREATE OBJECT columns. CREATE OBJECT rows. CREATE OBJECT ranges. " issue #163 CREATE OBJECT mo_pagebreaks. CREATE OBJECT drawings EXPORTING ip_type = zcl_excel_drawing=>type_image. CREATE OBJECT charts EXPORTING ip_type = zcl_excel_drawing=>type_chart. me->zif_excel_sheet_protection~initialize( ). me->zif_excel_sheet_properties~initialize( ). CREATE OBJECT hyperlinks. CREATE OBJECT comments. " (+) Issue #180 * 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. "CONSTRUCTOR METHOD convert_to_table. TYPES: BEGIN OF ts_field_conv, fieldname TYPE x031l-fieldname, convexit TYPE x031l-convexit, END OF ts_field_conv, BEGIN OF ts_style_conv, cell_style TYPE zexcel_s_cell_data-cell_style, abap_type TYPE abap_typekind, END OF ts_style_conv. DATA: lv_row_int 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, ls_field_catalog TYPE zexcel_s_fieldcatalog, lv_value TYPE string, lv_maxcol TYPE i, lv_maxrow TYPE i, lt_field_conv TYPE TABLE OF ts_field_conv, lt_comp TYPE abap_component_tab, ls_comp TYPE abap_componentdescr, lo_line_type TYPE REF TO cl_abap_structdescr, lo_tab_type TYPE REF TO cl_abap_tabledescr, lr_data TYPE REF TO data, lt_comp_view TYPE abap_component_view_tab, ls_comp_view TYPE abap_simple_componentdescr, lt_ddic_object TYPE dd_x031l_table, lt_ddic_object_comp TYPE dd_x031l_table, ls_ddic_object TYPE x031l, lt_style_conv TYPE TABLE OF ts_style_conv, ls_style_conv TYPE ts_style_conv, ls_stylemapping TYPE zexcel_s_stylemapping, lv_format_code TYPE zexcel_number_format, lv_float TYPE f, lt_map_excel_row TYPE TABLE OF i, lv_index TYPE i, lv_index_col TYPE i. FIELD-SYMBOLS: TYPE STANDARD TABLE, TYPE data, TYPE data, TYPE STANDARD TABLE, TYPE data, TYPE data, TYPE ts_field_conv, TYPE x031l, TYPE zexcel_s_cell_data. CLEAR: et_data, er_data. lv_maxcol = get_highest_column( ). lv_maxrow = get_highest_row( ). " Field catalog lt_field_catalog = it_field_catalog. IF lt_field_catalog IS INITIAL. IF et_data IS SUPPLIED. lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = et_data ). ELSE. DO lv_maxcol TIMES. ls_field_catalog-position = sy-index. ls_field_catalog-fieldname = 'COL_' && sy-index. ls_field_catalog-dynpfld = abap_true. APPEND ls_field_catalog TO lt_field_catalog. ENDDO. ENDIF. ENDIF. SORT lt_field_catalog BY position. DELETE lt_field_catalog WHERE dynpfld NE abap_true. CHECK: lt_field_catalog IS NOT INITIAL. " Create dynamic table string columns ls_comp-type = cl_abap_elemdescr=>get_string( ). LOOP AT lt_field_catalog INTO ls_field_catalog. ls_comp-name = ls_field_catalog-fieldname. APPEND ls_comp TO lt_comp. ENDLOOP. lo_line_type = cl_abap_structdescr=>create( lt_comp ). lo_tab_type = cl_abap_tabledescr=>create( lo_line_type ). CREATE DATA er_data TYPE HANDLE lo_tab_type. ASSIGN er_data->* TO . " Collect field conversion rules IF et_data IS SUPPLIED. * lt_ddic_object = get_ddic_object( et_data ). lo_tab_type ?= cl_abap_tabledescr=>describe_by_data( et_data ). lo_line_type ?= lo_tab_type->get_table_line_type( ). lo_line_type->get_ddic_object( RECEIVING p_object = lt_ddic_object EXCEPTIONS OTHERS = 3 ). IF lt_ddic_object IS INITIAL. lt_comp_view = lo_line_type->get_included_view( ). LOOP AT lt_comp_view INTO ls_comp_view. ls_comp_view-type->get_ddic_object( RECEIVING p_object = lt_ddic_object_comp EXCEPTIONS OTHERS = 3 ). IF lt_ddic_object_comp IS NOT INITIAL. READ TABLE lt_ddic_object_comp INTO ls_ddic_object INDEX 1. ls_ddic_object-fieldname = ls_comp_view-name. APPEND ls_ddic_object TO lt_ddic_object. ENDIF. ENDLOOP. ENDIF. SORT lt_ddic_object BY fieldname. LOOP AT lt_field_catalog INTO ls_field_catalog. APPEND INITIAL LINE TO lt_field_conv ASSIGNING . MOVE-CORRESPONDING ls_field_catalog TO . READ TABLE lt_ddic_object ASSIGNING WITH KEY fieldname = -fieldname BINARY SEARCH. CHECK: sy-subrc EQ 0. CASE -exid. WHEN cl_abap_typedescr=>typekind_int OR cl_abap_typedescr=>typekind_int1 OR cl_abap_typedescr=>typekind_int8 OR cl_abap_typedescr=>typekind_int2 OR cl_abap_typedescr=>typekind_packed OR cl_abap_typedescr=>typekind_decfloat OR cl_abap_typedescr=>typekind_decfloat16 OR cl_abap_typedescr=>typekind_decfloat34 OR cl_abap_typedescr=>typekind_float. " Numbers -convexit = cl_abap_typedescr=>typekind_float. WHEN OTHERS. -convexit = -convexit. ENDCASE. ENDLOOP. ENDIF. " Date & Time in excel style LOOP AT me->sheet_content ASSIGNING WHERE cell_style IS NOT INITIAL AND data_type IS INITIAL. ls_style_conv-cell_style = -cell_style. APPEND ls_style_conv TO lt_style_conv. ENDLOOP. IF lt_style_conv IS NOT INITIAL. SORT lt_style_conv BY cell_style. DELETE ADJACENT DUPLICATES FROM lt_style_conv COMPARING cell_style. LOOP AT lt_style_conv INTO ls_style_conv. ls_stylemapping = me->excel->get_style_to_guid( ls_style_conv-cell_style ). lv_format_code = ls_stylemapping-complete_style-number_format-format_code. " https://support.microsoft.com/en-us/office/number-format-codes-5026bbd6-04bc-48cd-bf33-80f18b4eae68 IF lv_format_code CS ';'. lv_format_code = lv_format_code(sy-fdpos). ENDIF. CHECK: lv_format_code NA '#?'. " Remove color pattern REPLACE ALL OCCURRENCES OF REGEX '\[\L[^]]*\]' IN lv_format_code WITH ''. IF lv_format_code CA 'yd' OR lv_format_code EQ zcl_excel_style_number_format=>c_format_date_std. " DATE = yyyymmdd ls_style_conv-abap_type = cl_abap_typedescr=>typekind_date. ELSEIF lv_format_code CA 'hs'. " TIME = hhmmss ls_style_conv-abap_type = cl_abap_typedescr=>typekind_time. ELSE. DELETE lt_style_conv. CONTINUE. ENDIF. MODIFY lt_style_conv FROM ls_style_conv TRANSPORTING abap_type. ENDLOOP. ENDIF. *--------------------------------------------------------------------* * Start of convert content *--------------------------------------------------------------------* READ TABLE me->sheet_content TRANSPORTING NO FIELDS WITH KEY cell_row = iv_begin_row. IF sy-subrc EQ 0. lv_index = sy-tabix. ENDIF. LOOP AT me->sheet_content ASSIGNING FROM lv_index. AT NEW cell_row. " New line APPEND INITIAL LINE TO ASSIGNING . lv_index = sy-tabix. ENDAT. IF -cell_value IS NOT INITIAL. ASSIGN COMPONENT -cell_column OF STRUCTURE TO . IF sy-subrc EQ 0. " value = -cell_value. " field conversion READ TABLE lt_field_conv ASSIGNING INDEX -cell_column. IF sy-subrc EQ 0 AND -convexit IS NOT INITIAL. CASE -convexit. WHEN cl_abap_typedescr=>typekind_float. lv_float = zcl_excel_common=>excel_string_to_number( -cell_value ). = |{ lv_float NUMBER = RAW }|. WHEN 'ALPHA'. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT' EXPORTING input = -cell_value IMPORTING output = . ENDCASE. ENDIF. " style conversion IF -cell_style IS NOT INITIAL. READ TABLE lt_style_conv INTO ls_style_conv WITH KEY cell_style = -cell_style BINARY SEARCH. IF sy-subrc EQ 0. CASE ls_style_conv-abap_type. WHEN cl_abap_typedescr=>typekind_date. = zcl_excel_common=>excel_string_to_date( -cell_value ). WHEN cl_abap_typedescr=>typekind_time. = zcl_excel_common=>excel_string_to_time( -cell_value ). ENDCASE. ENDIF. ENDIF. " condense CONDENSE . ENDIF. ENDIF. AT END OF cell_row. " Delete empty line IF IS INITIAL. DELETE INDEX lv_index. ELSE. APPEND -cell_row TO lt_map_excel_row. ENDIF. ENDAT. ENDLOOP. *--------------------------------------------------------------------* * End of convert content *--------------------------------------------------------------------* IF et_data IS SUPPLIED. * MOVE-CORRESPONDING TO et_data. LOOP AT ASSIGNING . APPEND INITIAL LINE TO et_data ASSIGNING . MOVE-CORRESPONDING TO . ENDLOOP. ENDIF. " Apply conversion exit. LOOP AT lt_field_conv ASSIGNING WHERE convexit = 'ALPHA'. LOOP AT et_data ASSIGNING . ASSIGN COMPONENT -fieldname OF STRUCTURE TO . CHECK: sy-subrc EQ 0 AND IS NOT INITIAL. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING input = IMPORTING output = . ENDLOOP. ENDLOOP. ENDMETHOD. METHOD create_data_conv_exit_length. DATA: lo_addit TYPE REF TO cl_abap_elemdescr, ls_dfies TYPE dfies, l_function TYPE funcname, l_value(50) TYPE c. lo_addit ?= cl_abap_typedescr=>describe_by_data( ip_value ). lo_addit->get_ddic_field( RECEIVING p_flddescr = ls_dfies EXCEPTIONS not_found = 1 no_ddic_type = 2 OTHERS = 3 ) . IF sy-subrc = 0 AND ls_dfies-convexit IS NOT INITIAL. CREATE DATA ep_value TYPE c LENGTH ls_dfies-outputlen. ELSE. CREATE DATA ep_value LIKE ip_value. ENDIF. ENDMETHOD. METHOD delete_merge. DATA: lv_column TYPE i. *--------------------------------------------------------------------* * 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. lv_column = zcl_excel_common=>convert_column2int( ip_cell_column ). LOOP AT me->mt_merged_cells TRANSPORTING NO FIELDS WHERE row_from <= ip_cell_row AND row_to >= ip_cell_row AND col_from <= lv_column AND col_to >= lv_column. DELETE me->mt_merged_cells. EXIT. ENDLOOP. ENDIF. ENDMETHOD. "DELETE_MERGE METHOD delete_row_outline. DELETE me->mt_row_outlines WHERE row_from = iv_row_from AND row_to = iv_row_to. IF sy-subrc <> 0. " didn't find outline that was to be deleted zcx_excel=>raise_text( 'Row outline to be deleted does not exist' ). ENDIF. ENDMETHOD. "DELETE_ROW_OUTLINE METHOD freeze_panes. IF ip_num_columns IS NOT SUPPLIED AND ip_num_rows IS NOT SUPPLIED. zcx_excel=>raise_text( 'Pleas provide number of rows and/or columns to freeze' ). ENDIF. IF ip_num_columns IS SUPPLIED AND ip_num_columns <= 0. zcx_excel=>raise_text( 'Number of columns to freeze should be positive' ). ENDIF. IF ip_num_rows IS SUPPLIED AND ip_num_rows <= 0. zcx_excel=>raise_text( '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. "FREEZE_PANES METHOD generate_title. DATA: lo_worksheets_iterator TYPE REF TO zcl_excel_collection_iterator, lo_worksheet TYPE REF TO zcl_excel_worksheet. DATA: t_titles TYPE HASHED TABLE OF zexcel_sheet_title WITH UNIQUE KEY table_line, title TYPE zexcel_sheet_title, sheetnumber TYPE i. * Get list of currently used titles lo_worksheets_iterator = me->excel->get_worksheets_iterator( ). WHILE lo_worksheets_iterator->has_next( ) = abap_true. lo_worksheet ?= lo_worksheets_iterator->get_next( ). title = lo_worksheet->get_title( ). INSERT title INTO TABLE t_titles. ADD 1 TO sheetnumber. ENDWHILE. * Now build sheetnumber. Increase counter until we hit a number that is not used so far ADD 1 TO sheetnumber. " Start counting with next number DO. title = sheetnumber. SHIFT title LEFT DELETING LEADING space. CONCATENATE 'Sheet'(001) title INTO ep_title. INSERT ep_title INTO TABLE t_titles. IF sy-subrc = 0. " Title not used so far --> take it EXIT. ENDIF. ADD 1 TO sheetnumber. ENDDO. ENDMETHOD. "GENERATE_TITLE 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. "GET_ACTIVE_CELL METHOD get_cell. DATA: lv_column TYPE zexcel_cell_column, lv_row TYPE zexcel_cell_row, ls_sheet_content TYPE zexcel_s_cell_data. 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 = lv_row cell_column = lv_column. ep_rc = sy-subrc. ep_value = ls_sheet_content-cell_value. ep_guid = ls_sheet_content-cell_style. " issue 139 - added this to be used for columnwidth calculation ep_formula = ls_sheet_content-cell_formula. IF et_rtf IS SUPPLIED AND ls_sheet_content-rtf_tab IS NOT INITIAL. et_rtf = ls_sheet_content-rtf_tab. ENDIF. " Addition to solve issue #120, contribution by Stefan Schmöcker DATA: style_iterator TYPE REF TO zcl_excel_collection_iterator, style TYPE REF TO zcl_excel_style. IF ep_style IS SUPPLIED. CLEAR ep_style. style_iterator = me->excel->get_styles_iterator( ). WHILE style_iterator->has_next( ) = abap_true. style ?= style_iterator->get_next( ). IF style->get_guid( ) = ls_sheet_content-cell_style. ep_style = style. EXIT. ENDIF. ENDWHILE. ENDIF. ENDMETHOD. "GET_CELL METHOD get_column. DATA: lv_column TYPE zexcel_cell_column. lv_column = zcl_excel_common=>convert_column2int( ip_column ). eo_column = me->columns->get( ip_index = lv_column ). IF eo_column IS NOT BOUND. eo_column = me->add_new_column( ip_column ). ENDIF. ENDMETHOD. "GET_COLUMN METHOD get_columns. DATA: columns TYPE TABLE OF i, column TYPE i. FIELD-SYMBOLS: TYPE zexcel_s_cell_data. LOOP AT sheet_content ASSIGNING . COLLECT -cell_column INTO columns. ENDLOOP. LOOP AT columns INTO column. " This will create the column instance if it doesn't exist get_column( column ). ENDLOOP. eo_columns = me->columns. ENDMETHOD. "GET_COLUMNS METHOD get_columns_iterator. get_columns( ). eo_iterator = me->columns->get_iterator( ). ENDMETHOD. "GET_COLUMNS_ITERATOR METHOD get_comments. DATA: lo_comment TYPE REF TO zcl_excel_comment, lo_iterator TYPE REF TO zcl_excel_collection_iterator. CREATE OBJECT r_comments. lo_iterator = comments->get_iterator( ). WHILE lo_iterator->has_next( ) = abap_true. lo_comment ?= lo_iterator->get_next( ). r_comments->include( lo_comment ). ENDWHILE. ENDMETHOD. "get_comments METHOD get_comments_iterator. eo_iterator = comments->get_iterator( ). ENDMETHOD. "get_comments_iterator METHOD get_data_validations_iterator. eo_iterator = me->data_validations->get_iterator( ). ENDMETHOD. "GET_DATA_VALIDATIONS_ITERATOR METHOD get_data_validations_size. ep_size = me->data_validations->size( ). ENDMETHOD. "GET_DATA_VALIDATIONS_SIZE METHOD get_default_column. IF me->column_default IS NOT BOUND. CREATE OBJECT me->column_default EXPORTING ip_index = 'A' " ???? ip_worksheet = me ip_excel = me->excel. ENDIF. eo_column = me->column_default. ENDMETHOD. "GET_DEFAULT_COLUMN METHOD get_default_excel_date_format. CONSTANTS: c_lang_e TYPE lang VALUE 'E'. IF default_excel_date_format IS NOT INITIAL. ep_default_excel_date_format = default_excel_date_format. RETURN. ENDIF. "try to get defaults TRY. cl_abap_datfm=>get_date_format_des( EXPORTING im_langu = c_lang_e IMPORTING ex_dateformat = default_excel_date_format ). CATCH cx_abap_datfm_format_unknown. ENDTRY. " and fallback to fixed format IF default_excel_date_format IS INITIAL. default_excel_date_format = zcl_excel_style_number_format=>c_format_date_ddmmyyyydot. ENDIF. ep_default_excel_date_format = default_excel_date_format. ENDMETHOD. "GET_DEFAULT_EXCEL_DATE_FORMAT METHOD get_default_excel_time_format. DATA: l_timefm TYPE xutimefm. IF default_excel_time_format IS NOT INITIAL. ep_default_excel_time_format = default_excel_time_format. RETURN. ENDIF. * Let's get default l_timefm = cl_abap_timefm=>get_environment_timefm( ). CASE l_timefm. WHEN 0. *0 24 Hour Format (Example: 12:05:10) default_excel_time_format = zcl_excel_style_number_format=>c_format_date_time6. WHEN 1. *1 12 Hour Format (Example: 12:05:10 PM) default_excel_time_format = zcl_excel_style_number_format=>c_format_date_time2. WHEN 2. *2 12 Hour Format (Example: 12:05:10 pm) for now all the same. no chnage upper lower default_excel_time_format = zcl_excel_style_number_format=>c_format_date_time2. WHEN 3. *3 Hours from 0 to 11 (Example: 00:05:10 PM) for now all the same. no chnage upper lower default_excel_time_format = zcl_excel_style_number_format=>c_format_date_time2. WHEN 4. *4 Hours from 0 to 11 (Example: 00:05:10 pm) for now all the same. no chnage upper lower default_excel_time_format = zcl_excel_style_number_format=>c_format_date_time2. WHEN OTHERS. " and fallback to fixed format default_excel_time_format = zcl_excel_style_number_format=>c_format_date_time6. ENDCASE. ep_default_excel_time_format = default_excel_time_format. ENDMETHOD. "GET_DEFAULT_EXCEL_TIME_FORMAT METHOD get_default_row. IF me->row_default IS NOT BOUND. CREATE OBJECT me->row_default. ENDIF. eo_row = me->row_default. ENDMETHOD. "GET_DEFAULT_ROW METHOD get_dimension_range. me->update_dimension_range( ). IF upper_cell EQ lower_cell. "only one cell " Worksheet not filled IF upper_cell-cell_coords IS INITIAL. ep_dimension_range = 'A1'. ELSE. ep_dimension_range = upper_cell-cell_coords. ENDIF. ELSE. CONCATENATE upper_cell-cell_coords ':' lower_cell-cell_coords INTO ep_dimension_range. ENDIF. ENDMETHOD. "GET_DIMENSION_RANGE METHOD get_drawings. DATA: lo_drawing TYPE REF TO zcl_excel_drawing, lo_iterator TYPE REF TO zcl_excel_collection_iterator. CASE ip_type. WHEN zcl_excel_drawing=>type_image. r_drawings = drawings. WHEN zcl_excel_drawing=>type_chart. r_drawings = charts. WHEN space. CREATE OBJECT r_drawings EXPORTING ip_type = ''. lo_iterator = drawings->get_iterator( ). WHILE lo_iterator->has_next( ) = abap_true. lo_drawing ?= lo_iterator->get_next( ). r_drawings->include( lo_drawing ). ENDWHILE. lo_iterator = charts->get_iterator( ). WHILE lo_iterator->has_next( ) = abap_true. lo_drawing ?= lo_iterator->get_next( ). r_drawings->include( lo_drawing ). ENDWHILE. WHEN OTHERS. ENDCASE. ENDMETHOD. "GET_DRAWINGS METHOD get_drawings_iterator. CASE ip_type. WHEN zcl_excel_drawing=>type_image. eo_iterator = drawings->get_iterator( ). WHEN zcl_excel_drawing=>type_chart. eo_iterator = charts->get_iterator( ). ENDCASE. ENDMETHOD. "GET_DRAWINGS_ITERATOR METHOD get_freeze_cell. ep_row = me->freeze_pane_cell_row. ep_column = me->freeze_pane_cell_column. ENDMETHOD. "GET_FREEZE_CELL METHOD get_guid. ep_guid = me->guid. ENDMETHOD. "GET_GUID METHOD get_header_footer_drawings. DATA: ls_odd_header TYPE zexcel_s_worksheet_head_foot, ls_odd_footer TYPE zexcel_s_worksheet_head_foot, ls_even_header TYPE zexcel_s_worksheet_head_foot, ls_even_footer TYPE zexcel_s_worksheet_head_foot, ls_hd_ft TYPE zexcel_s_worksheet_head_foot. FIELD-SYMBOLS: TYPE zexcel_s_drawings. me->sheet_setup->get_header_footer( IMPORTING ep_odd_header = ls_odd_header ep_odd_footer = ls_odd_footer ep_even_header = ls_even_header ep_even_footer = ls_even_footer ). ********************************************************************** *** Odd header ls_hd_ft = ls_odd_header. IF ls_hd_ft-left_image IS NOT INITIAL. APPEND INITIAL LINE TO rt_drawings ASSIGNING . -drawing = ls_hd_ft-left_image. ENDIF. IF ls_hd_ft-right_image IS NOT INITIAL. APPEND INITIAL LINE TO rt_drawings ASSIGNING . -drawing = ls_hd_ft-right_image. ENDIF. IF ls_hd_ft-center_image IS NOT INITIAL. APPEND INITIAL LINE TO rt_drawings ASSIGNING . -drawing = ls_hd_ft-center_image. ENDIF. ********************************************************************** *** Odd footer ls_hd_ft = ls_odd_footer. IF ls_hd_ft-left_image IS NOT INITIAL. APPEND INITIAL LINE TO rt_drawings ASSIGNING . -drawing = ls_hd_ft-left_image. ENDIF. IF ls_hd_ft-right_image IS NOT INITIAL. APPEND INITIAL LINE TO rt_drawings ASSIGNING . -drawing = ls_hd_ft-right_image. ENDIF. IF ls_hd_ft-center_image IS NOT INITIAL. APPEND INITIAL LINE TO rt_drawings ASSIGNING . -drawing = ls_hd_ft-center_image. ENDIF. ********************************************************************** *** Even header ls_hd_ft = ls_even_header. IF ls_hd_ft-left_image IS NOT INITIAL. APPEND INITIAL LINE TO rt_drawings ASSIGNING . -drawing = ls_hd_ft-left_image. ENDIF. IF ls_hd_ft-right_image IS NOT INITIAL. APPEND INITIAL LINE TO rt_drawings ASSIGNING . -drawing = ls_hd_ft-right_image. ENDIF. IF ls_hd_ft-center_image IS NOT INITIAL. APPEND INITIAL LINE TO rt_drawings ASSIGNING . -drawing = ls_hd_ft-center_image. ENDIF. ********************************************************************** *** Even footer ls_hd_ft = ls_even_footer. IF ls_hd_ft-left_image IS NOT INITIAL. APPEND INITIAL LINE TO rt_drawings ASSIGNING . -drawing = ls_hd_ft-left_image. ENDIF. IF ls_hd_ft-right_image IS NOT INITIAL. APPEND INITIAL LINE TO rt_drawings ASSIGNING . -drawing = ls_hd_ft-right_image. ENDIF. IF ls_hd_ft-center_image IS NOT INITIAL. APPEND INITIAL LINE TO rt_drawings ASSIGNING . -drawing = ls_hd_ft-center_image. ENDIF. ENDMETHOD. "get_header_footer_drawings METHOD get_highest_column. me->update_dimension_range( ). r_highest_column = me->lower_cell-cell_column. ENDMETHOD. "GET_HIGHEST_COLUMN METHOD get_highest_row. me->update_dimension_range( ). r_highest_row = me->lower_cell-cell_row. ENDMETHOD. "GET_HIGHEST_ROW METHOD get_hyperlinks_iterator. eo_iterator = hyperlinks->get_iterator( ). ENDMETHOD. "GET_HYPERLINKS_ITERATOR METHOD get_hyperlinks_size. ep_size = hyperlinks->size( ). ENDMETHOD. "GET_HYPERLINKS_SIZE METHOD get_ignored_errors. rt_ignored_errors = mt_ignored_errors. ENDMETHOD. METHOD get_merge. FIELD-SYMBOLS: LIKE LINE OF me->mt_merged_cells. 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. LOOP AT me->mt_merged_cells ASSIGNING . lv_col_from = zcl_excel_common=>convert_column2alpha( -col_from ). lv_col_to = zcl_excel_common=>convert_column2alpha( -col_to ). lv_row_from = -row_from. lv_row_to = -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. ENDLOOP. ENDMETHOD. "GET_MERGE METHOD get_pagebreaks. ro_pagebreaks = mo_pagebreaks. ENDMETHOD. "GET_PAGEBREAKS METHOD get_ranges_iterator. eo_iterator = me->ranges->get_iterator( ). ENDMETHOD. "GET_RANGES_ITERATOR METHOD get_row. eo_row = me->rows->get( ip_index = ip_row ). IF eo_row IS NOT BOUND. eo_row = me->add_new_row( ip_row ). ENDIF. ENDMETHOD. "GET_ROW METHOD get_rows. DATA: row TYPE i. FIELD-SYMBOLS: TYPE zexcel_s_cell_data. IF sheet_content IS NOT INITIAL. row = 0. DO. " Find the next row READ TABLE sheet_content ASSIGNING WITH KEY cell_row = row. CASE sy-subrc. WHEN 4. " row doesn't exist, but it exists another row, SY-TABIX points to the first cell in this row. READ TABLE sheet_content ASSIGNING INDEX sy-tabix. ASSERT sy-subrc = 0. row = -cell_row. WHEN 8. " it was the last available row EXIT. ENDCASE. " This will create the row instance if it doesn't exist get_row( row ). row = row + 1. ENDDO. ENDIF. eo_rows = me->rows. ENDMETHOD. "GET_ROWS METHOD get_rows_iterator. get_rows( ). eo_iterator = me->rows->get_iterator( ). ENDMETHOD. "GET_ROWS_ITERATOR METHOD get_row_outlines. rt_row_outlines = me->mt_row_outlines. ENDMETHOD. "GET_ROW_OUTLINES METHOD get_style_cond. DATA: lo_style_iterator TYPE REF TO zcl_excel_collection_iterator, lo_style_cond TYPE REF TO zcl_excel_style_cond. lo_style_iterator = me->get_style_cond_iterator( ). WHILE lo_style_iterator->has_next( ) = abap_true. lo_style_cond ?= lo_style_iterator->get_next( ). IF lo_style_cond->get_guid( ) = ip_guid. eo_style_cond = lo_style_cond. EXIT. ENDIF. ENDWHILE. ENDMETHOD. "GET_STYLE_COND METHOD get_style_cond_iterator. eo_iterator = styles_cond->get_iterator( ). ENDMETHOD. "GET_STYLE_COND_ITERATOR METHOD get_tabcolor. ev_tabcolor = me->tabcolor. ENDMETHOD. "GET_TABCOLOR METHOD get_table. *--------------------------------------------------------------------* * Comment D. Rauchenstein * With this method, we get a fully functional Excel Upload, which solves * a few issues of the other excel upload tools * ZBCABA_ALSM_EXCEL_UPLOAD_EXT: Reads only up to 50 signs per Cell, Limit * in row-Numbers. Other have Limitations of Lines, or you are not able * to ignore filters or choosing the right tab. * * To get a fully functional XLSX Upload, you can use it e.g. with method * CL_EXCEL_READER_2007->ZIF_EXCEL_READER~LOAD_FILE() *--------------------------------------------------------------------* FIELD-SYMBOLS: TYPE data. FIELD-SYMBOLS: TYPE data. DATA lv_actual_row TYPE int4. DATA lv_actual_row_string TYPE string. DATA lv_actual_col TYPE int4. DATA lv_actual_col_string TYPE string. DATA lv_errormessage TYPE string. DATA lv_max_col TYPE zexcel_cell_column. DATA lv_max_row TYPE int4. DATA lv_delta_col TYPE int4. DATA lv_value TYPE zexcel_cell_value. DATA lv_rc TYPE sysubrc. DATA lx_conversion_error TYPE REF TO cx_sy_conversion_error. DATA lv_float TYPE f. DATA lv_type. DATA lv_tabix TYPE i. lv_max_col = me->get_highest_column( ). IF iv_max_col IS SUPPLIED AND iv_max_col < lv_max_col. lv_max_col = iv_max_col. ENDIF. lv_max_row = me->get_highest_row( ). IF iv_max_row IS SUPPLIED AND iv_max_row < lv_max_row. lv_max_row = iv_max_row. ENDIF. *--------------------------------------------------------------------* * The row counter begins with 1 and should be corrected with the skips *--------------------------------------------------------------------* lv_actual_row = iv_skipped_rows + 1. lv_actual_col = iv_skipped_cols + 1. TRY. *--------------------------------------------------------------------* * Check if we the basic features are possible with given "any table" *--------------------------------------------------------------------* APPEND INITIAL LINE TO et_table ASSIGNING . IF sy-subrc <> 0 OR IS NOT ASSIGNED. lv_errormessage = 'Error at inserting new Line to internal Table'(002). zcx_excel=>raise_text( lv_errormessage ). ELSE. lv_delta_col = lv_max_col - iv_skipped_cols. ASSIGN COMPONENT lv_delta_col OF STRUCTURE TO . IF sy-subrc <> 0 OR IS NOT ASSIGNED. lv_errormessage = 'Internal table has less columns than excel'(003). zcx_excel=>raise_text( lv_errormessage ). ELSE. *--------------------------------------------------------------------* *now we are ready for handle the table data *--------------------------------------------------------------------* CLEAR et_table. *--------------------------------------------------------------------* * Handle each Row until end on right side *--------------------------------------------------------------------* WHILE lv_actual_row <= lv_max_row . *--------------------------------------------------------------------* * Handle each Column until end on bottom * First step is to step back on first column *--------------------------------------------------------------------* lv_actual_col = iv_skipped_cols + 1. UNASSIGN . APPEND INITIAL LINE TO et_table ASSIGNING . IF sy-subrc <> 0 OR IS NOT ASSIGNED. lv_errormessage = 'Error at inserting new Line to internal Table'(002). zcx_excel=>raise_text( lv_errormessage ). ENDIF. WHILE lv_actual_col <= lv_max_col. lv_delta_col = lv_actual_col - iv_skipped_cols. ASSIGN COMPONENT lv_delta_col OF STRUCTURE TO . IF sy-subrc <> 0. lv_actual_col_string = lv_actual_col. lv_actual_row_string = lv_actual_row. CONCATENATE 'Error at assigning field (Col:'(004) lv_actual_col_string ' Row:'(005) lv_actual_row_string INTO lv_errormessage. zcx_excel=>raise_text( lv_errormessage ). ENDIF. me->get_cell( EXPORTING ip_column = lv_actual_col " Cell Column ip_row = lv_actual_row " Cell Row IMPORTING ep_value = lv_value " Cell Value ep_rc = lv_rc " Return Value of ABAP Statements ). IF lv_rc <> 0 AND lv_rc <> 4 "No found error means, zero/no value in cell AND lv_rc <> 8. "rc is 8 when the last row contains cells with zero / no values lv_actual_col_string = lv_actual_col. lv_actual_row_string = lv_actual_row. CONCATENATE 'Error at reading field value (Col:'(007) lv_actual_col_string ' Row:'(005) lv_actual_row_string INTO lv_errormessage. zcx_excel=>raise_text( lv_errormessage ). ENDIF. TRY. DESCRIBE FIELD TYPE lv_type. IF lv_type = 'D'. = zcl_excel_common=>excel_string_to_date( ip_value = lv_value ). ELSE. = lv_value. "Will raise exception if data type of is not float (or decfloat16/34) and excel delivers exponential number e.g. -2.9398924194538267E-2 ENDIF. CATCH cx_sy_conversion_error INTO lx_conversion_error. "Another try with conversion to float... IF lv_type = 'P'. = lv_float = lv_value. ELSE. RAISE EXCEPTION lx_conversion_error. "Pass on original exception ENDIF. ENDTRY. * CATCH zcx_excel. " ADD 1 TO lv_actual_col. ENDWHILE. ADD 1 TO lv_actual_row. ENDWHILE. IF iv_skip_bottom_empty_rows = abap_true. lv_tabix = lines( et_table ). WHILE lv_tabix >= 1. READ TABLE et_table INDEX lv_tabix ASSIGNING . ASSERT sy-subrc = 0. IF IS NOT INITIAL. EXIT. ENDIF. DELETE et_table INDEX lv_tabix. lv_tabix = lv_tabix - 1. ENDWHILE. ENDIF. ENDIF. ENDIF. CATCH cx_sy_assign_cast_illegal_cast. lv_actual_col_string = lv_actual_col. lv_actual_row_string = lv_actual_row. CONCATENATE 'Error at assigning field (Col:'(004) lv_actual_col_string ' Row:'(005) lv_actual_row_string INTO lv_errormessage. zcx_excel=>raise_text( lv_errormessage ). CATCH cx_sy_assign_cast_unknown_type. lv_actual_col_string = lv_actual_col. lv_actual_row_string = lv_actual_row. CONCATENATE 'Error at assigning field (Col:'(004) lv_actual_col_string ' Row:'(005) lv_actual_row_string INTO lv_errormessage. zcx_excel=>raise_text( lv_errormessage ). CATCH cx_sy_assign_out_of_range. lv_errormessage = 'Internal table has less columns than excel'(003). zcx_excel=>raise_text( lv_errormessage ). CATCH cx_sy_conversion_error. lv_actual_col_string = lv_actual_col. lv_actual_row_string = lv_actual_row. CONCATENATE 'Error at converting field value (Col:'(006) lv_actual_col_string ' Row:'(005) lv_actual_row_string INTO lv_errormessage. zcx_excel=>raise_text( lv_errormessage ). ENDTRY. ENDMETHOD. "get_table METHOD get_tables_iterator. eo_iterator = tables->get_iterator( ). ENDMETHOD. "GET_TABLES_ITERATOR METHOD get_tables_size. ep_size = tables->size( ). ENDMETHOD. "GET_TABLES_SIZE METHOD get_title. DATA lv_value TYPE string. IF ip_escaped EQ abap_true. lv_value = me->title. ep_title = zcl_excel_common=>escape_string( lv_value ). ELSE. ep_title = me->title. ENDIF. ENDMETHOD. "GET_TITLE 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. TRY. lo_addit ?= cl_abap_typedescr=>describe_by_data( ip_value ). CATCH cx_sy_move_cast_error. CLEAR lo_addit. ENDTRY. IF lo_addit IS BOUND. lo_addit->get_ddic_field( RECEIVING p_flddescr = ls_dfies EXCEPTIONS not_found = 1 no_ddic_type = 2 OTHERS = 3 ) . IF sy-subrc = 0. ep_value_type = ls_dfies-inttype. IF ls_dfies-convexit IS NOT INITIAL. * We need to convert with output conversion function CONCATENATE 'CONVERSION_EXIT_' ls_dfies-convexit '_OUTPUT' INTO l_function. SELECT SINGLE funcname INTO l_function FROM tfdir WHERE funcname = l_function. IF sy-subrc = 0. CALL FUNCTION l_function EXPORTING input = ip_value IMPORTING output = l_value EXCEPTIONS OTHERS = 1. IF sy-subrc <> 0. ELSE. TRY. ep_value = l_value. CATCH cx_root. ep_value = ip_value. ENDTRY. ENDIF. ENDIF. ENDIF. ELSE. ep_value_type = lo_addit->get_data_type_kind( ip_value ). ENDIF. ENDIF. ENDMETHOD. "GET_VALUE_TYPE METHOD is_cell_merged. DATA: lv_column TYPE i. FIELD-SYMBOLS: LIKE LINE OF me->mt_merged_cells. lv_column = zcl_excel_common=>convert_column2int( ip_column ). rp_is_merged = abap_false. " Assume not in merged area LOOP AT me->mt_merged_cells ASSIGNING . IF -col_from <= lv_column AND -col_to >= lv_column AND -row_from <= ip_row AND -row_to >= ip_row. rp_is_merged = abap_true. " until we are proven different RETURN. ENDIF. ENDLOOP. ENDMETHOD. "IS_CELL_MERGED METHOD move_supplied_borders. DATA: ls_borderx TYPE zexcel_s_cstylex_border. IF iv_border_supplied = abap_true. " only act if parameter was supplied IF iv_xborder_supplied = abap_true. " ls_borderx = is_xborder. " use supplied x-parameter ELSE. CLEAR ls_borderx WITH 'X'. " <============================== DDIC structure enh. category to set? " clear in a way that would be expected to work easily IF is_border-border_style IS INITIAL. CLEAR ls_borderx-border_style. ENDIF. clear_initial_colorxfields( EXPORTING is_color = is_border-border_color CHANGING cs_xcolor = ls_borderx-border_color ). ENDIF. MOVE-CORRESPONDING is_border TO cs_complete_style_border. MOVE-CORRESPONDING ls_borderx TO cs_complete_stylex_border. ENDIF. ENDMETHOD. METHOD normalize_column_heading_texts. DATA: lt_field_catalog TYPE zexcel_t_fieldcatalog, lv_value_lowercase TYPE string, lv_scrtext_l_initial TYPE zexcel_column_name, lv_long_text TYPE string, lv_max_length TYPE i, lv_temp_length TYPE i, lv_syindex TYPE c LENGTH 3, lt_column_name_buffer TYPE SORTED TABLE OF string WITH UNIQUE KEY table_line. FIELD-SYMBOLS: TYPE zexcel_s_fieldcatalog, TYPE any, TYPE any, TYPE any. " Due to restrictions in new table object we cannot have two columns with the same name " Check if a column with the same name exists, if exists add a counter " If no medium description is provided we try to use small or long lt_field_catalog = it_field_catalog. LOOP AT lt_field_catalog ASSIGNING WHERE dynpfld EQ abap_true. IF -column_name IS INITIAL. CASE iv_default_descr. WHEN 'M'. ASSIGN -scrtext_m TO . ASSIGN -scrtext_s TO . ASSIGN -scrtext_l TO . WHEN 'S'. ASSIGN -scrtext_s TO . ASSIGN -scrtext_m TO . ASSIGN -scrtext_l TO . WHEN 'L'. ASSIGN -scrtext_l TO . ASSIGN -scrtext_m TO . ASSIGN -scrtext_s TO . WHEN OTHERS. ASSIGN -scrtext_m TO . ASSIGN -scrtext_s TO . ASSIGN -scrtext_l TO . ENDCASE. IF IS NOT INITIAL. -column_name = . ELSEIF IS NOT INITIAL. -column_name = . ELSEIF IS NOT INITIAL. -column_name = . ELSE. -column_name = 'Column'. " default value as Excel does ENDIF. ENDIF. lv_scrtext_l_initial = -column_name. DESCRIBE FIELD -column_name LENGTH lv_max_length IN CHARACTER MODE. DO. lv_value_lowercase = -column_name. TRANSLATE lv_value_lowercase TO LOWER CASE. READ TABLE lt_column_name_buffer TRANSPORTING NO FIELDS WITH KEY table_line = lv_value_lowercase BINARY SEARCH. IF sy-subrc <> 0. INSERT lv_value_lowercase INTO TABLE lt_column_name_buffer. EXIT. ELSE. lv_syindex = sy-index. CONCATENATE lv_scrtext_l_initial lv_syindex INTO lv_long_text. IF strlen( lv_long_text ) <= lv_max_length. -column_name = lv_long_text. ELSE. lv_temp_length = strlen( lv_scrtext_l_initial ) - 1. lv_scrtext_l_initial = substring( val = lv_scrtext_l_initial len = lv_temp_length ). CONCATENATE lv_scrtext_l_initial lv_syindex INTO -column_name. ENDIF. ENDIF. ENDDO. ENDLOOP. result = lt_field_catalog. ENDMETHOD. METHOD normalize_columnrow_parameter. IF ( ( ip_column IS NOT INITIAL OR ip_row IS NOT INITIAL ) AND ip_columnrow IS NOT INITIAL ) 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 normalize_style_parameter. DATA: lo_style_type TYPE REF TO cl_abap_typedescr. FIELD-SYMBOLS: