diff --git a/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk b/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk index 63436f0..a9eb9c6 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk @@ -1,5 +1,5 @@ - + class ZCL_EXCEL_COMMON definition public final @@ -9,16 +9,13 @@ *"* do not include other source files here!!! public section. + constants C_EXCEL_BASELINE_DATE type D value '19000101'. "#EC NOTEXT class-data C_EXCEL_NUMFMT_OFFSET type INT1 value 164. "#EC NOTEXT . + constants C_EXCEL_SHEET_MAX_COL type INT4 value 16384. "#EC NOTEXT + constants C_EXCEL_SHEET_MIN_COL type INT4 value 1. "#EC NOTEXT class-data C_SPRAS_EN type SPRAS value 'E'. "#EC NOTEXT . class-data O_CONV type ref to CL_ABAP_CONV_OUT_CE . - constants C_EXCEL_BASELINE_DATE type D value '19000101'. "#EC NOTEXT - class-methods GET_FIELDCATALOG - importing - !IP_TABLE type STANDARD TABLE - returning - value(EP_FIELDCATALOG) type ZEXCEL_T_FIELDCATALOG . class-methods CONVERT_COLUMN2ALPHA importing !IP_COLUMN type ZEXCEL_CELL_COLUMN @@ -29,32 +26,27 @@ public section. !IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA returning value(EP_COLUMN) type ZEXCEL_CELL_COLUMN . - class-methods NUMBER_TO_EXCEL_STRING + class-methods CONVERT_COLUMNROW2COLUMN_A_ROW importing - value(IP_VALUE) type NUMERIC - returning - value(EP_VALUE) type ZEXCEL_CELL_VALUE . + !I_COLUMNROW type STRING + exporting + !E_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA + !E_ROW type ZEXCEL_CELL_ROW . class-methods DATE_TO_EXCEL_STRING importing !IP_VALUE type D returning value(EP_VALUE) type ZEXCEL_CELL_VALUE . - class-methods TIME_TO_EXCEL_STRING - importing - !IP_VALUE type T - returning - value(EP_VALUE) type ZEXCEL_CELL_VALUE . class-methods ENCRYPT_PASSWORD importing !I_PWD type ZEXCEL_AES_PASSWORD returning value(R_ENCRYPTED_PWD) type ZEXCEL_AES_PASSWORD . - class-methods CONVERT_COLUMNROW2COLUMN_A_ROW + class-methods ESCAPE_STRING importing - !I_COLUMNROW type STRING - exporting - !E_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA - !E_ROW type ZEXCEL_CELL_ROW . + !IP_VALUE type STRING + returning + value(EP_ESCAPED_VALUE) type STRING . class-methods EXCEL_STRING_TO_DATE importing !IP_VALUE type ZEXCEL_CELL_VALUE @@ -64,7 +56,22 @@ public section. importing !IP_VALUE type ZEXCEL_CELL_VALUE returning - value(EP_VALUE) type T . + value(EP_VALUE) type T . + class-methods GET_FIELDCATALOG + importing + !IP_TABLE type STANDARD TABLE + returning + value(EP_FIELDCATALOG) type ZEXCEL_T_FIELDCATALOG . + class-methods NUMBER_TO_EXCEL_STRING + importing + value(IP_VALUE) type NUMERIC + returning + value(EP_VALUE) type ZEXCEL_CELL_VALUE . + class-methods TIME_TO_EXCEL_STRING + importing + !IP_VALUE type T + returning + value(EP_VALUE) type ZEXCEL_CELL_VALUE . *"* protected components of class ZCL_EXCEL_COMMON *"* do not include other source files here!!! protected section. @@ -97,222 +104,16 @@ private section. *"* implementation or private method's signature *"* use this source file for any macro definitions you need *"* in the implementation part of the class - *----------------------------------------------------------------------* -* CLASS zcl_Excel_Common_Test DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS zcl_excel_common_test DEFINITION FOR TESTING. "#AU Risk_Level Harmless - "#AU Duration Short -*?#<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> -*?<asx:values> -*?<TESTCLASS_OPTIONS> -*?<TEST_CLASS>zcl_Excel_Common_Test -*?</TEST_CLASS> -*?<TEST_MEMBER>f_Cut -*?</TEST_MEMBER> -*?<OBJECT_UNDER_TEST>ZCL_EXCEL_COMMON -*?</OBJECT_UNDER_TEST> -*?<OBJECT_IS_LOCAL/> -*?<GENERATE_FIXTURE/> -*?<GENERATE_CLASS_FIXTURE/> -*?<GENERATE_INVOCATION>X -*?</GENERATE_INVOCATION> -*?<GENERATE_ASSERT_EQUAL>X -*?</GENERATE_ASSERT_EQUAL> -*?</TESTCLASS_OPTIONS> -*?</asx:values> -*?</asx:abap> - PRIVATE SECTION. -* ================ - DATA: - f_cut TYPE REF TO zcl_excel_common. "class under test - - METHODS: convert_columnrow2column_a_row FOR TESTING. - METHODS: date_conversions FOR TESTING. - METHODS: time_conversions FOR TESTING. -ENDCLASS. "zcl_Excel_Common_Test - - -*----------------------------------------------------------------------* -* CLASS zcl_Excel_Common_Test IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS zcl_excel_common_test IMPLEMENTATION. -* =========================================== - - METHOD convert_columnrow2column_a_row. -* ====================================== - DATA i_columnrow TYPE string VALUE 'AB344'. - DATA e_column TYPE zexcel_cell_column_alpha. - DATA e_row TYPE zexcel_cell_row. - - zcl_excel_common=>convert_columnrow2column_a_row( - EXPORTING - i_columnrow = i_columnrow - IMPORTING - e_column = e_column - e_row = e_row - ). - - cl_aunit_assert=>assert_equals( - act = e_column - exp = 'AB' - msg = 'Testing value e_Column' -* level = - ). - cl_aunit_assert=>assert_equals( - act = e_row - exp = 344 - msg = 'Testing value e_Row' -* level = - ). - - i_columnrow = 'B3'. - - zcl_excel_common=>convert_columnrow2column_a_row( - EXPORTING - i_columnrow = i_columnrow - IMPORTING - e_column = e_column - e_row = e_row - ). - - cl_aunit_assert=>assert_equals( - act = e_column - exp = 'B' - msg = 'Testing value e_Column' -* level = - ). - cl_aunit_assert=>assert_equals( - act = e_row - exp = 3 - msg = 'Testing value e_Row' -* level = - ). - ENDMETHOD. "convert_Columnrow2column_A_Row - - METHOD date_conversions. - DATA: lv_date TYPE d, - lv_cell TYPE zexcel_cell_value. - -* test date conversions. Expected values generated using Excel 2010 - - lv_date = '20100101'. - lv_cell = zcl_excel_common=>date_to_excel_string( lv_date ). - cl_aunit_assert=>assert_equals( - act = lv_cell - exp = '40179' - msg = 'Wrong date conversion' ). - - lv_date = zcl_excel_common=>excel_string_to_date( lv_cell ). - cl_aunit_assert=>assert_equals( - act = lv_date - exp = '20100101' - msg = 'Wrong date conversion' ). - - lv_date = '20080229'. - lv_cell = zcl_excel_common=>date_to_excel_string( lv_date ). - cl_aunit_assert=>assert_equals( - act = lv_cell - exp = '39507' - msg = 'Wrong date conversion' ). - - lv_date = zcl_excel_common=>excel_string_to_date( lv_cell ). - cl_aunit_assert=>assert_equals( - act = lv_date - exp = '20080229' - msg = 'Wrong date conversion' ). - - lv_date = '19991231'. - lv_cell = zcl_excel_common=>date_to_excel_string( lv_date ). - cl_aunit_assert=>assert_equals( - act = lv_cell - exp = '36525' - msg = 'Wrong date conversion' ). - - lv_date = zcl_excel_common=>excel_string_to_date( lv_cell ). - cl_aunit_assert=>assert_equals( - act = lv_date - exp = '19991231' - msg = 'Wrong date conversion' ). - ENDMETHOD. "date_conversions - - METHOD time_conversions. - DATA: lv_time TYPE t, - lv_cell TYPE zexcel_cell_value, - lv_value TYPE f. - -* test time conversions. Expected values generated using Excel 2010 - - lv_time = '000000'. - lv_value = zcl_excel_common=>time_to_excel_string( lv_time ). - cl_aunit_assert=>assert_equals_f( - act = lv_value - exp = 0 - msg = 'Wrong time conversion' ). - - lv_cell = lv_value. - lv_time = zcl_excel_common=>excel_string_to_time( lv_cell ). - cl_aunit_assert=>assert_equals( - act = lv_time - exp = '000000' - msg = 'Wrong time conversion' ). - - lv_time = '090909'. - lv_value = zcl_excel_common=>time_to_excel_string( lv_time ). - cl_aunit_assert=>assert_equals_f( - act = lv_value - exp = '0.38135416666666666' - msg = 'Wrong time conversion' ). - - lv_cell = lv_value. - lv_time = zcl_excel_common=>excel_string_to_time( lv_cell ). - cl_aunit_assert=>assert_equals( - act = lv_time - exp = '090909' - msg = 'Wrong time conversion' ). - - lv_time = '120000'. - lv_value = zcl_excel_common=>time_to_excel_string( lv_time ). - cl_aunit_assert=>assert_equals_f( - act = lv_value - exp = '0.5' - msg = 'Wrong time conversion' ). - - lv_cell = lv_value. - lv_time = zcl_excel_common=>excel_string_to_time( lv_cell ). - cl_aunit_assert=>assert_equals( - act = lv_time - exp = '120000' - msg = 'Wrong time conversion' ). - - lv_time = '235959'. - lv_value = zcl_excel_common=>time_to_excel_string( lv_time ). - cl_aunit_assert=>assert_equals_f( - act = lv_value - exp = '0.99998842592592585' - msg = 'Wrong time conversion' ). - - lv_cell = lv_value. - lv_time = zcl_excel_common=>excel_string_to_time( lv_cell ). - cl_aunit_assert=>assert_equals( - act = lv_time - exp = '235959' - msg = 'Wrong time conversion' ). - ENDMETHOD. "time_conversions -ENDCLASS. "zcl_Excel_Common_Test - - - - - - - - - - + + + + + + + + + + method CHAR2HEX. IF o_conv IS NOT BOUND. @@ -326,11 +127,10 @@ ENDCLASS. "zcl_Excel_Common_Test r_hex+1 = o_conv->get_buffer( ). " x'65' must be x'0065' endmethod. - - - - + + + method CONVERT_COLUMN2ALPHA. DATA: lo_conv TYPE REF TO cl_abap_conv_in_ce, @@ -351,11 +151,10 @@ endmethod. ENDWHILE. endmethod. - - - - + + + method CONVERT_COLUMN2INT. DATA: lv_uccpi TYPE i, @@ -382,12 +181,11 @@ endmethod. ENDIF. endmethod. - - - - - + + + + method CONVERT_COLUMNROW2COLUMN_A_ROW. DATA: width TYPE i, col_width TYPE i, @@ -403,23 +201,21 @@ endmethod. row_str = i_columnrow+col_width(width). e_row = row_str. endmethod. - - - - - METHOD date_to_excel_string. + + + + method DATE_TO_EXCEL_STRING. DATA: lv_date_diff TYPE i. CHECK ip_value IS NOT INITIAL. lv_date_diff = ip_value - c_excel_baseline_date + 2. ep_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_date_diff ). -ENDMETHOD. - +endmethod. - - - + + + method ENCRYPT_PASSWORD. DATA lv_curr_offset TYPE i. @@ -458,12 +254,18 @@ ENDMETHOD. WRITE lv_pwd_hash TO r_encrypted_pwd. endmethod. - - - - - METHOD excel_string_to_date. + + + + METHOD escape_string. + CONCATENATE `'` ip_value `'` INTO ep_escaped_value. +ENDMETHOD. + + + + + method EXCEL_STRING_TO_DATE. DATA: lv_date_int TYPE i. TRY . @@ -472,13 +274,12 @@ endmethod. CATCH cx_sy_conversion_error. CLEAR ep_value. ENDTRY. -ENDMETHOD. - +endmethod. - - - - METHOD excel_string_to_time. + + + + method EXCEL_STRING_TO_TIME. DATA: lv_seconds_in_day TYPE i, lv_day_fraction TYPE f, lc_seconds_in_day TYPE i VALUE 86400. @@ -493,12 +294,11 @@ lc_seconds_in_day TYPE i VALUE 86400. CATCH cx_sy_conversion_error. CLEAR ep_value. ENDTRY. -ENDMETHOD. - +endmethod. - - - + + + method GET_FIELDCATALOG. DATA: lr_data TYPE REF TO data, @@ -522,11 +322,10 @@ ENDMETHOD. ENDLOOP. endmethod. - - - - + + + method NUMBER_TO_EXCEL_STRING. DATA: lv_value_c TYPE c LENGTH 100. @@ -540,11 +339,10 @@ endmethod. CONCATENATE '-' ep_value INTO ep_value. ENDIF. endmethod. - - - - + + + method SHL01. DATA: @@ -561,11 +359,10 @@ endmethod. SET BIT 16 OF r_pwd_hash TO 0. endmethod. - - - - + + + method SHR14. DATA: @@ -589,11 +386,10 @@ endmethod. ENDDO. endmethod. - - - - + + + method TIME_TO_EXCEL_STRING. DATA: lv_seconds_in_day TYPE i, lv_day_fraction TYPE f, @@ -604,6 +400,5 @@ endmethod. lv_day_fraction = lv_seconds_in_day / lc_seconds_in_day. ep_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_day_fraction ). endmethod. - diff --git a/ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATION.slnk b/ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATION.slnk index 637733a..643b6f1 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATION.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_DATA_VALIDATION.slnk @@ -1,5 +1,5 @@ - + class ZCL_EXCEL_DATA_VALIDATION definition public final @@ -11,13 +11,16 @@ public section. type-pools ABAP . data ALLOWBLANK type FLAG value 'X'. "#EC NOTEXT . + data CELL_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA . + data CELL_COLUMN_TO type ZEXCEL_CELL_COLUMN_ALPHA . data CELL_ROW type ZEXCEL_CELL_ROW . - class-data C_TYPE_LIST type ZEXCEL_DATA_VAL_TYPE value 'list'. "#EC NOTEXT . + data CELL_ROW_TO type ZEXCEL_CELL_ROW . + constants C_CUSTOM type ZEXCEL_DATA_VAL_TYPE value 'custom'. "#EC NOTEXT + constants C_TYPE_LIST type ZEXCEL_DATA_VAL_TYPE value 'list'. "#EC NOTEXT data SHOWERRORMESSAGE type FLAG value 'X'. "#EC NOTEXT . data SHOWINPUTMESSAGE type FLAG value 'X'. "#EC NOTEXT . data TYPE type ZEXCEL_DATA_VAL_TYPE . data VALUE type ZEXCEL_VALIDATION_FORMULA1 . - data CELL_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA . methods CONSTRUCTOR . *"* protected components of class ZCL_EXCEL_DATA_VALIDATION @@ -36,15 +39,18 @@ private section. *"* in the implementation part of the class ABAP - - - - - - - - - + + + + + + + + + + + + method CONSTRUCTOR. type = me->c_type_list. diff --git a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk index ef3130b..bba6d3a 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk @@ -1,5 +1,6 @@ + class ZCL_EXCEL_WORKSHEET definition public @@ -11,6 +12,7 @@ public section. type-pools ABAP . + interfaces ZIF_EXCEL_SHEET_PROPERTIES . interfaces ZIF_EXCEL_SHEET_PROTECTION . constants C_BREAK_COLUMN type ZEXCEL_BREAK value 2. "#EC NOTEXT @@ -62,7 +64,9 @@ public section. importing !IP_TABLE type STANDARD TABLE !IT_FIELD_CATALOG type ZEXCEL_T_FIELDCATALOG optional - !IS_TABLE_SETTINGS type ZEXCEL_S_TABLE_SETTINGS optional . + !IS_TABLE_SETTINGS type ZEXCEL_S_TABLE_SETTINGS optional + exporting + !ES_TABLE_SETTINGS type ZEXCEL_S_TABLE_SETTINGS . methods CALCULATE_COLUMN_WIDTHS . methods CONSTRUCTOR importing @@ -409,6 +413,20 @@ endclass. + + METHOD zif_excel_sheet_properties~get_style. + ep_style = zif_excel_sheet_properties~style. +ENDMETHOD. + + + method ZIF_EXCEL_SHEET_PROPERTIES~INITIALIZE. +endmethod. + + + METHOD zif_excel_sheet_properties~set_style. + zif_excel_sheet_properties~style = ip_style. +ENDMETHOD. + method ZIF_EXCEL_SHEET_PROTECTION~INITIALIZE. @@ -2550,6 +2568,7 @@ endmethod. + METHOD bind_table. DATA: @@ -2591,11 +2610,11 @@ endmethod. ls_settings-top_left_row = lc_top_left_row. ENDIF. - if it_field_catalog is not supplied. + IF it_field_catalog IS NOT SUPPLIED. lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = ip_table ). - else. + ELSE. lt_field_catalog = it_field_catalog. - endif. + ENDIF. CREATE OBJECT lo_table. lo_table->settings = ls_settings. @@ -2677,6 +2696,11 @@ endmethod. " Set field catalog lo_table->fieldcat = lt_field_catalog[]. + es_table_settings = ls_settings. + es_table_settings-bottom_right_column = lv_column_alpha. + es_table_settings-bottom_right_row = ls_settings-top_left_row + lv_rows + 1. "Last rows + + ENDMETHOD. @@ -2744,8 +2768,8 @@ endmethod. - method CONSTRUCTOR. - DATA: lv_title TYPE ZEXCEL_SHEET_TITLE. + METHOD constructor. + DATA: lv_title TYPE zexcel_sheet_title. me->excel = ip_excel. @@ -2769,6 +2793,7 @@ endmethod. CREATE OBJECT tables. CREATE OBJECT drawings. me->zif_excel_sheet_protection~initialize( ). + me->zif_excel_sheet_properties~initialize( ). CREATE OBJECT hyperlinks. * initialize active cell coordinates @@ -2780,7 +2805,7 @@ endmethod. lower_cell-cell_column = 1. upper_cell-cell_row = 1. upper_cell-cell_column = 1. -endmethod. +ENDMETHOD. method DELETE_MERGE. diff --git a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk index 3d68f27..b93fde7 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk @@ -1582,7 +1582,7 @@ endmethod. - method CREATE_XL_SHEET. + METHOD create_xl_sheet. ** Constant node name DATA: lc_xml_node_worksheet TYPE string VALUE 'worksheet', @@ -1720,38 +1720,39 @@ endmethod. lo_iterator TYPE REF TO cl_object_collection_iterator, lo_style_conditional TYPE REF TO zcl_excel_style_conditional, lo_data_validation TYPE REF TO zcl_excel_data_validation, - lo_table TYPE REF TO zcl_excel_table. - - DATA: lv_value TYPE string, - t_range_merge TYPE string_table, - lv_merge TYPE string, - lv_column_p TYPE zexcel_cell_column_alpha, - lv_column TYPE zexcel_cell_column, - lv_flag TYPE c, - lt_percent_val TYPE TABLE OF string, - ls_percent_val TYPE string, - lv_cell_row_s TYPE string, - ls_last_row TYPE zexcel_s_cell_data, - ls_style_mapping TYPE zexcel_s_styles_mapping, - lv_freeze_cell_row TYPE zexcel_cell_row, - lv_freeze_cell_column TYPE zexcel_cell_column, - lv_freeze_cell_column_alpha TYPE zexcel_cell_column_alpha, - lv_relation_id TYPE i VALUE 0. - - DATA: default_col_dimension TYPE REF TO zcl_excel_worksheet_columndime, + lo_table TYPE REF TO zcl_excel_table, + row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi, + default_col_dimension TYPE REF TO zcl_excel_worksheet_columndime, default_row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. + DATA: lv_value TYPE string, + t_range_merge TYPE string_table, + lv_merge TYPE string, + lv_column_p TYPE zexcel_cell_column_alpha, + lv_column TYPE zexcel_cell_column, + lv_style_guid TYPE zexcel_cell_style, + lv_flag TYPE c, + lt_percent_val TYPE TABLE OF string, + ls_percent_val TYPE string, + lv_cell_row_s TYPE string, + ls_last_row TYPE zexcel_s_cell_data, + ls_style_mapping TYPE zexcel_s_styles_mapping, + lv_freeze_cell_row TYPE zexcel_cell_row, + lv_freeze_cell_column TYPE zexcel_cell_column, + lv_freeze_cell_column_alpha TYPE zexcel_cell_column_alpha, + column_dimensions TYPE zexcel_t_worksheet_columndime, + row_dimensions TYPE zexcel_t_worksheet_rowdimensio, + lv_relation_id TYPE i VALUE 0, + outline_level_row TYPE i VALUE 0, + outline_level_col TYPE i VALUE 0, + col_count TYPE int4, + write_current_row TYPE boolean. + FIELD-SYMBOLS: <ls_sheet_content> TYPE zexcel_s_cell_data, - <fs_range_merge> LIKE LINE OF t_range_merge. - DATA: column_dimensions TYPE zexcel_t_worksheet_columndime. - FIELD-SYMBOLS: <column_dimension> LIKE LINE OF column_dimensions. - DATA: row_dimensions TYPE zexcel_t_worksheet_rowdimensio. - FIELD-SYMBOLS: <row_dimension> LIKE LINE OF row_dimensions. - DATA: outline_level_row TYPE i VALUE 0, - outline_level_col TYPE i VALUE 0. - DATA: col_count TYPE int4. - DATA: row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi. - DATA: write_current_row TYPE boolean. + <fs_range_merge> LIKE LINE OF t_range_merge, + <column_dimension> TYPE zexcel_s_worksheet_columndime, + <row_dimension> TYPE zexcel_s_worksheet_rowdimensio. + ********************************************************************** * STEP 1: Create [Content_Types].xml into the root of the ZIP lo_ixml = cl_ixml=>create( ). @@ -1950,74 +1951,101 @@ endmethod. value = lv_value ). lo_element_root->append_child( new_child = lo_element ). " sheetFormatPr node - " cols node - IF NOT column_dimensions IS INITIAL. + + IF io_worksheet->zif_excel_sheet_properties~get_style( ) IS NOT INITIAL OR NOT column_dimensions IS INITIAL. + " cols node lo_element = lo_document->create_simple_element( name = lc_xml_node_cols parent = lo_document ). - LOOP AT column_dimensions ASSIGNING <column_dimension>. - " col node - lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_col - parent = lo_document ). - lv_value = <column_dimension>-column_dimension->get_column_index( ). - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element_2->set_attribute_ns( name = lc_xml_attr_min - value = lv_value ). - lo_element_2->set_attribute_ns( name = lc_xml_attr_max - value = lv_value ). - " Width - IF <column_dimension>-column_dimension->get_width( ) < 0. - lo_element_2->set_attribute_ns( name = lc_xml_attr_width - value = lc_xml_attr_defaultwidth ). - ELSE. - lv_value = <column_dimension>-column_dimension->get_width( ). - lo_element_2->set_attribute_ns( name = lc_xml_attr_width + " This code have to be enhanced in order to manage also column style properties + " Now it is an out/out + IF NOT column_dimensions IS INITIAL. + LOOP AT column_dimensions ASSIGNING <column_dimension>. + " col node + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_col + parent = lo_document ). + lv_value = <column_dimension>-column_dimension->get_column_index( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_min value = lv_value ). - ENDIF. - " Column visibility - IF <column_dimension>-column_dimension->get_visible( ) = abap_false. - lo_element_2->set_attribute_ns( name = lc_xml_attr_hidden - value = lc_xml_attr_true ). - ENDIF. - " Auto size? - IF <column_dimension>-column_dimension->get_auto_size( ) = abap_true. - lo_element_2->set_attribute_ns( name = lc_xml_attr_bestfit - value = lc_xml_attr_true ). - ENDIF. - " Custom width? - IF default_col_dimension IS BOUND. - IF <column_dimension>-column_dimension->get_width( ) - <> default_col_dimension->get_width( ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_max + value = lv_value ). + " Width + IF <column_dimension>-column_dimension->get_width( ) < 0. + lo_element_2->set_attribute_ns( name = lc_xml_attr_width + value = lc_xml_attr_defaultwidth ). + ELSE. + lv_value = <column_dimension>-column_dimension->get_width( ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_width + value = lv_value ). + ENDIF. + " Column visibility + IF <column_dimension>-column_dimension->get_visible( ) = abap_false. + lo_element_2->set_attribute_ns( name = lc_xml_attr_hidden + value = lc_xml_attr_true ). + ENDIF. + " Auto size? + IF <column_dimension>-column_dimension->get_auto_size( ) = abap_true. + lo_element_2->set_attribute_ns( name = lc_xml_attr_bestfit + value = lc_xml_attr_true ). + ENDIF. + " Custom width? + IF default_col_dimension IS BOUND. + IF <column_dimension>-column_dimension->get_width( ) + <> default_col_dimension->get_width( ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_customwidth + value = lc_xml_attr_true ). + + ENDIF. + ELSE. lo_element_2->set_attribute_ns( name = lc_xml_attr_customwidth value = lc_xml_attr_true ). - ENDIF. - ELSE. - lo_element_2->set_attribute_ns( name = lc_xml_attr_customwidth - value = lc_xml_attr_true ). - ENDIF. - " Collapsed - IF <column_dimension>-column_dimension->get_collapsed( ) = abap_true. - lo_element_2->set_attribute_ns( name = lc_xml_attr_collapsed - value = lc_xml_attr_true ). - ENDIF. - " outlineLevel - IF <column_dimension>-column_dimension->get_outline_level( ) > 0. - lv_value = <column_dimension>-column_dimension->get_outline_level( ). - lo_element_2->set_attribute_ns( name = lc_xml_attr_outlinelevel + " Collapsed + IF <column_dimension>-column_dimension->get_collapsed( ) = abap_true. + lo_element_2->set_attribute_ns( name = lc_xml_attr_collapsed + value = lc_xml_attr_true ). + ENDIF. + " outlineLevel + IF <column_dimension>-column_dimension->get_outline_level( ) > 0. + lv_value = <column_dimension>-column_dimension->get_outline_level( ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_outlinelevel + value = lv_value ). + ENDIF. + " Style + lv_value = <column_dimension>-column_dimension->get_xf_index( ). + SHIFT lv_value RIGHT DELETING TRAILING space. + SHIFT lv_value LEFT DELETING LEADING space. + lo_element_2->set_attribute_ns( name = lc_xml_attr_style value = lv_value ). - ENDIF. - " Style - lv_value = <column_dimension>-column_dimension->get_xf_index( ). - SHIFT lv_value RIGHT DELETING TRAILING space. - SHIFT lv_value LEFT DELETING LEADING space. - lo_element_2->set_attribute_ns( name = lc_xml_attr_style - value = lv_value ). - lo_element->append_child( new_child = lo_element_2 ). " col node - ENDLOOP. + lo_element->append_child( new_child = lo_element_2 ). " col node + ENDLOOP. + ELSE. + IF io_worksheet->zif_excel_sheet_properties~get_style( ) IS NOT INITIAL. + lo_element_2 = lo_document->create_simple_element( name = lc_xml_node_col + parent = lo_document ). + lv_value = zcl_excel_common=>c_excel_sheet_min_col. + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_min + value = lv_value ). + lv_value = zcl_excel_common=>c_excel_sheet_max_col. + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_max + value = lv_value ). + lo_element_2->set_attribute_ns( name = lc_xml_attr_width + value = lc_xml_attr_defaultwidth ). + lv_style_guid = io_worksheet->zif_excel_sheet_properties~get_style( ). + READ TABLE styles_mapping INTO ls_style_mapping WITH KEY guid = lv_style_guid. + lv_value = ls_style_mapping-style. + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_style + value = lv_value ). + lo_element->append_child( new_child = lo_element_2 ). " col node + ENDIF. + ENDIF. + lo_element_root->append_child( new_child = lo_element ). " cols node ENDIF. - lo_element_root->append_child( new_child = lo_element ). " cols node " sheetData node lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetdata parent = lo_document ). @@ -2128,6 +2156,84 @@ endmethod. ENDLOOP. lo_element_root->append_child( new_child = lo_element ). " sheetData node + + IF io_worksheet->zif_excel_sheet_protection~protected EQ abap_true. + " pageMargins node + lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetprotection + parent = lo_document ). + MOVE io_worksheet->zif_excel_sheet_protection~password TO lv_value. + IF lv_value IS NOT INITIAL. + lo_element->set_attribute_ns( name = lc_xml_attr_password + value = lv_value ). + ENDIF. + lv_value = io_worksheet->zif_excel_sheet_protection~auto_filter. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_autofilter + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~delete_columns. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_deletecolumns + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~delete_rows. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_deleterows + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~format_cells. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_formatcells + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~format_columns. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_formatcolumns + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~format_rows. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_formatrows + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~insert_columns. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_insertcolumns + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~insert_hyperlinks. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_inserthyperlinks + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~insert_rows. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_insertrows + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~objects. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_objects + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~pivot_tables. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_pivottables + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~scenarios. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_scenarios + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~select_locked_cells. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_selectlockedcells + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~select_unlocked_cells. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_selectunlockedcell + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~sheet. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_sheet + value = lv_value ). + lv_value = io_worksheet->zif_excel_sheet_protection~sort. + CONDENSE lv_value NO-GAPS. + lo_element->set_attribute_ns( name = lc_xml_attr_sort + value = lv_value ). + + lo_element_root->append_child( new_child = lo_element ). + ENDIF. + " Conditional formatting node lo_iterator = io_worksheet->get_cond_styles_iterator( ). WHILE lo_iterator->if_object_collection_iterator~has_next( ) EQ abap_true. @@ -2270,9 +2376,13 @@ endmethod. lo_element_2->set_attribute_ns( name = lc_xml_attr_showerrormessage value = lv_value ). lv_cell_row_s = lo_data_validation->cell_row. - SHIFT lv_cell_row_s RIGHT DELETING TRAILING space. - SHIFT lv_cell_row_s LEFT DELETING LEADING space. + CONDENSE lv_cell_row_s. CONCATENATE lo_data_validation->cell_column lv_cell_row_s INTO lv_value. + IF lo_data_validation->cell_row_to IS NOT INITIAL. + lv_cell_row_s = lo_data_validation->cell_row_to. + CONDENSE lv_cell_row_s. + CONCATENATE lv_value ':' lo_data_validation->cell_column_to lv_cell_row_s INTO lv_value. + ENDIF. lo_element_2->set_attribute_ns( name = lc_xml_attr_sqref value = lv_value ). " formula1 node @@ -2306,83 +2416,6 @@ endmethod. ENDLOOP. ENDIF. - IF io_worksheet->zif_excel_sheet_protection~protected EQ abap_true. - " pageMargins node - lo_element = lo_document->create_simple_element( name = lc_xml_node_sheetprotection - parent = lo_document ). - MOVE io_worksheet->zif_excel_sheet_protection~password TO lv_value. - IF lv_value IS NOT INITIAL. - lo_element->set_attribute_ns( name = lc_xml_attr_password - value = lv_value ). - ENDIF. - lv_value = io_worksheet->zif_excel_sheet_protection~auto_filter. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_autofilter - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~delete_columns. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_deletecolumns - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~delete_rows. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_deleterows - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~format_cells. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_formatcells - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~format_columns. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_formatcolumns - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~format_rows. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_formatrows - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~insert_columns. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_insertcolumns - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~insert_hyperlinks. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_inserthyperlinks - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~insert_rows. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_insertrows - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~objects. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_objects - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~pivot_tables. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_pivottables - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~scenarios. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_scenarios - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~select_locked_cells. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_selectlockedcells - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~select_unlocked_cells. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_selectunlockedcell - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~sheet. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_sheet - value = lv_value ). - lv_value = io_worksheet->zif_excel_sheet_protection~sort. - CONDENSE lv_value NO-GAPS. - lo_element->set_attribute_ns( name = lc_xml_attr_sort - value = lv_value ). - - lo_element_root->append_child( new_child = lo_element ). - ENDIF. - * links DATA: lv_hyperlinks_count TYPE i, lo_link TYPE REF TO zcl_excel_hyperlink. @@ -2629,7 +2662,7 @@ endmethod. lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). lo_renderer->render( ). -endmethod. +ENDMETHOD. diff --git a/ZA2X/INTF/ZIF_EXCEL_SHEET_PROPERTIES.slnk b/ZA2X/INTF/ZIF_EXCEL_SHEET_PROPERTIES.slnk new file mode 100644 index 0000000..b285bfd --- /dev/null +++ b/ZA2X/INTF/ZIF_EXCEL_SHEET_PROPERTIES.slnk @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ZA2X/PROG/ZDEMO_EXCEL.slnk b/ZA2X/PROG/ZDEMO_EXCEL.slnk index a3c5b68..d727bf3 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL.slnk @@ -1,5 +1,5 @@ - + @@ -57,5 +57,5 @@ START-OF-SELECTION. SUBMIT zdemo_excel19 WITH p_path = p_path AND RETURN. " Set active sheet " zdemo_excel20 is not added because it uses ALV and cannot be processed SUBMIT zdemo_excel21 WITH p_path = p_path AND RETURN. " Color Picker - SUBMIT zdemo_excel22 WITH p_path = p_path AND RETURN. " Bind table with field catalog & style + SUBMIT zdemo_excel22 WITH p_path = p_path AND RETURN. " Bind table with field catalog & sheet style diff --git a/ZA2X/PROG/ZDEMO_EXCEL22.slnk b/ZA2X/PROG/ZDEMO_EXCEL22.slnk index d6a0198..f8ed536 100644 --- a/ZA2X/PROG/ZDEMO_EXCEL22.slnk +++ b/ZA2X/PROG/ZDEMO_EXCEL22.slnk @@ -1,5 +1,5 @@ - + @@ -20,12 +20,15 @@ DATA: lo_excel TYPE REF TO zcl_excel, lo_worksheet TYPE REF TO zcl_excel_worksheet, lo_style TYPE REF TO zcl_excel_style, lo_style_editable TYPE REF TO zcl_excel_style, + lo_data_validation TYPE REF TO zcl_excel_data_validation, column_dimension TYPE REF TO zcl_excel_worksheet_columndime. DATA: lt_field_catalog TYPE zexcel_t_fieldcatalog, - ls_table_settings TYPE zexcel_s_table_settings. + ls_table_settings TYPE zexcel_s_table_settings, + ls_table_settings_out TYPE zexcel_s_table_settings. DATA: lv_file TYPE xstring, + lv_style_guid TYPE zexcel_cell_style, lv_bytecount TYPE i, lt_file_tab TYPE solix_tab. @@ -33,7 +36,8 @@ DATA: lv_file_name TYPE string, lv_file_path TYPE string, lv_full_path TYPE string, lv_workdir TYPE string, - lv_file_separator TYPE c. + lv_file_separator TYPE c, + lv_row TYPE char10. FIELD-SYMBOLS: <fs_field_catalog> TYPE zexcel_s_fieldcatalog. @@ -48,7 +52,7 @@ AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. INITIALIZATION. cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). - p_path = lv_workdir. + p_path = lv_workdir. START-OF-SELECTION. @@ -68,10 +72,17 @@ START-OF-SELECTION. DATA lt_test TYPE TABLE OF sflight. SELECT * FROM sflight INTO TABLE lt_test. + " sheet style (white background) + lo_style = lo_excel->add_new_style( ). + lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_solid. + lo_style->fill->fgcolor = zcl_excel_style_color=>c_white. + lv_style_guid = lo_style->get_guid( ). + " Get active sheet lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->zif_excel_sheet_properties~set_style( lv_style_guid ). lo_worksheet->zif_excel_sheet_protection~protected = zif_excel_sheet_protection=>c_protected. - lo_worksheet->zif_excel_sheet_protection~password = zcl_excel_common=>encrypt_password( 'capman' ). + lo_worksheet->zif_excel_sheet_protection~password = zcl_excel_common=>encrypt_password( 'test' ). lo_worksheet->zif_excel_sheet_protection~sheet = zif_excel_sheet_protection=>c_active. lo_worksheet->zif_excel_sheet_protection~objects = zif_excel_sheet_protection=>c_active. lo_worksheet->zif_excel_sheet_protection~scenarios = zif_excel_sheet_protection=>c_active. @@ -86,39 +97,52 @@ START-OF-SELECTION. lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = lt_test ). - loop at lt_field_catalog assigning <fs_field_catalog>. - case <fs_field_catalog>-fieldname. - when 'CARRID'. + LOOP AT lt_field_catalog ASSIGNING <fs_field_catalog>. + CASE <fs_field_catalog>-fieldname. + WHEN 'CARRID'. <fs_field_catalog>-position = 3. <fs_field_catalog>-dynpfld = abap_true. <fs_field_catalog>-style = lo_style->get_guid( ). - when 'CONNID'. + WHEN 'CONNID'. <fs_field_catalog>-position = 1. <fs_field_catalog>-dynpfld = abap_true. <fs_field_catalog>-style = lo_style->get_guid( ). - when 'FLDATE'. + WHEN 'FLDATE'. <fs_field_catalog>-position = 2. <fs_field_catalog>-dynpfld = abap_true. <fs_field_catalog>-style = lo_style->get_guid( ). - when 'PRICE'. + WHEN 'PRICE'. <fs_field_catalog>-position = 4. <fs_field_catalog>-dynpfld = abap_true. <fs_field_catalog>-style = lo_style_editable->get_guid( ).. <fs_field_catalog>-totals_function = zcl_excel_table=>totals_function_sum. - when others. + WHEN OTHERS. <fs_field_catalog>-dynpfld = abap_false. - endcase. - endloop. + ENDCASE. + ENDLOOP. ls_table_settings-table_style = zcl_excel_table=>builtinstyle_medium2. ls_table_settings-show_row_stripes = abap_true. - lo_worksheet->bind_table( ip_table = lt_test - it_field_catalog = lt_field_catalog - is_table_settings = ls_table_settings ). + lo_worksheet->bind_table( EXPORTING + ip_table = lt_test + it_field_catalog = lt_field_catalog + is_table_settings = ls_table_settings + IMPORTING + es_table_settings = ls_table_settings_out ). lo_worksheet->freeze_panes( ip_num_rows = 3 ). "freeze column headers when scrolling + lo_data_validation = lo_worksheet->add_new_data_validation( ). + lo_data_validation->type = zcl_excel_data_validation=>c_custom. + lv_row = ls_table_settings_out-top_left_row. + CONDENSE lv_row. + CONCATENATE 'ISNUMBER(' ls_table_settings_out-top_left_column lv_row ')' INTO lo_data_validation->value. + lo_data_validation->cell_row = ls_table_settings_out-top_left_row. + lo_data_validation->cell_column = ls_table_settings_out-top_left_column. + lo_data_validation->cell_row_to = ls_table_settings_out-bottom_right_row. + lo_data_validation->cell_column_to = ls_table_settings_out-bottom_right_column. + CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. lv_file = lo_excel_writer->write_file( lo_excel ). diff --git a/ZA2X/TABL/ZEXCEL_S_TABLE_SETTINGS.slnk b/ZA2X/TABL/ZEXCEL_S_TABLE_SETTINGS.slnk index 807b9a0..5e469af 100644 --- a/ZA2X/TABL/ZEXCEL_S_TABLE_SETTINGS.slnk +++ b/ZA2X/TABL/ZEXCEL_S_TABLE_SETTINGS.slnk @@ -1,9 +1,11 @@ - + + +