diff --git a/src/zcl_excel_common.clas.abap b/src/zcl_excel_common.clas.abap index 17263df..9d9300a 100644 --- a/src/zcl_excel_common.clas.abap +++ b/src/zcl_excel_common.clas.abap @@ -48,7 +48,7 @@ CLASS zcl_excel_common DEFINITION zcx_excel. CLASS-METHODS convert_columnrow2column_a_row IMPORTING - !i_columnrow TYPE clike + !i_columnrow TYPE clike EXPORTING !e_column TYPE zexcel_cell_column_alpha !e_column_int TYPE zexcel_cell_column @@ -77,7 +77,7 @@ CLASS zcl_excel_common DEFINITION !e_row TYPE zexcel_cell_row . CLASS-METHODS clone_ixml_with_namespaces IMPORTING - element TYPE REF TO if_ixml_element + element TYPE REF TO if_ixml_element RETURNING VALUE(result) TYPE REF TO if_ixml_element. CLASS-METHODS date_to_excel_string @@ -133,6 +133,7 @@ CLASS zcl_excel_common DEFINITION CLASS-METHODS number_to_excel_string IMPORTING VALUE(ip_value) TYPE numeric + ip_currency TYPE waers_curc OPTIONAL RETURNING VALUE(ep_value) TYPE zexcel_cell_value . CLASS-METHODS recursive_class_to_struct @@ -498,8 +499,8 @@ CLASS zcl_excel_common IMPLEMENTATION. METHOD convert_column_a_row2columnrow. - DATA: lv_row_alpha TYPE string, - lv_column_alpha TYPE zexcel_cell_column_alpha. + DATA: lv_row_alpha TYPE string, + lv_column_alpha TYPE zexcel_cell_column_alpha. lv_row_alpha = i_row. lv_column_alpha = zcl_excel_common=>convert_column2alpha( i_column ). @@ -944,6 +945,15 @@ CLASS zcl_excel_common IMPLEMENTATION. -scrtext_s = ls_salv_t_column_ref-r_column->get_short_text( ). -scrtext_m = ls_salv_t_column_ref-r_column->get_medium_text( ). -scrtext_l = ls_salv_t_column_ref-r_column->get_long_text( ). + -currency_column = ls_salv_t_column_ref-r_column->get_currency_column( ). + " If currency column not in structure then clear the field again + IF -currency_column IS NOT INITIAL. + READ TABLE lt_salv_t_column_ref WITH KEY columnname = -currency_column TRANSPORTING NO FIELDS. + IF sy-subrc <> 0. + CLEAR -currency_column. + ENDIF. + ENDIF. + IF ip_conv_exit_length = abap_false. -abap_type = lo_salv_column_table->get_ddic_inttype( ). ENDIF. @@ -1007,7 +1017,11 @@ CLASS zcl_excel_common IMPLEMENTATION. METHOD number_to_excel_string. DATA: lv_value_c TYPE c LENGTH 100. - WRITE ip_value TO lv_value_c EXPONENT 0 NO-GROUPING NO-SIGN. + IF ip_currency IS INITIAL. + WRITE ip_value TO lv_value_c EXPONENT 0 NO-GROUPING NO-SIGN. + ELSE. + WRITE ip_value TO lv_value_c EXPONENT 0 NO-GROUPING NO-SIGN CURRENCY ip_currency. + ENDIF. REPLACE ALL OCCURRENCES OF ',' IN lv_value_c WITH '.'. ep_value = lv_value_c. @@ -1691,4 +1705,5 @@ CLASS zcl_excel_common IMPLEMENTATION. ENDMETHOD. + ENDCLASS. diff --git a/src/zcl_excel_common.clas.testclasses.abap b/src/zcl_excel_common.clas.testclasses.abap index f6a53af..26313f7 100644 --- a/src/zcl_excel_common.clas.testclasses.abap +++ b/src/zcl_excel_common.clas.testclasses.abap @@ -45,6 +45,9 @@ CLASS lcl_excel_common_test DEFINITION FOR TESTING METHODS date_to_excel_string4 FOR TESTING RAISING cx_static_check. METHODS date_to_excel_string5 FOR TESTING RAISING cx_static_check. METHODS date_to_excel_string6 FOR TESTING RAISING cx_static_check. + METHODS amount_to_excel_string1 FOR TESTING RAISING cx_static_check. + METHODS amount_to_excel_string2 FOR TESTING RAISING cx_static_check. + METHODS amount_to_excel_string3 FOR TESTING RAISING cx_static_check. METHODS: encrypt_password FOR TESTING. METHODS: excel_string_to_date FOR TESTING. METHODS excel_string_to_time1 FOR TESTING RAISING cx_static_check. @@ -467,6 +470,47 @@ CLASS lcl_excel_common_test IMPLEMENTATION. ENDMETHOD. + METHOD amount_to_excel_string1. + DATA ep_value TYPE zexcel_cell_value. + + ep_value = zcl_excel_common=>number_to_excel_string( ip_value = '1003.99' + ip_currency = 'EUR' ). + + cl_abap_unit_assert=>assert_equals( + act = ep_value + exp = '1003.99' + msg = 'Wrong currency amount conversion' + level = if_aunit_constants=>critical ). + + ENDMETHOD. + + METHOD amount_to_excel_string2. + DATA ep_value TYPE zexcel_cell_value. + + ep_value = zcl_excel_common=>number_to_excel_string( ip_value = '-1003.99' + ip_currency = 'HUF' ). + + cl_abap_unit_assert=>assert_equals( + act = ep_value + exp = '-100399' + msg = 'Wrong currency amount conversion' + level = if_aunit_constants=>critical ). + + ENDMETHOD. + + METHOD amount_to_excel_string3. + DATA ep_value TYPE zexcel_cell_value. + + ep_value = zcl_excel_common=>number_to_excel_string( ip_value = '0' + ip_currency = 'HUF' ). + + cl_abap_unit_assert=>assert_equals( + act = ep_value + exp = '0' + msg = 'Wrong currency amount conversion' + level = if_aunit_constants=>critical ). + + ENDMETHOD. METHOD encrypt_password. * ======================== diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index cec706b..5cb1ce0 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -172,6 +172,7 @@ CLASS zcl_excel_worksheet DEFINITION 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 + !ip_conv_curr_amt_ext TYPE abap_bool DEFAULT abap_false EXPORTING !es_table_settings TYPE zexcel_s_table_settings RAISING @@ -499,6 +500,7 @@ CLASS zcl_excel_worksheet DEFINITION !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_currency TYPE waers_curc 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 @@ -797,15 +799,15 @@ CLASS zcl_excel_worksheet DEFINITION iv_default_descr TYPE c it_field_catalog TYPE zexcel_t_fieldcatalog RETURNING - VALUE(result) TYPE zexcel_t_fieldcatalog. + 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 + 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 + ep_column TYPE zexcel_cell_column + ep_row TYPE zexcel_cell_row RAISING zcx_excel. METHODS normalize_range_parameter @@ -975,7 +977,8 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. CONSTANTS: lc_top_left_column TYPE zexcel_cell_column_alpha VALUE 'A', - lc_top_left_row TYPE zexcel_cell_row VALUE 1. + lc_top_left_row TYPE zexcel_cell_row VALUE 1, + lc_no_currency TYPE waers_curc VALUE IS INITIAL. DATA: lv_row_int TYPE zexcel_cell_row, @@ -1001,7 +1004,8 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. TYPE zexcel_s_fieldcatalog, TYPE zexcel_s_fieldcatalog, TYPE any, - TYPE any. + TYPE any, + TYPE waers. ls_settings = is_table_settings. @@ -1100,6 +1104,7 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. 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. @@ -1151,18 +1156,26 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ip_column_formula_id = ls_column_formula-id ). ENDIF. ELSE. + IF -currency_column IS INITIAL OR ip_conv_curr_amt_ext = abap_false. + ASSIGN lc_no_currency TO . + ELSE. + ASSIGN COMPONENT -currency_column OF STRUCTURE TO . + ENDIF. + 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 ). + me->set_cell( ip_column = lv_column_alpha + ip_row = lv_row_int + ip_value = + ip_abap_type = -abap_type + ip_currency = + 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_currency = ip_style = -style ip_conv_exit_length = ip_conv_exit_length ). ENDIF. @@ -1171,11 +1184,13 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. me->set_cell( ip_column = lv_column_alpha ip_row = lv_row_int ip_abap_type = -abap_type + ip_currency = 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_currency = ip_value = ip_conv_exit_length = ip_conv_exit_length ). ENDIF. @@ -3905,12 +3920,18 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. cl_abap_typedescr=>typekind_decfloat OR cl_abap_typedescr=>typekind_decfloat16 OR cl_abap_typedescr=>typekind_decfloat34. - lo_addit = cl_abap_elemdescr=>get_f( ). - CREATE DATA lo_value_new TYPE HANDLE lo_addit. - ASSIGN lo_value_new->* TO . - IF sy-subrc = 0. - = . - lv_value = zcl_excel_common=>number_to_excel_string( ip_value = ). + IF lv_value_type = cl_abap_typedescr=>typekind_packed + AND ip_currency IS NOT INITIAL. + lv_value = zcl_excel_common=>number_to_excel_string( ip_value = + ip_currency = ip_currency ). + ELSE. + lo_addit = cl_abap_elemdescr=>get_f( ). + CREATE DATA lo_value_new TYPE HANDLE lo_addit. + ASSIGN lo_value_new->* TO . + IF sy-subrc = 0. + = . + lv_value = zcl_excel_common=>number_to_excel_string( ip_value = ). + ENDIF. ENDIF. WHEN cl_abap_typedescr=>typekind_char OR cl_abap_typedescr=>typekind_string OR cl_abap_typedescr=>typekind_num OR diff --git a/src/zexcel_s_fieldcatalog.tabl.xml b/src/zexcel_s_fieldcatalog.tabl.xml index 7adfa26..f723983 100644 --- a/src/zexcel_s_fieldcatalog.tabl.xml +++ b/src/zexcel_s_fieldcatalog.tabl.xml @@ -117,6 +117,12 @@ 0 E + + CURRENCY_COLUMN + REFFIELD + 0 + E + 1