From 829529cf6af19f7bae822c80eda006cf45226e87 Mon Sep 17 00:00:00 2001 From: sandraros <34005250+sandraros@users.noreply.github.com> Date: Mon, 8 May 2023 20:18:18 +0200 Subject: [PATCH 01/15] don't run SALV get_metadata if not displayed yet (#1109) fix #1097 * don't run SALV get_metadata if not displayed yet --------- Co-authored-by: Sandra Rossi --- .../zcl_excel_converter_salv_model.clas.abap | 39 +++++++++++++++++++ .../zcl_excel_converter_salv_model.clas.xml | 16 ++++++++ .../zcl_excel_converter_salv_table.clas.abap | 11 +++++- 3 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 src/not_cloud/zcl_excel_converter_salv_model.clas.abap create mode 100644 src/not_cloud/zcl_excel_converter_salv_model.clas.xml diff --git a/src/not_cloud/zcl_excel_converter_salv_model.clas.abap b/src/not_cloud/zcl_excel_converter_salv_model.clas.abap new file mode 100644 index 0000000..59d1b6e --- /dev/null +++ b/src/not_cloud/zcl_excel_converter_salv_model.clas.abap @@ -0,0 +1,39 @@ +CLASS zcl_excel_converter_salv_model DEFINITION + PUBLIC + INHERITING FROM cl_salv_model + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + CLASS-METHODS is_get_metadata_callable + IMPORTING + io_salv TYPE REF TO cl_salv_table + RETURNING + VALUE(result) TYPE abap_bool. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS zcl_excel_converter_salv_model IMPLEMENTATION. + + METHOD is_get_metadata_callable. + DATA: lo_object TYPE REF TO object, + lo_model TYPE REF TO cl_salv_model. + + " In 7.52 and older versions, we have a short dump with CL_SALV_TABLE->GET_METADATA if the ALV is not displayed + " (due to io_salv->r_controller->r_adapter not instantiated yet). That's later fixed by SAP (no short dump in 7.57). + " NB: r_controller is always instantiated. + lo_object = io_salv. + TRY. + lo_model ?= lo_object. + CATCH cx_sy_move_cast_error. + " In 7.57, CL_SALV_TABLE is no more a subclass of CL_SALV_MODEL, but CL_SALV_TABLE->GET_METADATA can be called. + result = abap_true. + RETURN. + ENDTRY. + result = boolc( lo_model->r_controller->r_adapter IS BOUND ). + ENDMETHOD. + +ENDCLASS. diff --git a/src/not_cloud/zcl_excel_converter_salv_model.clas.xml b/src/not_cloud/zcl_excel_converter_salv_model.clas.xml new file mode 100644 index 0000000..48ae985 --- /dev/null +++ b/src/not_cloud/zcl_excel_converter_salv_model.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_EXCEL_CONVERTER_SALV_MODEL + E + SALV model utility methods + 1 + X + X + X + + + + diff --git a/src/not_cloud/zcl_excel_converter_salv_table.clas.abap b/src/not_cloud/zcl_excel_converter_salv_table.clas.abap index 3f0f899..1678bf2 100644 --- a/src/not_cloud/zcl_excel_converter_salv_table.clas.abap +++ b/src/not_cloud/zcl_excel_converter_salv_table.clas.abap @@ -75,7 +75,16 @@ CLASS zcl_excel_converter_salv_table IMPLEMENTATION. ls_vari-handle = ls_layout_key-handle. ls_vari-log_group = ls_layout_key-logical_group. ELSE. - io_salv->get_metadata( ) . + IF zcl_excel_converter_salv_model=>is_get_metadata_callable( io_salv ) = abap_true. + io_salv->get_metadata( ) . + ELSE. + " (do same as offline below) + cl_salv_controller_metadata=>get_variant( + EXPORTING + r_layout = lo_layout + CHANGING + s_variant = ls_vari ). + ENDIF. ENDIF. ELSE. * If we are offline we need to build this. From 2b01655cabf56441eff6ceba69741c144a9628eb Mon Sep 17 00:00:00 2001 From: Domi Bigl Date: Fri, 26 May 2023 07:47:59 +0200 Subject: [PATCH 02/15] do not use NO-ZERO for none numeric cell values (#1100) --- src/not_cloud/zcl_excel_ole.clas.abap | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/not_cloud/zcl_excel_ole.clas.abap b/src/not_cloud/zcl_excel_ole.clas.abap index f32c37e..f507a38 100644 --- a/src/not_cloud/zcl_excel_ole.clas.abap +++ b/src/not_cloud/zcl_excel_ole.clas.abap @@ -1548,10 +1548,13 @@ CLASS zcl_excel_ole IMPLEMENTATION. CLEAR contentsitem-value. * if type is not numeric -> dun display with zero + IF CO '0123456789.,-+E '. + WRITE TO contentsitem-value NO-ZERO. - WRITE TO contentsitem-value NO-ZERO. - - SHIFT contentsitem-value LEFT DELETING LEADING space. + SHIFT contentsitem-value LEFT DELETING LEADING space. + ELSE. + WRITE TO contentsitem-value. + ENDIF. ENDIF. APPEND contentsitem TO contents. From 1fe298d5bebc01982d90efeef37b14e46a4eb7d3 Mon Sep 17 00:00:00 2001 From: Matthias <134483348+oberhm@users.noreply.github.com> Date: Mon, 10 Jul 2023 14:07:26 +0200 Subject: [PATCH 03/15] Update zcl_excel_converter_salv_table.clas.abap (#1120) fix issue #1119 --- src/not_cloud/zcl_excel_converter_salv_table.clas.abap | 1 + 1 file changed, 1 insertion(+) diff --git a/src/not_cloud/zcl_excel_converter_salv_table.clas.abap b/src/not_cloud/zcl_excel_converter_salv_table.clas.abap index 1678bf2..cc906c2 100644 --- a/src/not_cloud/zcl_excel_converter_salv_table.clas.abap +++ b/src/not_cloud/zcl_excel_converter_salv_table.clas.abap @@ -74,6 +74,7 @@ CLASS zcl_excel_converter_salv_table IMPLEMENTATION. ls_vari-report = ls_layout_key-report. ls_vari-handle = ls_layout_key-handle. ls_vari-log_group = ls_layout_key-logical_group. + ls_vari-variant = lo_layout->get_initial_layout( ). ELSE. IF zcl_excel_converter_salv_model=>is_get_metadata_callable( io_salv ) = abap_true. io_salv->get_metadata( ) . From ac78cd87d271cc85498da034cede9438499961e6 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Fri, 28 Jul 2023 07:00:11 +0200 Subject: [PATCH 04/15] split unit test `delete_merge` (#1121) * split unit test delete_merge into one unit test per test * add unit test get_rows_iterator --- src/zcl_excel_worksheet.clas.testclasses.abap | 86 ++++++++++++++++--- 1 file changed, 73 insertions(+), 13 deletions(-) diff --git a/src/zcl_excel_worksheet.clas.testclasses.abap b/src/zcl_excel_worksheet.clas.testclasses.abap index 65d9be1..3493506 100644 --- a/src/zcl_excel_worksheet.clas.testclasses.abap +++ b/src/zcl_excel_worksheet.clas.testclasses.abap @@ -30,9 +30,15 @@ CLASS lcl_excel_worksheet_test DEFINITION FOR TESTING METHODS: setup. METHODS: teardown. METHODS: set_merge FOR TESTING RAISING cx_static_check. - METHODS: delete_merge FOR TESTING RAISING cx_static_check. - METHODS: get_dimension_range FOR TESTING RAISING cx_static_check. -ENDCLASS. "lcl_Excel_Worksheet_Test + METHODS delete_merge1 FOR TESTING RAISING cx_static_check. + METHODS delete_merge2 FOR TESTING RAISING cx_static_check. + METHODS delete_merge3 FOR TESTING RAISING cx_static_check. + METHODS delete_merge4 FOR TESTING RAISING cx_static_check. + METHODS delete_merge5 FOR TESTING RAISING cx_static_check. + METHODS delete_merge6 FOR TESTING RAISING cx_static_check. + METHODS get_dimension_range FOR TESTING RAISING cx_static_check. + METHODS get_rows_iterator FOR TESTING RAISING cx_static_check. +ENDCLASS. CLASS ltc_calculate_table_bottom_rig DEFINITION FOR TESTING @@ -465,12 +471,11 @@ CLASS lcl_excel_worksheet_test IMPLEMENTATION. ENDMETHOD. - METHOD delete_merge. + METHOD delete_merge1. * ==================== DATA lt_merge TYPE string_table. DATA lv_merge TYPE string. DATA lv_size TYPE i. - DATA lv_index TYPE i. * Test 1. Simple test delete all merges @@ -491,6 +496,13 @@ CLASS lcl_excel_worksheet_test IMPLEMENTATION. msg = 'Expect merge table with 1 line fully cleared' level = if_aunit_constants=>critical ). + ENDMETHOD. + + METHOD delete_merge2. +* ==================== + DATA lt_merge TYPE string_table. + DATA lv_merge TYPE string. + DATA lv_size TYPE i. * Test 2. Simple test delete all merges @@ -513,7 +525,14 @@ CLASS lcl_excel_worksheet_test IMPLEMENTATION. msg = 'Expect merge table with few lines fully cleared' level = if_aunit_constants=>critical ). + ENDMETHOD. + METHOD delete_merge3. +* ==================== + DATA lt_merge TYPE string_table. + DATA lv_merge TYPE string. + DATA lv_size TYPE i. + DATA lv_index TYPE i. * Test 3. Delete concrete merge with success DO 4 TIMES. @@ -529,10 +548,14 @@ CLASS lcl_excel_worksheet_test IMPLEMENTATION. ). CASE lv_index. - WHEN 1. f_cut->delete_merge( ip_cell_column = 2 ip_cell_row = 2 ). - WHEN 2. f_cut->delete_merge( ip_cell_column = 2 ip_cell_row = 3 ). - WHEN 3. f_cut->delete_merge( ip_cell_column = 3 ip_cell_row = 2 ). - WHEN 4. f_cut->delete_merge( ip_cell_column = 3 ip_cell_row = 3 ). + WHEN 1. + f_cut->delete_merge( ip_cell_column = 2 ip_cell_row = 2 ). + WHEN 2. + f_cut->delete_merge( ip_cell_column = 2 ip_cell_row = 3 ). + WHEN 3. + f_cut->delete_merge( ip_cell_column = 3 ip_cell_row = 2 ). + WHEN 4. + f_cut->delete_merge( ip_cell_column = 3 ip_cell_row = 3 ). ENDCASE. lt_merge = f_cut->get_merge( ). @@ -545,7 +568,14 @@ CLASS lcl_excel_worksheet_test IMPLEMENTATION. level = if_aunit_constants=>critical ). ENDDO. + ENDMETHOD. + METHOD delete_merge4. +* ==================== + DATA lt_merge TYPE string_table. + DATA lv_merge TYPE string. + DATA lv_size TYPE i. + DATA lv_index TYPE i. * Test 4. Delete concrete merge with fail DO 4 TIMES. @@ -561,10 +591,14 @@ CLASS lcl_excel_worksheet_test IMPLEMENTATION. ). CASE lv_index. - WHEN 1. f_cut->delete_merge( ip_cell_column = 1 ip_cell_row = 2 ). - WHEN 2. f_cut->delete_merge( ip_cell_column = 2 ip_cell_row = 1 ). - WHEN 3. f_cut->delete_merge( ip_cell_column = 4 ip_cell_row = 2 ). - WHEN 4. f_cut->delete_merge( ip_cell_column = 2 ip_cell_row = 4 ). + WHEN 1. + f_cut->delete_merge( ip_cell_column = 1 ip_cell_row = 2 ). + WHEN 2. + f_cut->delete_merge( ip_cell_column = 2 ip_cell_row = 1 ). + WHEN 3. + f_cut->delete_merge( ip_cell_column = 4 ip_cell_row = 2 ). + WHEN 4. + f_cut->delete_merge( ip_cell_column = 2 ip_cell_row = 4 ). ENDCASE. lt_merge = f_cut->get_merge( ). @@ -577,6 +611,13 @@ CLASS lcl_excel_worksheet_test IMPLEMENTATION. level = if_aunit_constants=>critical ). ENDDO. + ENDMETHOD. + + METHOD delete_merge5. +* ==================== + DATA lt_merge TYPE string_table. + DATA lv_merge TYPE string. + DATA lv_size TYPE i. * Test 5. Delete concrete merge #1 @@ -614,6 +655,13 @@ CLASS lcl_excel_worksheet_test IMPLEMENTATION. msg = 'Expect delete B2:C3 merge' level = if_aunit_constants=>critical ). + ENDMETHOD. + + METHOD delete_merge6. +* ==================== + DATA lt_merge TYPE string_table. + DATA lv_merge TYPE string. + DATA lv_size TYPE i. * Test 6. Delete concrete merge #2 @@ -682,6 +730,18 @@ CLASS lcl_excel_worksheet_test IMPLEMENTATION. ). ENDMETHOD. + METHOD get_rows_iterator. + DATA lo_iterator TYPE REF TO zcl_excel_collection_iterator. + DATA lv_index TYPE i. + + f_cut->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). + lo_iterator = f_cut->get_rows_iterator( ). + lv_index = lo_iterator->get_index( ). + cl_abap_unit_assert=>assert_equals( + act = lv_index + exp = 0 ). + ENDMETHOD. + ENDCLASS. "lcl_Excel_Worksheet_Test From 425b6a2b7dd7aff6f4f2bc8559c47d0660d1b52a Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Fri, 28 Jul 2023 07:02:16 +0200 Subject: [PATCH 05/15] add basic unit test for style changer (#1123) * add basic unit test for style changer * xml * revert --- ..._excel_style_changer.clas.testclasses.abap | 41 +++++++++++++++++++ src/zcl_excel_style_changer.clas.xml | 1 + 2 files changed, 42 insertions(+) create mode 100644 src/zcl_excel_style_changer.clas.testclasses.abap diff --git a/src/zcl_excel_style_changer.clas.testclasses.abap b/src/zcl_excel_style_changer.clas.testclasses.abap new file mode 100644 index 0000000..352d324 --- /dev/null +++ b/src/zcl_excel_style_changer.clas.testclasses.abap @@ -0,0 +1,41 @@ +CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL. + + PRIVATE SECTION. + DATA mi_cut TYPE REF TO zif_excel_style_changer. + DATA mo_excel TYPE REF TO zcl_excel. + DATA mo_worksheet TYPE REF TO zcl_excel_worksheet. + + METHODS setup RAISING cx_static_check. + METHODS apply FOR TESTING RAISING cx_static_check. +ENDCLASS. + + +CLASS ltcl_test IMPLEMENTATION. + + METHOD setup. + CREATE OBJECT mo_excel. + mo_worksheet = mo_excel->get_active_worksheet( ). + mi_cut = zcl_excel_style_changer=>create( mo_excel ). + ENDMETHOD. + + METHOD apply. + + DATA lv_guid TYPE zexcel_cell_style. + + mo_worksheet->set_cell( + ip_column = 'B' + ip_row = 2 + ip_value = 'Hello' ). + + mi_cut->set_font_bold( abap_true ). + + lv_guid = mi_cut->apply( + ip_worksheet = mo_worksheet + ip_column = 'B' + ip_row = 2 ). + + mo_excel->get_style_to_guid( lv_guid ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/zcl_excel_style_changer.clas.xml b/src/zcl_excel_style_changer.clas.xml index 5b262b8..a357d83 100644 --- a/src/zcl_excel_style_changer.clas.xml +++ b/src/zcl_excel_style_changer.clas.xml @@ -10,6 +10,7 @@ X X X + X From c28162d1d1e6484c41bfb898d918962d4af20696 Mon Sep 17 00:00:00 2001 From: Domi Bigl Date: Fri, 4 Aug 2023 14:57:02 +0200 Subject: [PATCH 06/15] add escape of - (#1128) * add escape of - * add untitests * replace inline data declaration --- src/zcl_excel_common.clas.abap | 2 +- src/zcl_excel_common.clas.testclasses.abap | 90 ++++++++++++++++++++++ 2 files changed, 91 insertions(+), 1 deletion(-) diff --git a/src/zcl_excel_common.clas.abap b/src/zcl_excel_common.clas.abap index ab317bf..17263df 100644 --- a/src/zcl_excel_common.clas.abap +++ b/src/zcl_excel_common.clas.abap @@ -846,7 +846,7 @@ CLASS zcl_excel_common IMPLEMENTATION. lv_value = ip_value. - FIND REGEX `\s|'` IN lv_value. " \s finds regular and white spaces + FIND REGEX `\s|'|-` IN lv_value. " \s finds regular and white spaces IF sy-subrc = 0. REPLACE ALL OCCURRENCES OF `'` IN lv_value WITH `''`. CONCATENATE `'` lv_value `'` INTO lv_value . diff --git a/src/zcl_excel_common.clas.testclasses.abap b/src/zcl_excel_common.clas.testclasses.abap index e4b0987..f6a53af 100644 --- a/src/zcl_excel_common.clas.testclasses.abap +++ b/src/zcl_excel_common.clas.testclasses.abap @@ -122,6 +122,12 @@ CLASS lcl_excel_common_test DEFINITION FOR TESTING METHODS is_cell_in_range_upperside_out FOR TESTING. METHODS is_cell_in_range_rightside_out FOR TESTING. METHODS is_cell_in_range_lowerside_out FOR TESTING. + METHODS escape_string_whitespace1 FOR TESTING. + METHODS escape_string_whitespace2 FOR TESTING. + METHODS escape_string_whitespace3 FOR TESTING. + METHODS escape_string_quote FOR TESTING. + METHODS escape_string_hyphen FOR TESTING. + METHODS escape_string_regular FOR TESTING. ENDCLASS. @@ -1597,4 +1603,88 @@ CLASS lcl_excel_common_test IMPLEMENTATION. ENDTRY. ENDMETHOD. "is_cell_in_range_lowerside_out. + METHOD escape_string_hyphen. + DATA: name TYPE string, + escaped_name TYPE string. + + name = `A-B`. + + escaped_name = zcl_excel_common=>escape_string( name ). + + cl_abap_unit_assert=>assert_equals( act = escaped_name + exp = `'A-B'` + msg = 'Escaping - failed' ). + + ENDMETHOD. + + METHOD escape_string_quote. + DATA: name TYPE string, + escaped_name TYPE string. + + name = `A'B`. + + escaped_name = zcl_excel_common=>escape_string( name ). + + cl_abap_unit_assert=>assert_equals( act = escaped_name + exp = `'A''B'` + msg = `Escaping ' failed` ). + + ENDMETHOD. + + METHOD escape_string_regular. + DATA: name TYPE string, + escaped_name TYPE string. + + name = `Ab1`. + + escaped_name = zcl_excel_common=>escape_string( name ). + + cl_abap_unit_assert=>assert_equals( act = escaped_name + exp = `Ab1` + msg = 'Escaped for no reason' ). + + ENDMETHOD. + + METHOD escape_string_whitespace1. + DATA: name TYPE string, + escaped_name TYPE string. + + name = `A B`. + + escaped_name = zcl_excel_common=>escape_string( name ). + + cl_abap_unit_assert=>assert_equals( act = escaped_name + exp = `'A B'` + msg = `Escaping ' ' (space) failed` ). + + ENDMETHOD. + + METHOD escape_string_whitespace2. + DATA: name TYPE string, + escaped_name TYPE string. + + name = `A` && cl_abap_char_utilities=>horizontal_tab && `B`. + + escaped_name = zcl_excel_common=>escape_string( name ). + + cl_abap_unit_assert=>assert_equals( act = escaped_name + exp = `'A` && cl_abap_char_utilities=>horizontal_tab && `B'` + msg = `Escaping TAB failed` ). + + ENDMETHOD. + + METHOD escape_string_whitespace3. + DATA: name TYPE string, + escaped_name TYPE string. + + name = `A` && cl_abap_char_utilities=>newline && `B`. + + escaped_name = zcl_excel_common=>escape_string( name ). + + cl_abap_unit_assert=>assert_equals( act = escaped_name + exp = `'A` && cl_abap_char_utilities=>newline && `B'` + msg = `Escaping LF failed` ). + + ENDMETHOD. + ENDCLASS. From ec32e7ade487e53298ed2fdad64a48c6d06b0c64 Mon Sep 17 00:00:00 2001 From: sandraros <34005250+sandraros@users.noreply.github.com> Date: Sat, 30 Sep 2023 11:17:07 +0200 Subject: [PATCH 07/15] ZCX_EXCEL diff due to new abapGit (#1141) Pull of latest abap2xlsx via latest abapGit still shows a diff on ZCX_EXCEL. The abapGit serialization adds an extra block. --- src/zcx_excel.clas.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/zcx_excel.clas.xml b/src/zcx_excel.clas.xml index 5bbc56e..23ddcb3 100644 --- a/src/zcx_excel.clas.xml +++ b/src/zcx_excel.clas.xml @@ -42,6 +42,14 @@ 0001 + + + LIMU + CPUB + ZCX_EXCEL + 0001 + + CONSTRUCTOR From 4d33c4e20ea334ffed3cc77cac91f6c05cd38fdf Mon Sep 17 00:00:00 2001 From: Matthias <134483348+oberhm@users.noreply.github.com> Date: Sat, 30 Sep 2023 14:07:30 +0200 Subject: [PATCH 08/15] Fix CSV Export with date and time in excel format (#1140) * solving issue #1134 * changes after testing * CSV export - Dateretention of cellstyles - fix issue #1134 * undo previous changes for issue #1134 --- src/zcl_excel_writer_csv.clas.abap | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/zcl_excel_writer_csv.clas.abap b/src/zcl_excel_writer_csv.clas.abap index 5c1bd82..23f6853 100644 --- a/src/zcl_excel_writer_csv.clas.abap +++ b/src/zcl_excel_writer_csv.clas.abap @@ -60,6 +60,10 @@ CLASS zcl_excel_writer_csv IMPLEMENTATION. * .csv format with ; delimiter +* Start of insertion # issue 1134 - Dateretention of cellstyles(issue #139) + me->excel->add_static_styles( ). +* End of insertion # issue 1134 - Dateretention of cellstyles(issue #139) + ep_excel = me->create_csv( ). ENDMETHOD. From 2f970b82a1f6c2eafe554ac8bee852115fdec4bb Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sun, 1 Oct 2023 17:33:07 +0200 Subject: [PATCH 09/15] abaplint: update msag_consistency rule settings (#1142) to not require numeric parameters --- abaplint.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/abaplint.json b/abaplint.json index 3b1b9b7..cd2a0bd 100644 --- a/abaplint.json +++ b/abaplint.json @@ -136,7 +136,9 @@ "local_class_naming": false, "main_file_contents": true, "message_exists": false, - "msag_consistency": true, + "msag_consistency": { + "numericParamters": false + }, "newline_between_methods": false, "no_public_attributes": false, "object_naming": { From d30855345c94bf190fd680f4b0b374eb4e62c89a Mon Sep 17 00:00:00 2001 From: sandraros <34005250+sandraros@users.noreply.github.com> Date: Sun, 29 Oct 2023 18:11:02 +0100 Subject: [PATCH 10/15] XML I18N_LANGS/DD02_TEXTS - ZEXCEL_S_FIELDCATALOG (#1149) New XML added by abapGit while serializing the DDIC structure ZEXCEL_S_FIELDCATALOG: 1 ... 1 Fieldcatalog for Table Binding ... --- src/zexcel_s_fieldcatalog.tabl.xml | 119 +++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/src/zexcel_s_fieldcatalog.tabl.xml b/src/zexcel_s_fieldcatalog.tabl.xml index b7958b7..7adfa26 100644 --- a/src/zexcel_s_fieldcatalog.tabl.xml +++ b/src/zexcel_s_fieldcatalog.tabl.xml @@ -118,6 +118,125 @@ E + + 1 + 4 + 5 + 6 + 8 + B + C + F + G + H + K + L + N + O + Q + R + S + T + U + V + W + c + d + + + + 1 + Fieldcatalog for Table Binding + + + 4 + Fieldcatalog for Table Binding + + + 5 + Fieldcatalog for Table Binding + + + 6 + Fieldcatalog for Table Binding + + + 8 + Fieldcatalog for Table Binding + + + B + Fieldcatalog for Table Binding + + + C + Fieldcatalog for Table Binding + + + F + Fieldcatalog for Table Binding + + + G + Fieldcatalog for Table Binding + + + H + Fieldcatalog for Table Binding + + + K + Fieldcatalog for Table Binding + + + L + Fieldcatalog for Table Binding + + + N + Fieldcatalog for Table Binding + + + O + Fieldcatalog for Table Binding + + + Q + Fieldcatalog for Table Binding + + + R + Fieldcatalog for Table Binding + + + S + Fieldcatalog for Table Binding + + + T + Fieldcatalog for Table Binding + + + U + Fieldcatalog for Table Binding + + + V + Fieldcatalog for Table Binding + + + W + Fieldcatalog for Table Binding + + + c + Fieldcatalog for Table Binding + + + d + Fieldcatalog for Table Binding + + From cf8bb2c5012c42bd6fb4cea2caef4ad66fbab972 Mon Sep 17 00:00:00 2001 From: Daniel Wegner Date: Sun, 29 Oct 2023 18:29:51 +0100 Subject: [PATCH 11/15] add iv_end_row to convert_to_table (#1148) Co-authored-by: sandraros <34005250+sandraros@users.noreply.github.com> --- src/zcl_excel_worksheet.clas.abap | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index c650015..cec706b 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -673,6 +673,7 @@ CLASS zcl_excel_worksheet DEFINITION IMPORTING !it_field_catalog TYPE zexcel_t_fieldcatalog OPTIONAL !iv_begin_row TYPE int4 DEFAULT 2 + !iv_end_row TYPE int4 DEFAULT 0 EXPORTING !et_data TYPE STANDARD TABLE !er_data TYPE REF TO data @@ -2263,6 +2264,10 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. LOOP AT me->sheet_content ASSIGNING FROM lv_index. AT NEW cell_row. + IF iv_end_row <> 0 + AND -cell_row > iv_end_row. + EXIT. + ENDIF. " New line APPEND INITIAL LINE TO ASSIGNING . lv_index = sy-tabix. From ccda3a0aa8ea4dbcabd8e7be46848af1849ab71e Mon Sep 17 00:00:00 2001 From: Arno <32099906+aspeitkamp@users.noreply.github.com> Date: Sun, 29 Oct 2023 19:09:30 +0100 Subject: [PATCH 12/15] read all header/footer (odd/even) elements (#1144) Previously only the "oddFooter" was read and stored. Read the missing elements as well. --- src/zcl_excel_reader_2007.clas.abap | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/zcl_excel_reader_2007.clas.abap b/src/zcl_excel_reader_2007.clas.abap index f7afd92..1c89b39 100644 --- a/src/zcl_excel_reader_2007.clas.abap +++ b/src/zcl_excel_reader_2007.clas.abap @@ -2859,6 +2859,21 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. ls_odd_footer-left_value = lo_ixml_hf_value_elem->get_value( ). ENDIF. + lo_ixml_hf_value_elem = lo_ixml_headerfooter_elem->find_from_name_ns( name = 'oddHeader' uri = namespace-main ). + IF lo_ixml_hf_value_elem IS NOT INITIAL. + ls_odd_header-left_value = lo_ixml_hf_value_elem->get_value( ). + ENDIF. + + lo_ixml_hf_value_elem = lo_ixml_headerfooter_elem->find_from_name_ns( name = 'evenFooter' uri = namespace-main ). + IF lo_ixml_hf_value_elem IS NOT INITIAL. + ls_even_footer-left_value = lo_ixml_hf_value_elem->get_value( ). + ENDIF. + + lo_ixml_hf_value_elem = lo_ixml_headerfooter_elem->find_from_name_ns( name = 'evenHeader' uri = namespace-main ). + IF lo_ixml_hf_value_elem IS NOT INITIAL. + ls_even_header-left_value = lo_ixml_hf_value_elem->get_value( ). + ENDIF. + * 2do§1 Header/footer " TODO.. get the rest. From c1a20e870ba02482d1d7f276f8f8144ddcfe180d Mon Sep 17 00:00:00 2001 From: larsip <77494750+larsip@users.noreply.github.com> Date: Sat, 4 Nov 2023 17:09:11 +0100 Subject: [PATCH 13/15] Convert currency amount to external format (#1147) Fix #1145 * Convert currency amount to external format Fetching currency reference field from ALV and use the value from this field convert the value to external format * Missing field catalog update * Little changes proposed * Code best positioned, delete unused declaration Latest changes proposed by darnoc312 --- src/zcl_excel_common.clas.abap | 25 +++++++-- src/zcl_excel_common.clas.testclasses.abap | 44 ++++++++++++++++ src/zcl_excel_worksheet.clas.abap | 61 +++++++++++++++------- src/zexcel_s_fieldcatalog.tabl.xml | 6 +++ 4 files changed, 111 insertions(+), 25 deletions(-) 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 From bcec07b41a7664430e098f2d04499c167c3c6bbe Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sun, 5 Nov 2023 11:18:36 +0100 Subject: [PATCH 14/15] fix syntax warning (#1155) --- src/zcl_excel_theme_color_scheme.clas.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zcl_excel_theme_color_scheme.clas.abap b/src/zcl_excel_theme_color_scheme.clas.abap index c5b2222..daba628 100644 --- a/src/zcl_excel_theme_color_scheme.clas.abap +++ b/src/zcl_excel_theme_color_scheme.clas.abap @@ -100,7 +100,7 @@ CLASS zcl_excel_theme_color_scheme IMPLEMENTATION. parent = lo_elements ). lo_scheme_element->set_attribute( name = c_name value = name ). - "! Adding colors to scheme + " Adding colors to scheme lo_color ?= io_document->create_simple_element_ns( prefix = zcl_excel_theme=>c_theme_prefix name = c_dark1 parent = lo_scheme_element ). From a6176d7f1769f95d1a9ce2dc7cd6bda616c53a44 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sun, 5 Nov 2023 11:21:52 +0100 Subject: [PATCH 15/15] replace use of REFFIELD (#1154) --- src/zexcel_s_fieldcatalog.tabl.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zexcel_s_fieldcatalog.tabl.xml b/src/zexcel_s_fieldcatalog.tabl.xml index f723983..8bdbe28 100644 --- a/src/zexcel_s_fieldcatalog.tabl.xml +++ b/src/zexcel_s_fieldcatalog.tabl.xml @@ -119,7 +119,7 @@ CURRENCY_COLUMN - REFFIELD + ZEXCEL_FIELDNAME 0 E