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/47] 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/47] 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/47] 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/47] 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/47] 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/47] 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/47] 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/47] 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/47] 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/47] 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/47] 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/47] 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/47] 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/47] 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/47] 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 From 1c2607f655548e5afaef7e36e88172e4a888877b Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sun, 24 Dec 2023 20:28:06 +0100 Subject: [PATCH 16/47] move ZEXCEL_TR_DOCPROPS_CORE to demos (#1165) --- src/zexcel_tr_docprops_core.xslt.source.xml | 19 ------------------- src/zexcel_tr_docprops_core.xslt.xml | 12 ------------ 2 files changed, 31 deletions(-) delete mode 100644 src/zexcel_tr_docprops_core.xslt.source.xml delete mode 100644 src/zexcel_tr_docprops_core.xslt.xml diff --git a/src/zexcel_tr_docprops_core.xslt.source.xml b/src/zexcel_tr_docprops_core.xslt.source.xml deleted file mode 100644 index 674d63a..0000000 --- a/src/zexcel_tr_docprops_core.xslt.source.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/src/zexcel_tr_docprops_core.xslt.xml b/src/zexcel_tr_docprops_core.xslt.xml deleted file mode 100644 index 0cb8203..0000000 --- a/src/zexcel_tr_docprops_core.xslt.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - ZEXCEL_TR_DOCPROPS_CORE - E - docProps/core.xml - - - - From 76a39a7819d03e15ab362841b93445d9b3054c76 Mon Sep 17 00:00:00 2001 From: sandraros <34005250+sandraros@users.noreply.github.com> Date: Mon, 25 Dec 2023 16:36:58 +0100 Subject: [PATCH 17/47] Make the reader get the Tables (#1159) Fix #1158 Fix #1168 --- src/zcl_excel_reader_2007.clas.abap | 157 ++++++++++++++++++++++++++++ src/zcl_excel_reader_2007.clas.xml | 5 + 2 files changed, 162 insertions(+) diff --git a/src/zcl_excel_reader_2007.clas.abap b/src/zcl_excel_reader_2007.clas.abap index 1c89b39..edbf1de 100644 --- a/src/zcl_excel_reader_2007.clas.abap +++ b/src/zcl_excel_reader_2007.clas.abap @@ -106,6 +106,13 @@ CLASS zcl_excel_reader_2007 DEFINITION END OF t_shared_string . TYPES: t_shared_strings TYPE STANDARD TABLE OF t_shared_string WITH DEFAULT KEY . + TYPES: + BEGIN OF t_table, + id TYPE string, + target TYPE string, + END OF t_table . + TYPES: + t_tables TYPE HASHED TABLE OF t_table WITH UNIQUE KEY id . DATA shared_strings TYPE t_shared_strings . DATA styles TYPE t_style_refs . @@ -268,6 +275,15 @@ CLASS zcl_excel_reader_2007 DEFINITION !io_worksheet TYPE REF TO zcl_excel_worksheet RAISING zcx_excel . + "!

Load worksheet tables

+ METHODS load_worksheet_tables + IMPORTING + io_ixml_worksheet TYPE REF TO if_ixml_document + io_worksheet TYPE REF TO zcl_excel_worksheet + iv_dirname TYPE string + it_tables TYPE t_tables + RAISING + zcx_excel . CLASS-METHODS resolve_path IMPORTING !ip_path TYPE string @@ -2314,6 +2330,7 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. lc_rel_hyperlink TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink', lc_rel_comments TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments', lc_rel_printer TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings'. + CONSTANTS lc_rel_table TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/table'. DATA: lo_ixml_worksheet TYPE REF TO if_ixml_document, lo_ixml_cells TYPE REF TO if_ixml_node_collection, @@ -2408,6 +2425,8 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. lt_datavalidation_range TYPE TABLE OF string, lt_rtf TYPE zexcel_t_rtf, ex TYPE REF TO cx_root. + DATA lt_tables TYPE t_tables. + DATA ls_table TYPE t_table. FIELD-SYMBOLS: TYPE t_shared_string. @@ -2478,6 +2497,10 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. CATCH zcx_excel. ENDTRY. + WHEN lc_rel_table. + MOVE-CORRESPONDING ls_relationship TO ls_table. + INSERT ls_table INTO TABLE lt_tables. + WHEN OTHERS. ENDCASE. @@ -2501,6 +2524,16 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. ENDIF. ENDIF. + " Read tables (must be done before loading sheet contents) + TRY. + me->load_worksheet_tables( io_ixml_worksheet = lo_ixml_worksheet + io_worksheet = io_worksheet + iv_dirname = lv_dirname + it_tables = lt_tables ). + CATCH zcx_excel. " Ignore reading errors - pass everything we were able to identify + ENDTRY. + + " Sheet contents lo_ixml_rows = lo_ixml_worksheet->get_elements_by_tag_name_ns( name = 'row' uri = namespace-main ). lo_ixml_iterator = lo_ixml_rows->create_iterator( ). lo_ixml_row_elem ?= lo_ixml_iterator->get_next( ). @@ -3885,6 +3918,130 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. ENDMETHOD. + METHOD load_worksheet_tables. + + DATA lo_ixml_table_columns TYPE REF TO if_ixml_node_collection. + DATA lo_ixml_table_column TYPE REF TO if_ixml_element. + DATA lo_ixml_table TYPE REF TO if_ixml_element. + DATA lo_ixml_table_style TYPE REF TO if_ixml_element. + DATA lt_field_catalog TYPE zexcel_t_fieldcatalog. + DATA ls_field_catalog TYPE zexcel_s_fieldcatalog. + DATA lo_ixml_iterator TYPE REF TO if_ixml_node_iterator. + DATA ls_table_settings TYPE zexcel_s_table_settings. + DATA lv_path TYPE string. + DATA lt_components TYPE abap_component_tab. + DATA ls_component TYPE abap_componentdescr. + DATA lo_rtti_table TYPE REF TO cl_abap_tabledescr. + DATA lv_dref_table TYPE REF TO data. + DATA lv_num_lines TYPE i. + DATA lo_line_type TYPE REF TO cl_abap_structdescr. + + DATA: BEGIN OF ls_table, + id TYPE string, + name TYPE string, + displayname TYPE string, + ref TYPE string, + totalsrowshown TYPE string, + END OF ls_table. + + DATA: BEGIN OF ls_table_style, + name TYPE string, + showrowstripes TYPE string, + showcolumnstripes TYPE string, + END OF ls_table_style. + + DATA: BEGIN OF ls_table_column, + id TYPE string, + name TYPE string, + END OF ls_table_column. + + FIELD-SYMBOLS LIKE LINE OF it_tables. + FIELD-SYMBOLS TYPE STANDARD TABLE. + FIELD-SYMBOLS TYPE zexcel_s_fieldcatalog. + + LOOP AT it_tables ASSIGNING . + + CONCATENATE iv_dirname -target INTO lv_path. + lv_path = resolve_path( lv_path ). + + lo_ixml_table = me->get_ixml_from_zip_archive( lv_path )->get_root_element( ). + fill_struct_from_attributes( EXPORTING + ip_element = lo_ixml_table + CHANGING + cp_structure = ls_table ). + + lo_ixml_table_style ?= lo_ixml_table->find_from_name( 'tableStyleInfo' ). + fill_struct_from_attributes( EXPORTING + ip_element = lo_ixml_table_style + CHANGING + cp_structure = ls_table_style ). + + ls_table_settings-table_name = ls_table-name. + ls_table_settings-table_style = ls_table_style-name. + ls_table_settings-show_column_stripes = boolc( ls_table_style-showcolumnstripes = '1' ). + ls_table_settings-show_row_stripes = boolc( ls_table_style-showrowstripes = '1' ). + + zcl_excel_common=>convert_range2column_a_row( + EXPORTING + i_range = ls_table-ref + IMPORTING + e_column_start = ls_table_settings-top_left_column + e_column_end = ls_table_settings-bottom_right_column + e_row_start = ls_table_settings-top_left_row + e_row_end = ls_table_settings-bottom_right_row ). + + lo_ixml_table_columns = lo_ixml_table->get_elements_by_tag_name( name = 'tableColumn' ). + lo_ixml_iterator = lo_ixml_table_columns->create_iterator( ). + lo_ixml_table_column ?= lo_ixml_iterator->get_next( ). + CLEAR lt_field_catalog. + WHILE lo_ixml_table_column IS BOUND. + + CLEAR ls_table_column. + fill_struct_from_attributes( EXPORTING + ip_element = lo_ixml_table_column + CHANGING + cp_structure = ls_table_column ). + + ls_field_catalog-position = lines( lt_field_catalog ) + 1. + ls_field_catalog-fieldname = |COMP_{ ls_field_catalog-position PAD = '0' ALIGN = RIGHT WIDTH = 4 }|. + ls_field_catalog-scrtext_l = ls_table_column-name. + ls_field_catalog-dynpfld = abap_true. + ls_field_catalog-abap_type = cl_abap_typedescr=>typekind_string. + APPEND ls_field_catalog TO lt_field_catalog. + + lo_ixml_table_column ?= lo_ixml_iterator->get_next( ). + + ENDWHILE. + + CLEAR lt_components. + LOOP AT lt_field_catalog ASSIGNING . + CLEAR ls_component. + ls_component-name = -fieldname. + ls_component-type = cl_abap_elemdescr=>get_string( ). + APPEND ls_component TO lt_components. + ENDLOOP. + + lo_line_type = cl_abap_structdescr=>get( lt_components ). + lo_rtti_table = cl_abap_tabledescr=>get( lo_line_type ). + CREATE DATA lv_dref_table TYPE HANDLE lo_rtti_table. + ASSIGN lv_dref_table->* TO . + + lv_num_lines = ls_table_settings-bottom_right_row - ls_table_settings-top_left_row. + DO lv_num_lines TIMES. + APPEND INITIAL LINE TO . + ENDDO. + + io_worksheet->bind_table( + EXPORTING + ip_table = + it_field_catalog = lt_field_catalog + is_table_settings = ls_table_settings ). + + ENDLOOP. + + ENDMETHOD. + + METHOD read_from_applserver. DATA: lv_filelength TYPE i, diff --git a/src/zcl_excel_reader_2007.clas.xml b/src/zcl_excel_reader_2007.clas.xml index d7843d3..e03ffa7 100644 --- a/src/zcl_excel_reader_2007.clas.xml +++ b/src/zcl_excel_reader_2007.clas.xml @@ -253,6 +253,11 @@ E Loads pagemargings of worksheet
+ + LOAD_WORKSHEET_TABLES + E + Load worksheet tables + MT_DXF_STYLES E From 92809a41e342db00dca2031ef2cdd1597f98e7bf Mon Sep 17 00:00:00 2001 From: HuprichTo <45813255+HuprichT@users.noreply.github.com> Date: Thu, 11 Jan 2024 17:35:46 +0100 Subject: [PATCH 18/47] Fix unescape string value when not escpaped (#1160) * BUGFIX: Skip Input without escaped Character Some special Values, e.g. "TEST_X" were handled like it was an escaped Character, thats because it was not checked if the second conition, an "_" behind it was there * Adjust Package Description to its Original * Remove commented Code Was there for testing, not needed anymore * Downport to 7.02 Adjust Method Call to apply 7.02 Syntax * Fix abaplint Issues * Fix abaplint Issues (again) --------- Fix #1122 Co-authored-by: sandraros <34005250+sandraros@users.noreply.github.com> --- src/zcl_excel_reader_2007.clas.abap | 51 ++++++++++++++----- ...cl_excel_reader_2007.clas.testclasses.abap | 15 ++++++ 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/src/zcl_excel_reader_2007.clas.abap b/src/zcl_excel_reader_2007.clas.abap index edbf1de..9eef36a 100644 --- a/src/zcl_excel_reader_2007.clas.abap +++ b/src/zcl_excel_reader_2007.clas.abap @@ -306,7 +306,12 @@ CLASS zcl_excel_reader_2007 DEFINITION iv_path TYPE string !ip_excel TYPE REF TO zcl_excel RAISING - zcx_excel . + zcx_excel. + METHODS provided_string_is_escaped + IMPORTING + !value TYPE string + RETURNING + VALUE(is_escaped) TYPE abap_bool. CONSTANTS: BEGIN OF namespace, x14ac TYPE string VALUE 'http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac', @@ -4280,17 +4285,21 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. METHOD unescape_string_value. - DATA: lt_character_positions TYPE TABLE OF i, - lv_character_position TYPE i, - lv_character_position_plus_2 TYPE i, - lv_character_position_plus_6 TYPE i, - lv_unescaped_value TYPE string. + DATA: + "Marks the Position before the searched Pattern occurs in the String + "For example in String A_X_TEST_X, the Table is filled with 1 and 8 + lt_character_positions TYPE TABLE OF i, + lv_character_position TYPE i, + lv_character_position_plus_2 TYPE i, + lv_character_position_plus_6 TYPE i, + lv_unescaped_value TYPE string. - " The text "_x...._", with "_x" not "_X", with exactly 4 ".", each being 0-9 a-f or A-F (case insensitive), is interpreted - " like Unicode character U+.... (e.g. "_x0041_" is rendered like "A") is for characters. + " The text "_x...._", with "_x" not "_X". Each "." represents one character, being 0-9 a-f or A-F (case insensitive), + " is interpreted like Unicode character U+.... (e.g. "_x0041_" is rendered like "A") is for characters. " To not interpret it, Excel replaces the first "_" with "_x005f_". result = i_value. - IF result CS '_x'. + + IF provided_string_is_escaped( i_value ) = abap_true. CLEAR lt_character_positions. APPEND sy-fdpos TO lt_character_positions. lv_character_position = sy-fdpos + 1. @@ -4303,10 +4312,11 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. LOOP AT lt_character_positions INTO lv_character_position. lv_character_position_plus_2 = lv_character_position + 2. lv_character_position_plus_6 = lv_character_position + 6. - IF substring( val = result off = lv_character_position_plus_2 len = 4 ) CO '0123456789ABCDEFGHIJKLMNOPQRSTUVWabcdefghijklmnopqrstuvw' - AND substring( val = result off = lv_character_position_plus_6 len = 1 ) = '_'. - lv_unescaped_value = cl_abap_conv_in_ce=>uccp( to_upper( substring( val = result off = lv_character_position_plus_2 len = 4 ) ) ). - REPLACE SECTION OFFSET lv_character_position LENGTH 7 OF result WITH lv_unescaped_value. + IF substring( val = result off = lv_character_position_plus_2 len = 4 ) CO '0123456789ABCDEFabcdef'. + IF substring( val = result off = lv_character_position_plus_6 len = 1 ) = '_'. + lv_unescaped_value = cl_abap_conv_in_ce=>uccp( to_upper( substring( val = result off = lv_character_position_plus_2 len = 4 ) ) ). + REPLACE SECTION OFFSET lv_character_position LENGTH 7 OF result WITH lv_unescaped_value. + ENDIF. ENDIF. ENDLOOP. ENDIF. @@ -4429,4 +4439,19 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. iv_zcl_excel_classname = iv_zcl_excel_classname ). ENDMETHOD. + METHOD provided_string_is_escaped. + + "Check if passed value is really an escaped Character + IF value CS '_x'. + is_escaped = abap_true. + TRY. + IF substring( val = value off = sy-fdpos + 6 len = 1 ) <> '_'. + is_escaped = abap_false. + ENDIF. + CATCH cx_sy_range_out_of_bounds. + is_escaped = abap_false. + ENDTRY. + ENDIF. + ENDMETHOD. + ENDCLASS. diff --git a/src/zcl_excel_reader_2007.clas.testclasses.abap b/src/zcl_excel_reader_2007.clas.testclasses.abap index 8d0f7a9..9d47491 100644 --- a/src/zcl_excel_reader_2007.clas.testclasses.abap +++ b/src/zcl_excel_reader_2007.clas.testclasses.abap @@ -15,6 +15,7 @@ CLASS ltc_unescape_string_value DEFINITION METHODS no_escaping FOR TESTING. METHODS one_escaped_character FOR TESTING. METHODS two_escaped_characters FOR TESTING. + METHODS skip_when_not_escaped FOR TESTING RAISING cx_static_check. METHODS run_cut IMPORTING @@ -52,4 +53,18 @@ CLASS ltc_unescape_string_value IMPLEMENTATION. run_cut( input = '_x0000_ and _xFFFF_' exp = |{ cl_abap_conv_in_ce=>uccp( '0000' ) } and { cl_abap_conv_in_ce=>uccp( 'FFFF' ) }| ). ENDMETHOD. + METHOD skip_when_not_escaped. + DATA: lo_excel TYPE REF TO zcl_excel_reader_2007, + value TYPE string VALUE 'TEST_X'. + + CREATE OBJECT lo_excel. + + "Method is used to check for "_x", but its not an escaped charcater, output should input. + lo_excel->unescape_string_value( i_value = value ). + + cl_abap_unit_assert=>assert_equals( + exp = value + act = value ). + ENDMETHOD. + ENDCLASS. From 6bb02920dfca9a210f1d623d2c82daddf17a0ca5 Mon Sep 17 00:00:00 2001 From: Attila Berencsi Date: Sun, 14 Jan 2024 14:43:22 +0100 Subject: [PATCH 19/47] Address DDIC Issues on BTP ABAP Environment: SAP_BASIS 794 (SAPK-79406INSAPBASIS 0006) (#1169) * Address DDIC Issues on BTP ABAP Environment. SAP_BASIS 794 (SAPK-79406INSAPBASIS 0006) * Move DynPro related DDIC to NOT_CLOUD package * Remove one langu from DTEL, DOMA 2 see git changes * Remove non-english translations for copied data elements for cloud * Package assignment and diff cleanup Moved from package _NOT_CLOUD to - ZEXCEL_S_FIELDCATALOG Moved from package to _NOT_CLOUD: - ZEXCEL_T_CONVERTER_COL - ZEXCEL_T_CONVERTER_FCAT - ZIF_EXCEL_CONVERTER "No change" (latest abapGit version indicates a Diff but details give message "no diff" - abapGit bug?), let's see if it solves: - /src/not_cloud/zexcel_component_position.dtel.xml - /src/not_cloud/zexcel_convexit.doma.xml - /src/not_cloud/zexcel_convexit.dtel.xml - /src/not_cloud/zexcel_ddic_flag.doma.xml - /src/not_cloud/zexcel_disp_text_long.doma.xml - /src/not_cloud/zexcel_disp_text_long.dtel.xml - /src/not_cloud/zexcel_disp_text_medium.dtel.xml - /src/not_cloud/zexcel_disp_text_short.doma.xml - /src/not_cloud/zexcel_disp_text_short.dtel.xml - /src/not_cloud/zexcel_screen_display.dtel.xml --------- Co-authored-by: 04c82057-cb12-4722-bad9-5d002feb93ac Co-authored-by: sandraros --- src/not_cloud/zexcel_column_id.dtel.xml | 24 +++++++++ .../zexcel_component_position.dtel.xml | 26 ++++++++++ src/not_cloud/zexcel_convexit.doma.xml | 17 +++++++ src/not_cloud/zexcel_convexit.dtel.xml | 25 +++++++++ src/not_cloud/zexcel_ddic_flag.doma.xml | 31 +++++++++++ src/not_cloud/zexcel_disp_text_long.doma.xml | 18 +++++++ src/not_cloud/zexcel_disp_text_long.dtel.xml | 26 ++++++++++ .../zexcel_disp_text_medium.doma.xml | 18 +++++++ .../zexcel_disp_text_medium.dtel.xml | 26 ++++++++++ src/not_cloud/zexcel_disp_text_short.doma.xml | 18 +++++++ src/not_cloud/zexcel_disp_text_short.dtel.xml | 26 ++++++++++ .../zexcel_key_color_override.dtel.xml | 15 ++++++ .../zexcel_s_converter_col.tabl.xml | 3 +- .../zexcel_s_converter_fcat.tabl.xml | 51 +++---------------- src/not_cloud/zexcel_screen_display.dtel.xml | 24 +++++++++ .../zexcel_t_converter_col.ttyp.xml | 0 .../zexcel_t_converter_fcat.ttyp.xml | 0 .../zif_excel_converter.intf.abap | 0 .../zif_excel_converter.intf.xml | 0 src/package.devc.xml | 2 +- src/zexcel_s_fieldcatalog.tabl.xml | 10 ++-- 21 files changed, 309 insertions(+), 51 deletions(-) create mode 100644 src/not_cloud/zexcel_column_id.dtel.xml create mode 100644 src/not_cloud/zexcel_component_position.dtel.xml create mode 100644 src/not_cloud/zexcel_convexit.doma.xml create mode 100644 src/not_cloud/zexcel_convexit.dtel.xml create mode 100644 src/not_cloud/zexcel_ddic_flag.doma.xml create mode 100644 src/not_cloud/zexcel_disp_text_long.doma.xml create mode 100644 src/not_cloud/zexcel_disp_text_long.dtel.xml create mode 100644 src/not_cloud/zexcel_disp_text_medium.doma.xml create mode 100644 src/not_cloud/zexcel_disp_text_medium.dtel.xml create mode 100644 src/not_cloud/zexcel_disp_text_short.doma.xml create mode 100644 src/not_cloud/zexcel_disp_text_short.dtel.xml create mode 100644 src/not_cloud/zexcel_key_color_override.dtel.xml rename src/{ => not_cloud}/zexcel_s_converter_col.tabl.xml (93%) rename src/{ => not_cloud}/zexcel_s_converter_fcat.tabl.xml (77%) create mode 100644 src/not_cloud/zexcel_screen_display.dtel.xml rename src/{ => not_cloud}/zexcel_t_converter_col.ttyp.xml (100%) rename src/{ => not_cloud}/zexcel_t_converter_fcat.ttyp.xml (100%) rename src/{ => not_cloud}/zif_excel_converter.intf.abap (100%) rename src/{ => not_cloud}/zif_excel_converter.intf.xml (100%) diff --git a/src/not_cloud/zexcel_column_id.dtel.xml b/src/not_cloud/zexcel_column_id.dtel.xml new file mode 100644 index 0000000..2644390 --- /dev/null +++ b/src/not_cloud/zexcel_column_id.dtel.xml @@ -0,0 +1,24 @@ + + + + + + ZEXCEL_COLUMN_ID + E + 30 + 10 + 15 + 20 + ALV control: Column ID + Column ID + Column ID + Column ID + Column ID + D + INT4 + 000010 + 000011 + + + + diff --git a/src/not_cloud/zexcel_component_position.dtel.xml b/src/not_cloud/zexcel_component_position.dtel.xml new file mode 100644 index 0000000..fab73ef --- /dev/null +++ b/src/not_cloud/zexcel_component_position.dtel.xml @@ -0,0 +1,26 @@ + + + + + + ZEXCEL_COMPONENT_POSITION + E + 06 + 10 + 15 + 20 + Position of the field in the table + TabPos + Table pos. + Table position + Table position + SDIC + 01 + D + NUMC + 000004 + 000004 + + + + diff --git a/src/not_cloud/zexcel_convexit.doma.xml b/src/not_cloud/zexcel_convexit.doma.xml new file mode 100644 index 0000000..9658b25 --- /dev/null +++ b/src/not_cloud/zexcel_convexit.doma.xml @@ -0,0 +1,17 @@ + + + + + + ZEXCEL_CONVEXIT + E + CHAR + 000005 + 000005 + Conversion routine + SDIC + 01 + + + + diff --git a/src/not_cloud/zexcel_convexit.dtel.xml b/src/not_cloud/zexcel_convexit.dtel.xml new file mode 100644 index 0000000..be27ee0 --- /dev/null +++ b/src/not_cloud/zexcel_convexit.dtel.xml @@ -0,0 +1,25 @@ + + + + + + ZEXCEL_CONVEXIT + E + ZEXCEL_CONVEXIT + 30 + 10 + 15 + 20 + Conversion Routine + Conversion Routine + Conv.Rout. + Convers. Rout. + Conversion Routine + SDIC + 01 + D + D + + + + diff --git a/src/not_cloud/zexcel_ddic_flag.doma.xml b/src/not_cloud/zexcel_ddic_flag.doma.xml new file mode 100644 index 0000000..b09e22e --- /dev/null +++ b/src/not_cloud/zexcel_ddic_flag.doma.xml @@ -0,0 +1,31 @@ + + + + + + ZEXCEL_DDIC_FLAG + E + CHAR + 000001 + 000001 + X + Flag (X or blank) + SDIC + 01 + + + + 0001 + E + Do not set flag + + + 0002 + E + X + Set flag + + + + + diff --git a/src/not_cloud/zexcel_disp_text_long.doma.xml b/src/not_cloud/zexcel_disp_text_long.doma.xml new file mode 100644 index 0000000..47a1290 --- /dev/null +++ b/src/not_cloud/zexcel_disp_text_long.doma.xml @@ -0,0 +1,18 @@ + + + + + + ZEXCEL_DISP_TEXT_LONG + E + CHAR + 000040 + 000040 + X + Long keyword + SDIC + 01 + + + + diff --git a/src/not_cloud/zexcel_disp_text_long.dtel.xml b/src/not_cloud/zexcel_disp_text_long.dtel.xml new file mode 100644 index 0000000..61b0229 --- /dev/null +++ b/src/not_cloud/zexcel_disp_text_long.dtel.xml @@ -0,0 +1,26 @@ + + + + + + ZEXCEL_DISP_TEXT_LONG + E + ZEXCEL_DISP_TEXT_LONG + 30 + 10 + 15 + 20 + Long Field Label + Long Field Label + Long + Long Fld Label + Long field label + SDIC + 01 + D + SCRTEXT_L + D + + + + diff --git a/src/not_cloud/zexcel_disp_text_medium.doma.xml b/src/not_cloud/zexcel_disp_text_medium.doma.xml new file mode 100644 index 0000000..96832cd --- /dev/null +++ b/src/not_cloud/zexcel_disp_text_medium.doma.xml @@ -0,0 +1,18 @@ + + + + + + ZEXCEL_DISP_TEXT_MEDIUM + E + CHAR + 000020 + 000020 + X + Medium keyword + SDIC + 01 + + + + diff --git a/src/not_cloud/zexcel_disp_text_medium.dtel.xml b/src/not_cloud/zexcel_disp_text_medium.dtel.xml new file mode 100644 index 0000000..d4676ee --- /dev/null +++ b/src/not_cloud/zexcel_disp_text_medium.dtel.xml @@ -0,0 +1,26 @@ + + + + + + ZEXCEL_DISP_TEXT_MEDIUM + E + ZEXCEL_DISP_TEXT_MEDIUM + 30 + 10 + 15 + 20 + Medium Field Label + Medium Field Label + Medium + Medium Label + Medium Field Label + SDIC + 01 + D + SCRTEXT_M + D + + + + diff --git a/src/not_cloud/zexcel_disp_text_short.doma.xml b/src/not_cloud/zexcel_disp_text_short.doma.xml new file mode 100644 index 0000000..283f0a5 --- /dev/null +++ b/src/not_cloud/zexcel_disp_text_short.doma.xml @@ -0,0 +1,18 @@ + + + + + + ZEXCEL_DISP_TEXT_SHORT + E + CHAR + 000010 + 000010 + X + Short keyword + SDIC + 01 + + + + diff --git a/src/not_cloud/zexcel_disp_text_short.dtel.xml b/src/not_cloud/zexcel_disp_text_short.dtel.xml new file mode 100644 index 0000000..c322e85 --- /dev/null +++ b/src/not_cloud/zexcel_disp_text_short.dtel.xml @@ -0,0 +1,26 @@ + + + + + + ZEXCEL_DISP_TEXT_SHORT + E + ZEXCEL_DISP_TEXT_SHORT + 30 + 10 + 15 + 20 + Short Field Label + Short field label + Short + ShortFieldLabel + Short field label + SDIC + 01 + D + SCRTEXT_S + D + + + + diff --git a/src/not_cloud/zexcel_key_color_override.dtel.xml b/src/not_cloud/zexcel_key_color_override.dtel.xml new file mode 100644 index 0000000..4f09479 --- /dev/null +++ b/src/not_cloud/zexcel_key_color_override.dtel.xml @@ -0,0 +1,15 @@ + + + + + + ZEXCEL_KEY_COLOR_OVERRIDE + E + CHAR1 + ALV control: Override key color + D + D + + + + diff --git a/src/zexcel_s_converter_col.tabl.xml b/src/not_cloud/zexcel_s_converter_col.tabl.xml similarity index 93% rename from src/zexcel_s_converter_col.tabl.xml rename to src/not_cloud/zexcel_s_converter_col.tabl.xml index 15120b6..3532afa 100644 --- a/src/zexcel_s_converter_col.tabl.xml +++ b/src/not_cloud/zexcel_s_converter_col.tabl.xml @@ -7,6 +7,7 @@ E INTTAB Color information for cells + E 3 @@ -36,7 +37,7 @@ NOKEYCOL - LVC_NOKEYC + ZEXCEL_KEY_COLOR_OVERRIDE 0 E diff --git a/src/zexcel_s_converter_fcat.tabl.xml b/src/not_cloud/zexcel_s_converter_fcat.tabl.xml similarity index 77% rename from src/zexcel_s_converter_fcat.tabl.xml rename to src/not_cloud/zexcel_s_converter_fcat.tabl.xml index b0281b5..23bc9e0 100644 --- a/src/zexcel_s_converter_fcat.tabl.xml +++ b/src/not_cloud/zexcel_s_converter_fcat.tabl.xml @@ -7,15 +7,14 @@ E INTTAB Field catalog for converter + E 4 TABNAME TABNAME - DD02L 0 - P E @@ -32,7 +31,7 @@ POSITION - TABFDPOS + ZEXCEL_COMPONENT_POSITION 0 E @@ -54,19 +53,19 @@ SCRTEXT_S - SCRTEXT_S + ZEXCEL_DISP_TEXT_SHORT 0 E SCRTEXT_M - SCRTEXT_M + ZEXCEL_DISP_TEXT_MEDIUM 0 E SCRTEXT_L - SCRTEXT_L + ZEXCEL_DISP_TEXT_LONG 0 E @@ -160,53 +159,17 @@ COL_ID - LVC_COLID + ZEXCEL_COLUMN_ID 0 E CONVEXIT - CONVEXIT + ZEXCEL_CONVEXIT 0 E - - - TABNAME - ZEXCEL_S_CONVERTER_FCAT - TABNAME - DD02L - TABNAME - 0001 - AS4TAB - CHAR - - - TABNAME - 'A' - DD02L - AS4LOCAL - 0002 - AS4LOCAL - CHAR - - - TABNAME - '0000' - DD02L - AS4VERS - 0003 - AS4VERS - NUMC - - - - - TABNAME - DD02L - - diff --git a/src/not_cloud/zexcel_screen_display.dtel.xml b/src/not_cloud/zexcel_screen_display.dtel.xml new file mode 100644 index 0000000..524eeac --- /dev/null +++ b/src/not_cloud/zexcel_screen_display.dtel.xml @@ -0,0 +1,24 @@ + + + + + + ZEXCEL_SCREEN_DISPLAY + E + ZEXCEL_DDIC_FLAG + 02 + 10 + 15 + 20 + Flag: Field is displayed on dynpro + SF + Dynpro + Screen field + Screen field + SDIC + D + D + + + + diff --git a/src/zexcel_t_converter_col.ttyp.xml b/src/not_cloud/zexcel_t_converter_col.ttyp.xml similarity index 100% rename from src/zexcel_t_converter_col.ttyp.xml rename to src/not_cloud/zexcel_t_converter_col.ttyp.xml diff --git a/src/zexcel_t_converter_fcat.ttyp.xml b/src/not_cloud/zexcel_t_converter_fcat.ttyp.xml similarity index 100% rename from src/zexcel_t_converter_fcat.ttyp.xml rename to src/not_cloud/zexcel_t_converter_fcat.ttyp.xml diff --git a/src/zif_excel_converter.intf.abap b/src/not_cloud/zif_excel_converter.intf.abap similarity index 100% rename from src/zif_excel_converter.intf.abap rename to src/not_cloud/zif_excel_converter.intf.abap diff --git a/src/zif_excel_converter.intf.xml b/src/not_cloud/zif_excel_converter.intf.xml similarity index 100% rename from src/zif_excel_converter.intf.xml rename to src/not_cloud/zif_excel_converter.intf.xml diff --git a/src/package.devc.xml b/src/package.devc.xml index 90924fd..cf411f3 100644 --- a/src/package.devc.xml +++ b/src/package.devc.xml @@ -3,7 +3,7 @@ - Spreadsheet libraries + ABAP2XLSX diff --git a/src/zexcel_s_fieldcatalog.tabl.xml b/src/zexcel_s_fieldcatalog.tabl.xml index 8bdbe28..2b77705 100644 --- a/src/zexcel_s_fieldcatalog.tabl.xml +++ b/src/zexcel_s_fieldcatalog.tabl.xml @@ -25,31 +25,31 @@ POSITION - TABFDPOS + ZEXCEL_COMPONENT_POSITION 0 E SCRTEXT_S - SCRTEXT_S + ZEXCEL_DISP_TEXT_SHORT 0 E SCRTEXT_M - SCRTEXT_M + ZEXCEL_DISP_TEXT_MEDIUM 0 E SCRTEXT_L - SCRTEXT_L + ZEXCEL_DISP_TEXT_LONG 0 E DYNPFLD - DYNPROFLD + ZEXCEL_SCREEN_DISPLAY 0 X F From 5f784c8ed63d4dd5bf2d8c2c922e33fe428ba5aa Mon Sep 17 00:00:00 2001 From: sandraros <34005250+sandraros@users.noreply.github.com> Date: Fri, 19 Jan 2024 21:37:06 +0100 Subject: [PATCH 20/47] Fix zoom information in reader and writer (#1177) Fix #1176 --- src/zcl_excel_reader_2007.clas.abap | 20 ++++++++++++------- ...zcl_excel_writer_2007.clas.locals_imp.abap | 18 +++++++++-------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/zcl_excel_reader_2007.clas.abap b/src/zcl_excel_reader_2007.clas.abap index 9eef36a..3b577d0 100644 --- a/src/zcl_excel_reader_2007.clas.abap +++ b/src/zcl_excel_reader_2007.clas.abap @@ -2253,12 +2253,15 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. END OF lty_column. TYPES: BEGIN OF lty_sheetview, - showgridlines TYPE zexcel_show_gridlines, - tabselected TYPE string, - zoomscalenormal TYPE string, - workbookviewid TYPE string, - showrowcolheaders TYPE string, - righttoleft TYPE string, + showgridlines TYPE zexcel_show_gridlines, + tabselected TYPE string, + zoomscale TYPE string, + zoomscalenormal TYPE string, + zoomscalepagelayoutview TYPE string, + zoomscalesheetlayoutview TYPE string, + workbookviewid TYPE string, + showrowcolheaders TYPE string, + righttoleft TYPE string, END OF lty_sheetview. TYPES: BEGIN OF lty_mergecell, @@ -2805,7 +2808,10 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. OR ls_sheetview-righttoleft = lc_xml_attr_true_int. io_worksheet->zif_excel_sheet_properties~set_right_to_left( abap_true ). ENDIF. - + io_worksheet->zif_excel_sheet_properties~zoomscale = ls_sheetview-zoomscale. + io_worksheet->zif_excel_sheet_properties~zoomscale_normal = ls_sheetview-zoomscalenormal. + io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview = ls_sheetview-zoomscalepagelayoutview. + io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview = ls_sheetview-zoomscalesheetlayoutview. "Add merge cell information lo_ixml_mergecells = lo_ixml_worksheet->get_elements_by_tag_name_ns( name = 'mergeCell' uri = namespace-main ). diff --git a/src/zcl_excel_writer_2007.clas.locals_imp.abap b/src/zcl_excel_writer_2007.clas.locals_imp.abap index 988607c..7e01e73 100644 --- a/src/zcl_excel_writer_2007.clas.locals_imp.abap +++ b/src/zcl_excel_writer_2007.clas.locals_imp.abap @@ -327,15 +327,17 @@ CLASS lcl_create_xl_sheet IMPLEMENTATION. value = '0' ). ENDIF. " Zoom scale - IF o_worksheet->zif_excel_sheet_properties~zoomscale GT 400. - o_worksheet->zif_excel_sheet_properties~zoomscale = 400. - ELSEIF o_worksheet->zif_excel_sheet_properties~zoomscale LT 10. - o_worksheet->zif_excel_sheet_properties~zoomscale = 10. + IF o_worksheet->zif_excel_sheet_properties~zoomscale NE 0. + IF o_worksheet->zif_excel_sheet_properties~zoomscale GT 400. + o_worksheet->zif_excel_sheet_properties~zoomscale = 400. + ELSEIF o_worksheet->zif_excel_sheet_properties~zoomscale LT 10. + o_worksheet->zif_excel_sheet_properties~zoomscale = 10. + ENDIF. + lv_value = o_worksheet->zif_excel_sheet_properties~zoomscale. + CONDENSE lv_value. + lo_element_2->set_attribute_ns( name = lc_xml_attr_zoomscale + value = lv_value ). ENDIF. - lv_value = o_worksheet->zif_excel_sheet_properties~zoomscale. - CONDENSE lv_value. - lo_element_2->set_attribute_ns( name = lc_xml_attr_zoomscale - value = lv_value ). IF o_worksheet->zif_excel_sheet_properties~zoomscale_normal NE 0. IF o_worksheet->zif_excel_sheet_properties~zoomscale_normal GT 400. o_worksheet->zif_excel_sheet_properties~zoomscale_normal = 400. From b4a79ebe6cbd5edf200b26a2f444000ff93e1808 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Mon, 29 Jan 2024 07:18:57 +0100 Subject: [PATCH 21/47] start unit testing setup (#872) --- .github/workflows/unit.yml | 17 +++++++ .gitignore | 6 +++ .npmrc | 1 + abap_transpile.json | 60 ++++++++++++++++++++++++ package.json | 16 +++++++ test/cl_excel_test.clas.abap | 37 +++++++++++++++ test/cl_excel_test.clas.testclasses.abap | 10 ++++ test/mimetypes.tabl.xml | 34 ++++++++++++++ test/run.mjs | 9 ++++ 9 files changed, 190 insertions(+) create mode 100644 .github/workflows/unit.yml create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 abap_transpile.json create mode 100644 package.json create mode 100644 test/cl_excel_test.clas.abap create mode 100644 test/cl_excel_test.clas.testclasses.abap create mode 100644 test/mimetypes.tabl.xml create mode 100644 test/run.mjs diff --git a/.github/workflows/unit.yml b/.github/workflows/unit.yml new file mode 100644 index 0000000..0cedc7a --- /dev/null +++ b/.github/workflows/unit.yml @@ -0,0 +1,17 @@ +name: unit + +on: + pull_request: + +permissions: + contents: read + +jobs: + unit: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + - run: npm install + - run: npm test \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dc55a52 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +node_modules/ +package-lock.json +output +foo.zip +foo.xlsx +foo \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..97b895e --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +ignore-scripts=true diff --git a/abap_transpile.json b/abap_transpile.json new file mode 100644 index 0000000..3bc587c --- /dev/null +++ b/abap_transpile.json @@ -0,0 +1,60 @@ +{ + "input_folder": "{src,test}", + "input_filter": [ + "src/zcl_excel_a", + "src/zcl_excel_c", + "src/zcl_excel_d", + "src/zcl_excel_fill_template", + "src/zcl_excel_font TODO, missing TDFONTSIZE", + "src/zcl_excel_g", + "src/zcl_excel_h", + "src/zcl_excel_l", + "src/zcl_excel_o", + "src/zcl_excel_r", + "src/zcl_excel_s", + "src/zcl_excel_t", + "src/zcl_excel_w", + "src/zcl_excel.clas", + "src/zcx_", + "src/zexcel_.*doma", + "src/zexcel_.*dtel", + "src/not_cloud/zexcel_.*dtel", + "src/not_cloud/zexcel_.*doma", + "src/zexcel_c", + "src/zexcel_p", + "src/zexcel_s", + "src/zexcel_t", + "src/zif_", + "test/" + ], + "output_folder": "output", + "lib": "https://github.com/open-abap/open-abap", + "write_unit_tests": true, + "write_source_map": true, + "options": { + "ignoreSyntaxCheck": false, + "addFilenames": true, + "addCommonJS": true, + "unknownTypes": "runtimeError", + "skip": [ + {"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_number", "note": "SXML in open-abap currently only handles json, todo"}, + {"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_shared_string", "note": "SXML in open-abap currently only handles json, todo"}, + {"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_shared_string_missing", "note": "??"}, + {"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_inline_string", "note": "??"}, + {"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_empty_cells", "note": "??"}, + {"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_boolean", "note": "SXML in open-abap currently only handles json, todo"}, + {"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_style", "note": "??"}, + {"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_style_missing", "note": "??"}, + {"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_formula", "note": "??"}, + {"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_read_shared_strings", "note": "??"}, + {"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_shared_string_some_empty", "note": "??"}, + {"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_shared_string_multi_style", "note": "??"}, + {"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_skip_to_inexistent", "note": "??"}, + + {"object": "ZCL_EXCEL_WRITER_2007", "class": "ltc_column_formula", "method": "one_column_formula", "note": "?? CALL TRANSFORMATION xml_header = 'no'"}, + {"object": "ZCL_EXCEL_WRITER_2007", "class": "ltc_column_formula", "method": "two_column_formulas", "note": "??"}, + + {"object": "ZCL_EXCEL_COMMON", "class": "lcl_excel_common_test", "method": "convert_column2int_oob_empty", "note": "?? sy value defaults"} + ] + } +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..f5817ab --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "license": "MIT", + "private": true, + "scripts": { + "test": "rm -rf output && abap_transpile abap_transpile.json && echo RUNNING && node output/index.mjs" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/abap2xlsx/abap2xlsx.git" + }, + "devDependencies": { + "@abaplint/cli": "^2.105.14", + "@abaplint/transpiler-cli": "^2.7.153", + "@abaplint/runtime": "^2.7.153" + } +} diff --git a/test/cl_excel_test.clas.abap b/test/cl_excel_test.clas.abap new file mode 100644 index 0000000..bdbe797 --- /dev/null +++ b/test/cl_excel_test.clas.abap @@ -0,0 +1,37 @@ +CLASS cl_excel_test DEFINITION PUBLIC. + PUBLIC SECTION. + CLASS-METHODS run + RETURNING VALUE(xdata) TYPE xstring + RAISING cx_static_check. +ENDCLASS. + +CLASS cl_excel_test IMPLEMENTATION. + METHOD run. + DATA lo_excel TYPE REF TO zcl_excel. + DATA lo_worksheet TYPE REF TO zcl_excel_worksheet. + DATA lo_hyperlink TYPE REF TO zcl_excel_hyperlink. + DATA lo_column TYPE REF TO zcl_excel_column. + DATA lv_date TYPE d. + DATA lv_time TYPE t. + DATA li_writer TYPE REF TO zif_excel_writer. + + CREATE OBJECT lo_excel. + lo_worksheet = lo_excel->get_active_worksheet( ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ). + lv_date = '20211231'. + lv_time = '055817'. + lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = lv_date ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = lv_time ). + lo_hyperlink = zcl_excel_hyperlink=>create_external_link( iv_url = 'https://abap2xlsx.github.io/abap2xlsx' ). + lo_worksheet->set_cell( ip_columnrow = 'B4' ip_value = 'Click here to visit abap2xlsx homepage' ip_hyperlink = lo_hyperlink ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 6 ip_value = '你好,世界' ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 6 ip_value = '(Chinese)' ). + lo_worksheet->set_cell( ip_column = 'B' ip_row = 7 ip_value = 'नमस्ते दुनिया' ). + lo_worksheet->set_cell( ip_column = 'C' ip_row = 7 ip_value = '(Hindi)' ). + lo_column = lo_worksheet->get_column( ip_column = 'B' ). + lo_column->set_width( ip_width = 11 ). + + CREATE OBJECT li_writer TYPE zcl_excel_writer_2007. + xdata = li_writer->write_file( lo_excel ). + ENDMETHOD. +ENDCLASS. \ No newline at end of file diff --git a/test/cl_excel_test.clas.testclasses.abap b/test/cl_excel_test.clas.testclasses.abap new file mode 100644 index 0000000..7749a2e --- /dev/null +++ b/test/cl_excel_test.clas.testclasses.abap @@ -0,0 +1,10 @@ +CLASS ltcl DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. + PUBLIC SECTION. + METHODS test FOR TESTING RAISING cx_static_check. +ENDCLASS. + +CLASS ltcl IMPLEMENTATION. + METHOD test. + cl_excel_test=>run( ). + ENDMETHOD. +ENDCLASS. \ No newline at end of file diff --git a/test/mimetypes.tabl.xml b/test/mimetypes.tabl.xml new file mode 100644 index 0000000..fc048f5 --- /dev/null +++ b/test/mimetypes.tabl.xml @@ -0,0 +1,34 @@ + + + + + + MIMETYPES + E + INTTAB + MIMETYPES + 1 + + + + TYPE + 0 + C + 000256 + CHAR + 000128 + CHAR + + + EXTENSION + 0 + C + 000128 + CHAR + 000064 + CHAR + + + + + diff --git a/test/run.mjs b/test/run.mjs new file mode 100644 index 0000000..4a081f0 --- /dev/null +++ b/test/run.mjs @@ -0,0 +1,9 @@ +import {initializeABAP} from "../output/init.mjs"; +import {cl_excel_test} from "../output/cl_excel_test.clas.mjs"; +import * as fs from "node:fs"; + +await initializeABAP(); + +const test = new cl_excel_test(); +const buf = Buffer.from((await test.run()).get().toLowerCase(), "hex"); +fs.writeFileSync("foo.xlsx", buf); \ No newline at end of file From 1148838a0f00999ae0537e7984aa25295cd7cf65 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Mon, 29 Jan 2024 07:21:05 +0100 Subject: [PATCH 22/47] add basic unit test for recursive_struct_to_class (#1124) * add basic unit test for recursive_struct_to_class * Update zcl_excel_common.clas.testclasses.abap --- src/zcl_excel_common.clas.testclasses.abap | 61 +++++++++++++++------- 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/src/zcl_excel_common.clas.testclasses.abap b/src/zcl_excel_common.clas.testclasses.abap index 26313f7..011dc9d 100644 --- a/src/zcl_excel_common.clas.testclasses.abap +++ b/src/zcl_excel_common.clas.testclasses.abap @@ -125,12 +125,14 @@ 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 recursive_struct_to_class FOR TESTING RAISING cx_static_check. 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. @@ -350,37 +352,37 @@ CLASS lcl_excel_common_test IMPLEMENTATION. METHOD convert_column_a_row2columnrow. - DATA: cell_coords TYPE string. + DATA: cell_coords TYPE string. - cell_coords = zcl_excel_common=>convert_column_a_row2columnrow( i_column = 'B' i_row = 6 ). + cell_coords = zcl_excel_common=>convert_column_a_row2columnrow( i_column = 'B' i_row = 6 ). - cl_abap_unit_assert=>assert_equals( act = cell_coords exp = 'B6' ). + cl_abap_unit_assert=>assert_equals( act = cell_coords exp = 'B6' ). - cell_coords = zcl_excel_common=>convert_column_a_row2columnrow( i_column = 2 i_row = 6 ). + cell_coords = zcl_excel_common=>convert_column_a_row2columnrow( i_column = 2 i_row = 6 ). - cl_abap_unit_assert=>assert_equals( act = cell_coords exp = 'B6' ). + cl_abap_unit_assert=>assert_equals( act = cell_coords exp = 'B6' ). ENDMETHOD. METHOD convert_columnrow2column_a_row. - DATA: column TYPE zexcel_cell_column_alpha, - column_int TYPE zexcel_cell_column, - row TYPE zexcel_cell_row. + DATA: column TYPE zexcel_cell_column_alpha, + column_int TYPE zexcel_cell_column, + row TYPE zexcel_cell_row. - zcl_excel_common=>convert_columnrow2column_a_row( - EXPORTING - i_columnrow = 'B6' - IMPORTING - e_column = column - e_column_int = column_int - e_row = row ). + zcl_excel_common=>convert_columnrow2column_a_row( + EXPORTING + i_columnrow = 'B6' + IMPORTING + e_column = column + e_column_int = column_int + e_row = row ). - cl_abap_unit_assert=>assert_equals( act = column exp = 'B' msg = 'Invalid column (alpha)' ). - cl_abap_unit_assert=>assert_equals( act = column_int exp = 2 msg = 'Invalid column (numeric)' ). - cl_abap_unit_assert=>assert_equals( act = row exp = 6 msg = 'Invalid row' ). + cl_abap_unit_assert=>assert_equals( act = column exp = 'B' msg = 'Invalid column (alpha)' ). + cl_abap_unit_assert=>assert_equals( act = column_int exp = 2 msg = 'Invalid column (numeric)' ). + cl_abap_unit_assert=>assert_equals( act = row exp = 6 msg = 'Invalid row' ). ENDMETHOD. @@ -1647,6 +1649,29 @@ CLASS lcl_excel_common_test IMPLEMENTATION. ENDTRY. ENDMETHOD. "is_cell_in_range_lowerside_out. + METHOD recursive_struct_to_class. + + DATA style TYPE REF TO zcl_excel_style. + DATA complete_style TYPE zexcel_s_cstyle_complete. + DATA complete_stylex TYPE zexcel_s_cstylex_complete. + + CREATE OBJECT style. + + complete_style-number_format-format_code = 'hello'. + complete_stylex-number_format-format_code = abap_true. + + zcl_excel_common=>recursive_struct_to_class( + EXPORTING + i_source = complete_style + i_sourcex = complete_stylex + CHANGING + e_target = style ). + + cl_abap_unit_assert=>assert_equals( + act = style->number_format->format_code + exp = 'hello' ). + ENDMETHOD. + METHOD escape_string_hyphen. DATA: name TYPE string, escaped_name TYPE string. From cc8fb819ad92c9f324eea39924f6b847aa45cd30 Mon Sep 17 00:00:00 2001 From: sandraros <34005250+sandraros@users.noreply.github.com> Date: Wed, 31 Jan 2024 16:23:15 +0100 Subject: [PATCH 23/47] Fix freeze and topLeftCell in reader/writer (#1178) Fix freeze and topLeftCell in reader/writer Fix #1175 Adds new methods set_pane_top_left_cell and set_sheetview_top_left_cell to zcl_excel_worksheet --- src/zcl_excel_reader_2007.clas.abap | 21 ++++---- src/zcl_excel_worksheet.clas.abap | 50 +++++++++++++++++++ ...zcl_excel_writer_2007.clas.locals_imp.abap | 19 +++++-- 3 files changed, 73 insertions(+), 17 deletions(-) diff --git a/src/zcl_excel_reader_2007.clas.abap b/src/zcl_excel_reader_2007.clas.abap index 3b577d0..c130620 100644 --- a/src/zcl_excel_reader_2007.clas.abap +++ b/src/zcl_excel_reader_2007.clas.abap @@ -2262,6 +2262,7 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. workbookviewid TYPE string, showrowcolheaders TYPE string, righttoleft TYPE string, + topleftcell TYPE string, END OF lty_sheetview. TYPES: BEGIN OF lty_mergecell, @@ -2812,6 +2813,9 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. io_worksheet->zif_excel_sheet_properties~zoomscale_normal = ls_sheetview-zoomscalenormal. io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview = ls_sheetview-zoomscalepagelayoutview. io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview = ls_sheetview-zoomscalesheetlayoutview. + IF ls_sheetview-topleftcell IS NOT INITIAL. + io_worksheet->set_sheetview_top_left_cell( ls_sheetview-topleftcell ). + ENDIF. "Add merge cell information lo_ixml_mergecells = lo_ixml_worksheet->get_elements_by_tag_name_ns( name = 'mergeCell' uri = namespace-main ). @@ -2928,21 +2932,12 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. ENDIF. - " Start fix 194 Read attributes HIDDEN, OUTLINELEVEL, COLLAPSED in ZCL_EXCEL_READER_2007 " Read pane lo_ixml_pane_elem = lo_ixml_sheetview_elem->find_from_name_ns( name = 'pane' uri = namespace-main ). IF lo_ixml_pane_elem IS BOUND. fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_pane_elem CHANGING cp_structure = ls_excel_pane ). - " Issue #194 - " Replace REGEX with method from the common class - zcl_excel_common=>convert_columnrow2column_a_row( EXPORTING - i_columnrow = ls_excel_pane-topleftcell - IMPORTING - e_column = lv_pane_cell_col_a " Cell Column - e_row = lv_pane_cell_row ). " Natural number - lv_pane_cell_col = zcl_excel_common=>convert_column2int( lv_pane_cell_col_a ). - SUBTRACT 1 FROM: lv_pane_cell_col, - lv_pane_cell_row. + lv_pane_cell_col = ls_excel_pane-xsplit. + lv_pane_cell_row = ls_excel_pane-ysplit. IF lv_pane_cell_col > 0 AND lv_pane_cell_row > 0. io_worksheet->freeze_panes( ip_num_rows = lv_pane_cell_row @@ -2952,8 +2947,10 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. ELSE. io_worksheet->freeze_panes( ip_num_columns = lv_pane_cell_col ). ENDIF. + IF ls_excel_pane-topleftcell IS NOT INITIAL. + io_worksheet->set_pane_top_left_cell( ls_excel_pane-topleftcell ). + ENDIF. ENDIF. - " End fix 194 Read attributes HIDDEN, OUTLINELEVEL, COLLAPSED in ZCL_EXCEL_READER_2007 " Start fix 276 Read data validations lo_ixml_datavalidations = lo_ixml_worksheet->get_elements_by_tag_name_ns( name = 'dataValidation' uri = namespace-main ). diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index 5cb1ce0..07c2ad7 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -102,6 +102,8 @@ CLASS zcl_excel_worksheet DEFINITION formula_in_other_column TYPE string, END OF c_messages . DATA mt_merged_cells TYPE mty_ts_merge READ-ONLY . + DATA pane_top_left_cell TYPE string READ-ONLY. + DATA sheetview_top_left_cell TYPE string READ-ONLY. METHODS add_comment IMPORTING @@ -549,6 +551,11 @@ CLASS zcl_excel_worksheet DEFINITION !ip_formula TYPE zexcel_cell_formula OPTIONAL "added parameter RAISING zcx_excel . + METHODS set_pane_top_left_cell + IMPORTING + !iv_columnrow TYPE csequence + RAISING + zcx_excel. METHODS set_print_gridlines IMPORTING !i_print_gridlines TYPE zexcel_print_gridlines . @@ -565,6 +572,11 @@ CLASS zcl_excel_worksheet DEFINITION !iv_collapsed TYPE abap_bool RAISING zcx_excel . + METHODS set_sheetview_top_left_cell + IMPORTING + !iv_columnrow TYPE csequence + RAISING + zcx_excel. METHODS set_show_gridlines IMPORTING !i_show_gridlines TYPE zexcel_show_gridlines . @@ -4310,6 +4322,25 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ENDMETHOD. "set_merge_style + METHOD set_pane_top_left_cell. + DATA lv_column_int TYPE zexcel_cell_column. + DATA lv_row TYPE zexcel_cell_row. + + " Validate input value + zcl_excel_common=>convert_columnrow2column_a_row( + EXPORTING + i_columnrow = iv_columnrow + IMPORTING + e_column_int = lv_column_int + e_row = lv_row ). + IF lv_column_int NOT BETWEEN zcl_excel_common=>c_excel_sheet_min_col AND zcl_excel_common=>c_excel_sheet_max_col + OR lv_row NOT BETWEEN zcl_excel_common=>c_excel_sheet_min_row AND zcl_excel_common=>c_excel_sheet_max_row. + RAISE EXCEPTION TYPE zcx_excel EXPORTING error = 'Invalid column/row coordinates (valid values: A1 to XFD1048576)'. + ENDIF. + pane_top_left_cell = iv_columnrow. + ENDMETHOD. + + METHOD set_print_gridlines. me->print_gridlines = i_print_gridlines. ENDMETHOD. "SET_PRINT_GRIDLINES @@ -4366,6 +4397,25 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ENDMETHOD. "SET_ROW_OUTLINE + METHOD set_sheetview_top_left_cell. + DATA lv_column_int TYPE zexcel_cell_column. + DATA lv_row TYPE zexcel_cell_row. + + " Validate input value + zcl_excel_common=>convert_columnrow2column_a_row( + EXPORTING + i_columnrow = iv_columnrow + IMPORTING + e_column_int = lv_column_int + e_row = lv_row ). + IF lv_column_int NOT BETWEEN zcl_excel_common=>c_excel_sheet_min_col AND zcl_excel_common=>c_excel_sheet_max_col + OR lv_row NOT BETWEEN zcl_excel_common=>c_excel_sheet_min_row AND zcl_excel_common=>c_excel_sheet_max_row. + RAISE EXCEPTION TYPE zcx_excel EXPORTING error = 'Invalid column/row coordinates (valid values: A1 to XFD1048576)'. + ENDIF. + sheetview_top_left_cell = iv_columnrow. + ENDMETHOD. + + METHOD set_show_gridlines. me->show_gridlines = i_show_gridlines. ENDMETHOD. "SET_SHOW_GRIDLINES diff --git a/src/zcl_excel_writer_2007.clas.locals_imp.abap b/src/zcl_excel_writer_2007.clas.locals_imp.abap index 7e01e73..0ae8e20 100644 --- a/src/zcl_excel_writer_2007.clas.locals_imp.abap +++ b/src/zcl_excel_writer_2007.clas.locals_imp.abap @@ -395,6 +395,11 @@ CLASS lcl_create_xl_sheet IMPLEMENTATION. value = '0' ). ENDIF. + IF o_worksheet->sheetview_top_left_cell IS NOT INITIAL. + lo_element_2->set_attribute_ns( name = 'topLeftCell' + value = o_worksheet->sheetview_top_left_cell ). + ENDIF. + " freeze panes o_worksheet->get_freeze_cell( IMPORTING ep_row = lv_freeze_cell_row ep_column = lv_freeze_cell_column ). @@ -417,11 +422,15 @@ CLASS lcl_create_xl_sheet IMPLEMENTATION. value = lv_value ). ENDIF. - lv_freeze_cell_column_alpha = zcl_excel_common=>convert_column2alpha( ip_column = lv_freeze_cell_column ). - lv_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_freeze_cell_row ). - CONCATENATE lv_freeze_cell_column_alpha lv_value INTO lv_value. - lo_element_3->set_attribute_ns( name = 'topLeftCell' - value = lv_value ). + IF o_worksheet->pane_top_left_cell IS NOT INITIAL. + lo_element_3->set_attribute_ns( name = 'topLeftCell' + value = o_worksheet->pane_top_left_cell ). + ELSE. + lv_value = zcl_excel_common=>convert_column_a_row2columnrow( i_column = lv_freeze_cell_column + i_row = lv_freeze_cell_row ). + lo_element_3->set_attribute_ns( name = 'topLeftCell' + value = lv_value ). + ENDIF. lo_element_3->set_attribute_ns( name = 'activePane' value = 'bottomRight' ). From b77b48fd15d1e88a2b1297de3a82bfa4fec130d9 Mon Sep 17 00:00:00 2001 From: sandraros <34005250+sandraros@users.noreply.github.com> Date: Thu, 1 Feb 2024 17:37:36 +0100 Subject: [PATCH 24/47] Cleanup unused variables in zcl_excel_theme (#1183) Removing the statement ixml_element->get_attribute( 'xmlns:a' ) is anyway a good thing because getting a namespace attribute this way is not supported by IXML and it is always returning an empty string even if this "attribute" exists. --- src/zcl_excel_theme.clas.abap | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/zcl_excel_theme.clas.abap b/src/zcl_excel_theme.clas.abap index 75c3323..43d223e 100644 --- a/src/zcl_excel_theme.clas.abap +++ b/src/zcl_excel_theme.clas.abap @@ -71,10 +71,7 @@ CLASS zcl_excel_theme DEFINITION DATA extlst TYPE REF TO zcl_excel_theme_extlst . PRIVATE SECTION. - DATA theme_changed TYPE abap_bool . - DATA theme_read TYPE abap_bool . DATA name TYPE string . - DATA xmls_a TYPE string . ENDCLASS. @@ -100,7 +97,6 @@ CLASS zcl_excel_theme IMPLEMENTATION. lo_node_theme = io_theme_xml->get_root_element( )." find_from_name( name = c_theme ). IF lo_node_theme IS BOUND. name = lo_node_theme->get_attribute( name = c_theme_name ). - xmls_a = lo_node_theme->get_attribute( name = c_theme_xmlns ). lo_theme_children = lo_node_theme->get_children( ). lo_theme_iterator = lo_theme_children->create_iterator( ). lo_theme_element ?= lo_theme_iterator->get_next( ). From e4f0ca23338f4aea0b6eeacd0caf0c19ee72fb5c Mon Sep 17 00:00:00 2001 From: sandraros <34005250+sandraros@users.noreply.github.com> Date: Tue, 6 Feb 2024 15:15:51 +0100 Subject: [PATCH 25/47] Unused calls/variables about cl_xml_document (#1185) --- src/zcl_excel_writer_2007.clas.abap | 14 +------------- src/zcl_excel_writer_xlsm.clas.abap | 16 +++++----------- 2 files changed, 6 insertions(+), 24 deletions(-) diff --git a/src/zcl_excel_writer_2007.clas.abap b/src/zcl_excel_writer_2007.clas.abap index 6b9434e..c08567b 100644 --- a/src/zcl_excel_writer_2007.clas.abap +++ b/src/zcl_excel_writer_2007.clas.abap @@ -2666,7 +2666,6 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. METHOD create_xl_drawings_vml. DATA: - lo_xml_document TYPE REF TO cl_xml_document, ld_stream TYPE string. @@ -2677,11 +2676,6 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. * BODY ld_stream = set_vml_string( ). - CREATE OBJECT lo_xml_document. - CALL METHOD lo_xml_document->parse_string - EXPORTING - stream = ld_stream. - CALL FUNCTION 'SCMS_STRING_TO_XSTRING' EXPORTING text = ld_stream @@ -3334,8 +3328,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. 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, - lv_content TYPE string, - lo_xml_document TYPE REF TO cl_xml_document. + lv_content TYPE string. * INIT_RESULT @@ -3383,11 +3376,6 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. ld_7 INTO lv_content. - CREATE OBJECT lo_xml_document. - CALL METHOD lo_xml_document->parse_string - EXPORTING - stream = lv_content. - CALL FUNCTION 'SCMS_STRING_TO_XSTRING' EXPORTING text = lv_content diff --git a/src/zcl_excel_writer_xlsm.clas.abap b/src/zcl_excel_writer_xlsm.clas.abap index bb7835c..aa6ce92 100644 --- a/src/zcl_excel_writer_xlsm.clas.abap +++ b/src/zcl_excel_writer_xlsm.clas.abap @@ -262,8 +262,7 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION. lo_ostream TYPE REF TO if_ixml_ostream, lo_renderer TYPE REF TO if_ixml_renderer. - DATA: lv_subrc TYPE sysubrc, - lv_contenttype TYPE string. + DATA: lv_contenttype TYPE string. ********************************************************************** * STEP 3: Create standard contentType @@ -273,7 +272,7 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION. * STEP 2: modify XML adding the extension bin definition CREATE OBJECT lo_document_xml. - lv_subrc = lo_document_xml->parse_xstring( ep_content ). + lo_document_xml->parse_xstring( ep_content ). lo_document ?= lo_document_xml->m_document. lo_element_root = lo_document->if_ixml_node~get_first_child( ). @@ -342,7 +341,6 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION. DATA: lv_xml_node_ridx_id TYPE string, lv_size TYPE i, - lv_subrc TYPE sysubrc, lv_syindex(2) TYPE c. ********************************************************************** @@ -353,7 +351,7 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION. * STEP 2: modify XML adding the vbaProject relation CREATE OBJECT lo_document_xml. - lv_subrc = lo_document_xml->parse_xstring( ep_content ). + lo_document_xml->parse_xstring( ep_content ). lo_document ?= lo_document_xml->m_document. lo_element_root = lo_document->if_ixml_node~get_first_child( ). @@ -406,8 +404,6 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION. lo_ostream TYPE REF TO if_ixml_ostream, lo_renderer TYPE REF TO if_ixml_renderer. - DATA: lv_subrc TYPE sysubrc. - ********************************************************************** * STEP 3: Create standard relationship ep_content = super->create_xl_sheet( io_worksheet = io_worksheet @@ -417,7 +413,7 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION. * STEP 2: modify XML adding the vbaProject relation CREATE OBJECT lo_document_xml. - lv_subrc = lo_document_xml->parse_xstring( ep_content ). + lo_document_xml->parse_xstring( ep_content ). lo_document ?= lo_document_xml->m_document. lo_element_root = lo_document->if_ixml_node~get_first_child( ). @@ -458,8 +454,6 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION. lo_ostream TYPE REF TO if_ixml_ostream, lo_renderer TYPE REF TO if_ixml_renderer. - DATA: lv_subrc TYPE sysubrc. - ********************************************************************** * STEP 3: Create standard relationship ep_content = super->create_xl_workbook( ). @@ -468,7 +462,7 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION. * STEP 2: modify XML adding the vbaProject relation CREATE OBJECT lo_document_xml. - lv_subrc = lo_document_xml->parse_xstring( ep_content ). + lo_document_xml->parse_xstring( ep_content ). lo_document ?= lo_document_xml->m_document. lo_element_root = lo_document->if_ixml_node~get_first_child( ). From 242a3d4e43041a92146080f94ca11d82550317ee Mon Sep 17 00:00:00 2001 From: sandraros <34005250+sandraros@users.noreply.github.com> Date: Tue, 6 Feb 2024 20:01:26 +0100 Subject: [PATCH 26/47] Ineffective Set_Namespace_Prefix on DOM document (#1186) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It always return an error but isn't handled → line removed --- src/zcl_excel_theme.clas.abap | 1 - 1 file changed, 1 deletion(-) diff --git a/src/zcl_excel_theme.clas.abap b/src/zcl_excel_theme.clas.abap index 43d223e..931c7a0 100644 --- a/src/zcl_excel_theme.clas.abap +++ b/src/zcl_excel_theme.clas.abap @@ -204,7 +204,6 @@ CLASS zcl_excel_theme IMPLEMENTATION. lo_document = lo_ixml->create_document( ). lo_document->set_encoding( lo_encoding ). lo_document->set_standalone( abap_true ). - lo_document->set_namespace_prefix( prefix = 'a' ). lo_element_root = lo_document->create_simple_element_ns( prefix = c_theme_prefix name = c_theme From 39f92725a0dc9886cb339228686c280cf1c7237c Mon Sep 17 00:00:00 2001 From: sandraros <34005250+sandraros@users.noreply.github.com> Date: Thu, 15 Feb 2024 11:16:49 +0100 Subject: [PATCH 27/47] Update LICENSE Copyright (#1191) Fix #1153 --- LICENSE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LICENSE b/LICENSE index e06d208..083d277 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Apache License + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -186,7 +186,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright {yyyy} {name of copyright owner} + Copyright 2010 abap2xlsx Contributors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From 35425c3220b82644fd998c2a501001cb54fad3f3 Mon Sep 17 00:00:00 2001 From: Aditya Waghmare <98611511+aditya-deloitte@users.noreply.github.com> Date: Thu, 15 Feb 2024 19:50:09 +0530 Subject: [PATCH 28/47] CSV Initial External Date (#1190) * CSV Initial External Date Added code to set an initial external date other than the value returned by function module 'CONVERT_DATE_TO_EXTERNAL'. * Default value as public constant --------- Co-authored-by: abaplint[bot] <24845621+abaplint[bot]@users.noreply.github.com> Co-authored-by: sandraros <34005250+sandraros@users.noreply.github.com> --- src/zcl_excel_writer_csv.clas.abap | 52 +++++++++++++++++++----------- src/zcl_excel_writer_csv.clas.xml | 23 +++++++++++++ 2 files changed, 57 insertions(+), 18 deletions(-) diff --git a/src/zcl_excel_writer_csv.clas.abap b/src/zcl_excel_writer_csv.clas.abap index 23f6853..7aa976b 100644 --- a/src/zcl_excel_writer_csv.clas.abap +++ b/src/zcl_excel_writer_csv.clas.abap @@ -9,6 +9,9 @@ CLASS zcl_excel_writer_csv DEFINITION INTERFACES zif_excel_writer . + "! Default value for initial dates e.g. user's format (DD.MM.YYYY, MM.DD.YYYY, etc.) + CONSTANTS c_default TYPE c LENGTH 10 VALUE 'DEFAULT' ##NO_TEXT. + CLASS-METHODS set_delimiter IMPORTING VALUE(ip_value) TYPE c DEFAULT ';' . @@ -24,7 +27,10 @@ CLASS zcl_excel_writer_csv DEFINITION CLASS-METHODS set_active_sheet_index_by_name IMPORTING !i_worksheet_name TYPE zexcel_worksheets_name . -*"* protected components of class ZCL_EXCEL_WRITER_2007 + CLASS-METHODS set_initial_ext_date + IMPORTING + !ip_value TYPE char10 DEFAULT c_default . +*"* protected components of class ZCL_EXCEL_WRITER_CSV *"* do not include other source files here!!! PROTECTED SECTION. *"* private components of class ZCL_EXCEL_WRITER_CSV @@ -38,6 +44,7 @@ CLASS zcl_excel_writer_csv DEFINITION eol TYPE c LENGTH 2 VALUE cl_abap_char_utilities=>cr_lf ##NO_TEXT. CLASS-DATA worksheet_name TYPE zexcel_worksheets_name . CLASS-DATA worksheet_index TYPE zexcel_active_worksheet . + CLASS-DATA initial_ext_date TYPE char10 VALUE c_default. METHODS create RETURNING @@ -53,7 +60,7 @@ ENDCLASS. -CLASS zcl_excel_writer_csv IMPLEMENTATION. +CLASS ZCL_EXCEL_WRITER_CSV IMPLEMENTATION. METHOD create. @@ -220,24 +227,28 @@ CLASS zcl_excel_writer_csv IMPLEMENTATION. CASE -data_type. WHEN 'd' OR 'D'. - lc_value = zcl_excel_common=>excel_string_to_date( ip_value = -cell_value ). - TRY. - lv_date = lc_value. - CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL' - EXPORTING - date_internal = lv_date - IMPORTING - date_external = lv_tmp - EXCEPTIONS - date_internal_is_invalid = 1 - OTHERS = 2. - IF sy-subrc = 0. - lc_value = lv_tmp. - ENDIF. + IF -cell_value IS INITIAL AND initial_ext_date <> c_default. + lc_value = initial_ext_date. + ELSE. + lc_value = zcl_excel_common=>excel_string_to_date( ip_value = -cell_value ). + TRY. + lv_date = lc_value. + CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL' + EXPORTING + date_internal = lv_date + IMPORTING + date_external = lv_tmp + EXCEPTIONS + date_internal_is_invalid = 1 + OTHERS = 2. + IF sy-subrc = 0. + lc_value = lv_tmp. + ENDIF. - CATCH cx_sy_conversion_no_number. + CATCH cx_sy_conversion_no_number. - ENDTRY. + ENDTRY. + ENDIF. WHEN 't' OR 'T'. lc_value = zcl_excel_common=>excel_string_to_time( ip_value = -cell_value ). @@ -302,6 +313,11 @@ CLASS zcl_excel_writer_csv IMPLEMENTATION. ENDMETHOD. + METHOD set_initial_ext_date. + initial_ext_date = ip_value. + ENDMETHOD. + + METHOD zif_excel_writer~write_file. me->excel = io_excel. ep_file = me->create( ). diff --git a/src/zcl_excel_writer_csv.clas.xml b/src/zcl_excel_writer_csv.clas.xml index 2a13c78..7b1d8ad 100644 --- a/src/zcl_excel_writer_csv.clas.xml +++ b/src/zcl_excel_writer_csv.clas.xml @@ -32,6 +32,11 @@ I Create CSV ; Delimited format + + C_DEFAULT + E + Constant for string 'DEFAULT' + DELIMITER E @@ -72,6 +77,11 @@ I Excel creator + + INITIAL_EXT_DATE + E + Initial External Date + SET_ACTIVE_SHEET_INDEX E @@ -122,6 +132,11 @@ I Set End Of Line character + + SET_INITIAL_EXT_DATE + E + Set Initial External Date (replacing default '00.00.0000') + WORKSHEET_INDEX E @@ -143,6 +158,14 @@ Worksheets name
+ + + SET_INITIAL_EXT_DATE + IP_VALUE + E + Input Value + + From a69258e829a17bec426f5d80fb0f44d8a5bdbdd2 Mon Sep 17 00:00:00 2001 From: sandraros <34005250+sandraros@users.noreply.github.com> Date: Sat, 13 Apr 2024 15:54:22 +0200 Subject: [PATCH 29/47] set_table to support table components not DDIC (#1204) Fix #1166 --- src/zcl_excel_worksheet.clas.abap | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index 07c2ad7..81b24f0 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -4433,7 +4433,7 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. METHOD set_table. - DATA: lo_tabdescr TYPE REF TO cl_abap_structdescr, + DATA: lo_structdescr TYPE REF TO cl_abap_structdescr, lr_data TYPE REF TO data, lt_dfies TYPE ddfields, lv_row_int TYPE zexcel_cell_row, @@ -4451,9 +4451,9 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. CREATE DATA lr_data LIKE LINE OF ip_table. - lo_tabdescr ?= cl_abap_structdescr=>describe_by_data_ref( lr_data ). + lo_structdescr ?= cl_abap_structdescr=>describe_by_data_ref( lr_data ). - lt_dfies = lo_tabdescr->get_ddic_field_list( ). + lt_dfies = zcl_excel_common=>describe_structure( io_struct = lo_structdescr ). * It is better to loop column by column LOOP AT lt_dfies ASSIGNING . From 0f473095e12dbf268e3cd843b741e169128190c6 Mon Sep 17 00:00:00 2001 From: juancarlosrodriguezf <37382510+juancarlosrodriguezf@users.noreply.github.com> Date: Sun, 14 Apr 2024 10:32:55 +0200 Subject: [PATCH 30/47] Format Date (#1050) * Fix format date for dd/mm/yyyy * added new date format DD/MM/YY * New constant for dd/mm/yyyy instead of changing the existing one to keep the ascending compatibility --------- Co-authored-by: Abo Co-authored-by: Domi Bigl Co-authored-by: sandraros --- src/zcl_excel_style_number_format.clas.abap | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/zcl_excel_style_number_format.clas.abap b/src/zcl_excel_style_number_format.clas.abap index 9064556..c0717dd 100644 --- a/src/zcl_excel_style_number_format.clas.abap +++ b/src/zcl_excel_style_number_format.clas.abap @@ -25,7 +25,10 @@ CLASS zcl_excel_style_number_format DEFINITION CONSTANTS c_format_currency_simple2 TYPE zexcel_number_format VALUE '$#,##0.00_);($#,##0.00)'. "#EC NOTEXT CONSTANTS c_format_currency_simple_red2 TYPE zexcel_number_format VALUE '$#,##0.00_);[Red]($#,##0.00)'. "#EC NOTEXT CONSTANTS c_format_date_datetime TYPE zexcel_number_format VALUE 'd/m/y h:mm'. "#EC NOTEXT + "! Deprecated. Do not use this one, its value is dd/mm/yy, instead use the constant *_ddmmyyyy_new CONSTANTS c_format_date_ddmmyyyy TYPE zexcel_number_format VALUE 'dd/mm/yy'. "#EC NOTEXT + CONSTANTS c_format_date_ddmmyyyy_new TYPE zexcel_number_format VALUE 'dd/mm/yyyy'. "#EC NOTEXT + CONSTANTS c_format_date_ddmmyy TYPE zexcel_number_format VALUE 'dd/mm/yy'. "#EC NOTEXT CONSTANTS c_format_date_ddmmyyyydot TYPE zexcel_number_format VALUE 'dd\.mm\.yyyy'. "#EC NOTEXT CONSTANTS c_format_date_dmminus TYPE zexcel_number_format VALUE 'd-m'. "#EC NOTEXT CONSTANTS c_format_date_dmyminus TYPE zexcel_number_format VALUE 'd-m-y'. "#EC NOTEXT From f9685c981d9a45a5539933c6d74672fb7bc0a880 Mon Sep 17 00:00:00 2001 From: Kjetil Kilhavn Date: Sat, 20 Apr 2024 09:53:31 +0200 Subject: [PATCH 31/47] Convert fields with date & time value correctly to just date or just time (#1197) * Convert fields with date Ignore decimals when converting to date and ignore integer when converting to time Fix #1132 * New ip_exact parameter of excel_string_to_date - I'm not comfortable about changing the logic in `excel_string_to_date`, in case other people have implemented a "-1 day" fix after the call, so I added a parameter `ip_exact` to keep an ascending compatibility. - I reused the old structure of unit tests to simplify the diff - fix #1205 (I added this time issue that you fixed, the original issue mentioned only the date issue) --------- Co-authored-by: sandraros --- src/zcl_excel_common.clas.abap | 25 ++++++++-- src/zcl_excel_common.clas.testclasses.abap | 55 ++++++++++++++++++++++ src/zcl_excel_worksheet.clas.abap | 3 +- 3 files changed, 79 insertions(+), 4 deletions(-) diff --git a/src/zcl_excel_common.clas.abap b/src/zcl_excel_common.clas.abap index 9d9300a..67a9e6c 100644 --- a/src/zcl_excel_common.clas.abap +++ b/src/zcl_excel_common.clas.abap @@ -102,9 +102,22 @@ CLASS zcl_excel_common DEFINITION VALUE(ev_unescaped_string) TYPE string RAISING zcx_excel . + "!

Convert date from Excel format to SAP

+ "! @parameter ip_value | String being an Excel number representing a date (e.g. 45141 means 2023/08/03, + "! 45141.58832 means 2023/08/03 14:07:11). Important: if the input is date + + "! time, use the additional parameter IP_EXACT = 'X'. + "! @parameter ip_exact | If the input value also contains the time i.e. a fractional part exists + "! (e.g. 45141.58832 means 2023/08/03 14:07:11), ip_exact = 'X' will + "! return the exact date (e.g. 2023/08/03), while ip_exact = ' ' (default) will + "! return the rounded-up date (e.g. 2023/08/04). NB: this rounding-up doesn't + "! happen if the time is before 12:00:00. + "! @parameter ep_value | Date corresponding to the input Excel number. It returns a null date if + "! the input value contains non-numeric characters. + "! @raising zcx_excel | The numeric input corresponds to a date before 1900/1/1 or after 9999/12/31. CLASS-METHODS excel_string_to_date IMPORTING !ip_value TYPE zexcel_cell_value + !ip_exact TYPE abap_bool DEFAULT abap_false RETURNING VALUE(ep_value) TYPE d RAISING @@ -860,11 +873,16 @@ CLASS zcl_excel_common IMPLEMENTATION. METHOD excel_string_to_date. DATA: lv_date_int TYPE i. + DATA lv_error_text TYPE string. CHECK ip_value IS NOT INITIAL AND ip_value CN ' 0'. TRY. - lv_date_int = ip_value. + IF ip_exact = abap_false. + lv_date_int = ip_value. + ELSE. + lv_date_int = trunc( ip_value ). + ENDIF. IF lv_date_int NOT BETWEEN 1 AND 2958465. zcx_excel=>raise_text( 'Unable to interpret date' ). ENDIF. @@ -876,7 +894,8 @@ CLASS zcl_excel_common IMPLEMENTATION. ep_value = ep_value + 1. ENDIF. CATCH cx_sy_conversion_error. - zcx_excel=>raise_text( 'Index out of bounds' ). + lv_error_text = |String "{ ip_value }" is not a valid Excel date|. + zcx_excel=>raise_text( lv_error_text ). ENDTRY. ENDMETHOD. @@ -898,7 +917,7 @@ CLASS zcl_excel_common IMPLEMENTATION. TRY. - lv_day_fraction = ip_value. + lv_day_fraction = frac( ip_value ). lv_seconds_in_day = lv_day_fraction * lc_seconds_in_day. ep_value = lv_seconds_in_day. diff --git a/src/zcl_excel_common.clas.testclasses.abap b/src/zcl_excel_common.clas.testclasses.abap index 011dc9d..bf5f471 100644 --- a/src/zcl_excel_common.clas.testclasses.abap +++ b/src/zcl_excel_common.clas.testclasses.abap @@ -55,6 +55,7 @@ CLASS lcl_excel_common_test DEFINITION FOR TESTING METHODS excel_string_to_time3 FOR TESTING RAISING cx_static_check. METHODS excel_string_to_time4 FOR TESTING RAISING cx_static_check. METHODS excel_string_to_time5 FOR TESTING RAISING cx_static_check. + METHODS excel_string_to_time6 FOR TESTING RAISING cx_static_check. METHODS time_to_excel_string1 FOR TESTING RAISING cx_static_check. METHODS time_to_excel_string2 FOR TESTING RAISING cx_static_check. METHODS time_to_excel_string3 FOR TESTING RAISING cx_static_check. @@ -688,6 +689,45 @@ CLASS lcl_excel_common_test IMPLEMENTATION. level = if_aunit_constants=>fatal ). ENDTRY. + +* 45141.58832 (2023/08/03 14:07:11) ip_exact = abap_false -> 2023/08/04 + TRY. + ep_value = zcl_excel_common=>excel_string_to_date( ip_value = '45141.58832' + ip_exact = abap_false ). + cl_abap_unit_assert=>assert_equals( + act = ep_value + exp = '20230804' ). + CATCH zcx_excel INTO lx_excel. + cl_abap_unit_assert=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical ). + ENDTRY. + +* 45141.58832 (2023/08/03 14:07:11) ip_exact = abap_true -> 2023/08/03 + TRY. + ep_value = zcl_excel_common=>excel_string_to_date( ip_value = '45141.58832' + ip_exact = abap_true ). + cl_abap_unit_assert=>assert_equals( + act = ep_value + exp = '20230803' ). + CATCH zcx_excel INTO lx_excel. + cl_abap_unit_assert=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical ). + ENDTRY. + +* 45141.48832 (2023/08/03 11:43:11) ip_exact = abap_false -> 2023/08/03 + TRY. + ep_value = zcl_excel_common=>excel_string_to_date( ip_value = '45141.48832' + ip_exact = abap_false ). + cl_abap_unit_assert=>assert_equals( + act = ep_value + exp = '20230803' ). + CATCH zcx_excel INTO lx_excel. + cl_abap_unit_assert=>fail( + msg = 'unexpected exception' + level = if_aunit_constants=>critical ). + ENDTRY. ENDMETHOD. "excel_String_To_Date @@ -767,6 +807,21 @@ CLASS lcl_excel_common_test IMPLEMENTATION. ENDTRY. ENDMETHOD. + METHOD excel_string_to_time6. + DATA ep_value TYPE t. +* 45141.58832 (2023/08/03 14:07:11) -> 14:07:11 + TRY. + ep_value = zcl_excel_common=>excel_string_to_time( ip_value = '45141.58832' ). + + cl_abap_unit_assert=>assert_equals( + act = ep_value + exp = '140711' ). + + CATCH zcx_excel INTO lx_excel. + cl_abap_unit_assert=>fail( lx_excel->get_text( ) ). + ENDTRY. + ENDMETHOD. + METHOD time_to_excel_string1. DATA ep_value TYPE zexcel_cell_value. diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index 81b24f0..cfa86a3 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -2328,7 +2328,8 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. 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 ). + = zcl_excel_common=>excel_string_to_date( ip_value = -cell_value + ip_exact = abap_true ). WHEN cl_abap_typedescr=>typekind_time. = zcl_excel_common=>excel_string_to_time( -cell_value ). ENDCASE. From 191bf9cf61f41f008bb9e77e4fab868f8bb441e6 Mon Sep 17 00:00:00 2001 From: Bernd <135710507+darnoc312@users.noreply.github.com> Date: Sat, 20 Apr 2024 12:26:15 +0200 Subject: [PATCH 32/47] Update zcl_excel_writer_2007.clas.locals_imp.abap (#1200) solves #1113 --- src/zcl_excel_writer_2007.clas.locals_imp.abap | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/zcl_excel_writer_2007.clas.locals_imp.abap b/src/zcl_excel_writer_2007.clas.locals_imp.abap index 0ae8e20..ae9def7 100644 --- a/src/zcl_excel_writer_2007.clas.locals_imp.abap +++ b/src/zcl_excel_writer_2007.clas.locals_imp.abap @@ -1730,7 +1730,7 @@ CLASS lcl_create_xl_sheet IMPLEMENTATION. value = lv_value ). o_element_root->append_child( new_child = lo_element ). - ADD 1 TO v_relation_id. " +1 for comments (not referenced in XL sheet but let's reserve the rId) + ADD 1 TO v_relation_id. "for xl/comments.xml (not referenced in XL sheet but counted in sheet rels) ENDIF. * End - Add - Issue #180 ENDMETHOD. @@ -1753,7 +1753,6 @@ CLASS lcl_create_xl_sheet IMPLEMENTATION. lo_element->set_attribute( name = 'r:id' value = lv_value ). o_element_root->append_child( new_child = lo_element ). - ADD 1 TO v_relation_id. " +1 for comments (not referenced in XL sheet but let's reserve the rId) ENDIF. * ENDMETHOD. From 5cb47b143c5940f08aa4ab516c7ba0693807309b Mon Sep 17 00:00:00 2001 From: Bernd <135710507+darnoc312@users.noreply.github.com> Date: Sat, 20 Apr 2024 18:32:50 +0200 Subject: [PATCH 33/47] Header/footer images and comments together create wrong file destinations in sheet#.xml.rels (#1201) * Update zcl_excel_writer_2007.clas.abap Fix #1214 --- src/zcl_excel_writer_2007.clas.abap | 93 +++++++++++++++-------------- 1 file changed, 48 insertions(+), 45 deletions(-) diff --git a/src/zcl_excel_writer_2007.clas.abap b/src/zcl_excel_writer_2007.clas.abap index c08567b..b532db4 100644 --- a/src/zcl_excel_writer_2007.clas.abap +++ b/src/zcl_excel_writer_2007.clas.abap @@ -145,8 +145,10 @@ CLASS zcl_excel_writer_2007 DEFINITION METHODS create_xl_sheet_rels IMPORTING !io_worksheet TYPE REF TO zcl_excel_worksheet - !iv_drawing_index TYPE i - !iv_comment_index TYPE i + !iv_drawing_index TYPE i OPTIONAL + !iv_comment_index TYPE i OPTIONAL + !iv_cmnt_vmlindex TYPE i OPTIONAL + !iv_hdft_vmlindex TYPE i OPTIONAL RETURNING VALUE(ep_content) TYPE xstring . METHODS create_xl_styles @@ -323,10 +325,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. lo_iterator TYPE REF TO zcl_excel_collection_iterator, lo_nested_iterator TYPE REF TO zcl_excel_collection_iterator, lo_table TYPE REF TO zcl_excel_table, - lo_drawing TYPE REF TO zcl_excel_drawing, - lo_drawings TYPE REF TO zcl_excel_drawings, - lo_comment TYPE REF TO zcl_excel_comment, " (+) Issue #180 - lo_comments TYPE REF TO zcl_excel_comments. " (+) Issue #180 + lo_drawing TYPE REF TO zcl_excel_drawing. DATA: lv_content TYPE xstring, lv_active TYPE flag, @@ -339,8 +338,13 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. lv_index_str TYPE string, lv_value TYPE string, lv_sheet_index TYPE i, + lv_drawing_counter TYPE i, + lv_comment_counter TYPE i, + lv_vml_counter TYPE i, lv_drawing_index TYPE i, - lv_comment_index TYPE i. " (+) Issue #180 + lv_comment_index TYPE i, " (+) Issue #180 + lv_cmnt_vmlindex TYPE i, + lv_hdft_vmlindex TYPE i. ********************************************************************** @@ -433,37 +437,44 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. * Begin - Add - Issue #180 * Add comments ********************************** - lo_comments = lo_worksheet->get_comments( ). - IF lo_comments->is_empty( ) = abap_false. - lv_comment_index = lv_comment_index + 1. - + IF lo_worksheet->get_comments( )->is_empty( ) = abap_false. " Create comment itself - lv_content = me->create_xl_comments( lo_worksheet ). - lv_xl_comment = me->c_xl_comments. + ADD 1 TO lv_comment_counter. + lv_comment_index = lv_comment_counter. lv_index_str = lv_comment_index. CONDENSE lv_index_str NO-GAPS. + + lv_content = me->create_xl_comments( lo_worksheet ). + lv_xl_comment = me->c_xl_comments. REPLACE ALL OCCURRENCES OF '#' IN lv_xl_comment WITH lv_index_str. lo_zip->add( name = lv_xl_comment content = lv_content ). " Create vmlDrawing that will host the comment + ADD 1 TO lv_vml_counter. + lv_cmnt_vmlindex = lv_vml_counter. + lv_index_str = lv_cmnt_vmlindex. + CONDENSE lv_index_str NO-GAPS. + lv_content = me->create_xl_drawing_for_comments( lo_worksheet ). lv_xl_drawing_for_comment = me->cl_xl_drawing_for_comments. REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing_for_comment WITH lv_index_str. lo_zip->add( name = lv_xl_drawing_for_comment content = lv_content ). + ELSE. + CLEAR: lv_comment_index, lv_cmnt_vmlindex. ENDIF. * End - Add - Issue #180 * Add drawings ********************************** - lo_drawings = lo_worksheet->get_drawings( ). - IF lo_drawings->is_empty( ) = abap_false. - lv_drawing_index = lv_drawing_index + 1. + IF lo_worksheet->get_drawings( )->is_empty( ) = abap_false. + ADD 1 TO lv_drawing_counter. + lv_drawing_index = lv_drawing_counter. + lv_index_str = lv_drawing_index. + CONDENSE lv_index_str NO-GAPS. lv_content = me->create_xl_drawings( lo_worksheet ). lv_xl_drawing = me->c_xl_drawings. - lv_index_str = lv_drawing_index. - CONDENSE lv_index_str NO-GAPS. REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing WITH lv_index_str. lo_zip->add( name = lv_xl_drawing content = lv_content ). @@ -473,15 +484,15 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing_rels WITH lv_index_str. lo_zip->add( name = lv_xl_drawing_rels content = lv_content ). + ELSE. + CLEAR lv_drawing_index. ENDIF. * Add Header/Footer image - DATA: lt_drawings TYPE zexcel_t_drawings. - lt_drawings = lo_worksheet->get_header_footer_drawings( ). - IF lines( lt_drawings ) > 0. "Header or footer image exist - - lv_comment_index = lv_comment_index + 1. - lv_index_str = lv_comment_index. + IF lines( lo_worksheet->get_header_footer_drawings( ) ) > 0. "Header or footer image exist + ADD 1 TO lv_vml_counter. + lv_hdft_vmlindex = lv_vml_counter. + lv_index_str = lv_hdft_vmlindex. CONDENSE lv_index_str NO-GAPS. " Create vmlDrawing that will host the image @@ -497,13 +508,17 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing_rels WITH lv_index_str. lo_zip->add( name = lv_xl_drawing_rels content = lv_content ). + ELSE. + CLEAR lv_hdft_vmlindex. ENDIF. lv_xl_sheet_rels = me->c_xl_sheet_rels. lv_content = me->create_xl_sheet_rels( io_worksheet = lo_worksheet iv_drawing_index = lv_drawing_index - iv_comment_index = lv_comment_index ). " (+) Issue #180 + iv_comment_index = lv_comment_index " (+) Issue #180 + iv_cmnt_vmlindex = lv_cmnt_vmlindex + iv_hdft_vmlindex = lv_hdft_vmlindex ). lv_index_str = lv_sheet_index. CONDENSE lv_index_str NO-GAPS. @@ -3990,8 +4005,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. DATA: lv_value TYPE string, lv_relation_id TYPE i, - lv_index_str TYPE string, - lv_comment_index TYPE i. + lv_index_str TYPE string. ********************************************************************** * STEP 1: Create [Content_Types].xml into the root of the ZIP @@ -4035,10 +4049,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. ENDWHILE. * drawing - DATA: lo_drawings TYPE REF TO zcl_excel_drawings. - - lo_drawings = io_worksheet->get_drawings( ). - IF lo_drawings->is_empty( ) = abap_false. + IF iv_drawing_index > 0. lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship parent = lo_document ). ADD 1 TO lv_relation_id. @@ -4062,18 +4073,11 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. ENDIF. * Begin - Add - Issue #180 - DATA: lo_comments TYPE REF TO zcl_excel_comments. - - lv_comment_index = iv_comment_index. - - lo_comments = io_worksheet->get_comments( ). - IF lo_comments->is_empty( ) = abap_false. + IF iv_cmnt_vmlindex > 0 AND iv_comment_index > 0. " Drawing for comment lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship parent = lo_document ). - ADD 1 TO lv_relation_id. - ADD 1 TO lv_comment_index. lv_value = lv_relation_id. CONDENSE lv_value. @@ -4083,7 +4087,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. lo_element->set_attribute_ns( name = lc_xml_attr_type value = lc_xml_node_rid_drawing_cmt_tp ). - lv_index_str = iv_comment_index. + lv_index_str = iv_cmnt_vmlindex. CONDENSE lv_index_str NO-GAPS. lv_value = me->cl_xl_drawing_for_comments. REPLACE 'xl' WITH '..' INTO lv_value. @@ -4118,13 +4122,12 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. ********************************************************************** * header footer image - DATA: lt_drawings TYPE zexcel_t_drawings. - lt_drawings = io_worksheet->get_header_footer_drawings( ). - IF lines( lt_drawings ) > 0. "Header or footer image exist - ADD 1 TO lv_relation_id. + IF iv_hdft_vmlindex > 0. "Header or footer image exist " Drawing for comment/header/footer lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship parent = lo_document ). + ADD 1 TO lv_relation_id. + lv_value = lv_relation_id. CONDENSE lv_value. CONCATENATE 'rId' lv_value INTO lv_value. @@ -4133,7 +4136,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. lo_element->set_attribute_ns( name = lc_xml_attr_type value = lc_xml_node_rid_drawing_cmt_tp ). - lv_index_str = lv_comment_index. + lv_index_str = iv_hdft_vmlindex. CONDENSE lv_index_str NO-GAPS. lv_value = me->cl_xl_drawing_for_comments. REPLACE 'xl' WITH '..' INTO lv_value. From 3cb8f883f13d099371db2f67f801575fde1451cf Mon Sep 17 00:00:00 2001 From: Domi Bigl Date: Sat, 27 Apr 2024 12:14:29 +0200 Subject: [PATCH 34/47] fix hidden compare values (#1208) set hidden compare values to constants lc_xml_attr_true and lc_xml_attr_true_int ( 'true' and '1' ) --- src/zcl_excel_reader_2007.clas.abap | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/zcl_excel_reader_2007.clas.abap b/src/zcl_excel_reader_2007.clas.abap index c130620..0731548 100644 --- a/src/zcl_excel_reader_2007.clas.abap +++ b/src/zcl_excel_reader_2007.clas.abap @@ -2778,7 +2778,8 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. * issue #367 - hide columns from IF ls_column-max = zcl_excel_common=>c_excel_sheet_max_col. " Max = very right column - IF ls_column-hidden = 1 " all hidden + IF ( ls_column-hidden = lc_xml_attr_true + OR ls_column-hidden = lc_xml_attr_true_int ) " all hidden AND ls_column-min > 0. io_worksheet->zif_excel_sheet_properties~hide_columns_from = zcl_excel_common=>convert_column2alpha( ls_column-min ). ELSEIF ls_column-style > ''. From a9e1068e44feca4a6999f01677231f9d09a8e65c Mon Sep 17 00:00:00 2001 From: RixarSAP <168567887+RixarSAP@users.noreply.github.com> Date: Mon, 6 May 2024 08:42:16 +0200 Subject: [PATCH 35/47] Add possibility to change the size of the comments. (#1219) Fix #1221 --- src/zcl_excel_comment.clas.abap | 45 ++++++++++++++++++++++++++--- src/zcl_excel_writer_2007.clas.abap | 27 ++++++++++++++++- 2 files changed, 67 insertions(+), 5 deletions(-) diff --git a/src/zcl_excel_comment.clas.abap b/src/zcl_excel_comment.clas.abap index d25310e..a285701 100644 --- a/src/zcl_excel_comment.clas.abap +++ b/src/zcl_excel_comment.clas.abap @@ -5,28 +5,42 @@ CLASS zcl_excel_comment DEFINITION PUBLIC SECTION. + CONSTANTS default_right_column TYPE i VALUE 4. "#EC NOTEXT + CONSTANTS default_bottom_row TYPE i VALUE 15. "#EC NOTEXT + METHODS constructor . - METHODS get_name + METHODS get_bottom_row RETURNING - VALUE(r_name) TYPE string . + VALUE(rp_result) TYPE i . METHODS get_index RETURNING VALUE(rp_index) TYPE string . + METHODS get_name + RETURNING + VALUE(r_name) TYPE string . METHODS get_ref RETURNING VALUE(rp_ref) TYPE string . + METHODS get_right_column + RETURNING + VALUE(rp_result) TYPE i . METHODS get_text RETURNING VALUE(rp_text) TYPE string . METHODS set_text IMPORTING - !ip_text TYPE string - !ip_ref TYPE string OPTIONAL . + !ip_text TYPE string + !ip_ref TYPE string OPTIONAL + !ip_right_column TYPE i OPTIONAL + !ip_bottom_row TYPE i OPTIONAL . + PROTECTED SECTION. PRIVATE SECTION. + DATA bottom_row TYPE i . DATA index TYPE string . DATA ref TYPE string . + DATA right_column TYPE i . DATA text TYPE string . ENDCLASS. @@ -40,6 +54,11 @@ CLASS zcl_excel_comment IMPLEMENTATION. ENDMETHOD. + METHOD get_bottom_row. + rp_result = bottom_row. + ENDMETHOD. + + METHOD get_index. rp_index = me->index. ENDMETHOD. @@ -55,6 +74,11 @@ CLASS zcl_excel_comment IMPLEMENTATION. ENDMETHOD. + METHOD get_right_column. + rp_result = right_column. + ENDMETHOD. + + METHOD get_text. rp_text = me->text. ENDMETHOD. @@ -66,5 +90,18 @@ CLASS zcl_excel_comment IMPLEMENTATION. IF ip_ref IS SUPPLIED. me->ref = ip_ref. ENDIF. + + IF ip_right_column IS NOT INITIAL. + me->right_column = ip_right_column. + ELSE. + me->right_column = default_right_column. + ENDIF. + + IF ip_bottom_row IS NOT INITIAL. + me->bottom_row = ip_bottom_row. + ELSE. + me->bottom_row = default_bottom_row. + ENDIF. ENDMETHOD. + ENDCLASS. diff --git a/src/zcl_excel_writer_2007.clas.abap b/src/zcl_excel_writer_2007.clas.abap index b532db4..958e639 100644 --- a/src/zcl_excel_writer_2007.clas.abap +++ b/src/zcl_excel_writer_2007.clas.abap @@ -3139,6 +3139,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. lc_xml_attr_val_none TYPE string VALUE 'none', lc_xml_attr_val_msodir TYPE string VALUE 'mso-direction-alt:auto', lc_xml_attr_val_note TYPE string VALUE 'Note'. + CONSTANTS lc_anchor_init TYPE string VALUE '2, 15, 11, 10, &right_column&, 31, &bottom_row&, 9'. DATA: lo_document TYPE REF TO if_ixml_document, @@ -3175,6 +3176,11 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. lv_int_value TYPE i, lv_int_value_string TYPE string. DATA: lv_rel_id TYPE i. + DATA lv_anchor TYPE string. + DATA lv_bottom_row TYPE i. + DATA lv_right_column TYPE i. + DATA lv_bottom_row_str TYPE string. + DATA lv_right_column_str TYPE string. ********************************************************************** @@ -3297,7 +3303,26 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. lo_element_clientdata->append_child( new_child = lo_element_sizewithcells ). lo_element_anchor = lo_document->create_simple_element( name = lc_xml_node_anchor parent = lo_document ). - lo_element_anchor->set_value( '2, 15, 11, 10, 4, 31, 15, 9' ). + + " Anchor represents 4 pairs of numbers: + " ( left column, left offset ), ( top row, top offset ), + " ( right column, right offset ), ( bottom row, botton offset ) + " Offsets are a number of pixels. + " Reference: Anchor Class at + " https://learn.microsoft.com/en-us/dotnet/api/documentformat.openxml.vml.spreadsheet.anchor?view=openxml-3.0.1 + lv_right_column = lo_comment->get_right_column( ). + lv_bottom_row = lo_comment->get_bottom_row( ). + + lv_right_column_str = lv_right_column. + CONDENSE lv_right_column_str. + lv_bottom_row_str = lv_bottom_row. + CONDENSE lv_bottom_row_str. + + lv_anchor = lc_anchor_init. + REPLACE '&right_column&' WITH lv_right_column_str INTO lv_anchor. + REPLACE '&bottom_row&' WITH lv_bottom_row_str INTO lv_anchor. + lo_element_anchor->set_value( lv_anchor ). + lo_element_clientdata->append_child( new_child = lo_element_anchor ). lo_element_autofill = lo_document->create_simple_element( name = lc_xml_node_autofill parent = lo_document ). From aee3b3efa4c528da0259b2e4ab70b40722a132a9 Mon Sep 17 00:00:00 2001 From: sandraros <34005250+sandraros@users.noreply.github.com> Date: Sat, 11 May 2024 16:56:20 +0200 Subject: [PATCH 36/47] More control on comment box position/size (#1226) --- src/zcl_excel_comment.clas.abap | 76 +++++++++++++++++++++++++++-- src/zcl_excel_writer_2007.clas.abap | 35 ++++++++----- 2 files changed, 95 insertions(+), 16 deletions(-) diff --git a/src/zcl_excel_comment.clas.abap b/src/zcl_excel_comment.clas.abap index a285701..f9ad9e0 100644 --- a/src/zcl_excel_comment.clas.abap +++ b/src/zcl_excel_comment.clas.abap @@ -9,12 +9,21 @@ CLASS zcl_excel_comment DEFINITION CONSTANTS default_bottom_row TYPE i VALUE 15. "#EC NOTEXT METHODS constructor . + METHODS get_bottom_offset + RETURNING + VALUE(rp_result) TYPE i . METHODS get_bottom_row RETURNING VALUE(rp_result) TYPE i . METHODS get_index RETURNING VALUE(rp_index) TYPE string . + METHODS get_left_column + RETURNING + VALUE(rp_result) TYPE i . + METHODS get_left_offset + RETURNING + VALUE(rp_result) TYPE i . METHODS get_name RETURNING VALUE(r_name) TYPE string . @@ -24,24 +33,45 @@ CLASS zcl_excel_comment DEFINITION METHODS get_right_column RETURNING VALUE(rp_result) TYPE i . + METHODS get_right_offset + RETURNING + VALUE(rp_result) TYPE i . METHODS get_text RETURNING VALUE(rp_text) TYPE string . + METHODS get_top_offset + RETURNING + VALUE(rp_result) TYPE i . + METHODS get_top_row + RETURNING + VALUE(rp_result) TYPE i . METHODS set_text IMPORTING - !ip_text TYPE string - !ip_ref TYPE string OPTIONAL - !ip_right_column TYPE i OPTIONAL - !ip_bottom_row TYPE i OPTIONAL . + !ip_text TYPE string + !ip_ref TYPE string OPTIONAL + !ip_left_column TYPE i DEFAULT 2 + !ip_left_offset TYPE i DEFAULT 15 + !ip_top_row TYPE i DEFAULT 11 + !ip_top_offset TYPE i DEFAULT 10 + !ip_right_column TYPE i DEFAULT default_right_column + !ip_right_offset TYPE i DEFAULT 31 + !ip_bottom_row TYPE i DEFAULT default_bottom_row + !ip_bottom_offset TYPE i DEFAULT 9. PROTECTED SECTION. PRIVATE SECTION. + DATA bottom_offset TYPE i . DATA bottom_row TYPE i . DATA index TYPE string . DATA ref TYPE string . + DATA left_column TYPE i . + DATA left_offset TYPE i . DATA right_column TYPE i . + DATA right_offset TYPE i . DATA text TYPE string . + DATA top_offset TYPE i . + DATA top_row TYPE i . ENDCLASS. @@ -54,6 +84,11 @@ CLASS zcl_excel_comment IMPLEMENTATION. ENDMETHOD. + METHOD get_bottom_offset. + rp_result = bottom_offset. + ENDMETHOD. + + METHOD get_bottom_row. rp_result = bottom_row. ENDMETHOD. @@ -64,6 +99,16 @@ CLASS zcl_excel_comment IMPLEMENTATION. ENDMETHOD. + METHOD get_left_column. + rp_result = left_column. + ENDMETHOD. + + + METHOD get_left_offset. + rp_result = left_offset. + ENDMETHOD. + + METHOD get_name. ENDMETHOD. @@ -79,11 +124,26 @@ CLASS zcl_excel_comment IMPLEMENTATION. ENDMETHOD. + METHOD get_right_offset. + rp_result = right_offset. + ENDMETHOD. + + METHOD get_text. rp_text = me->text. ENDMETHOD. + METHOD get_top_offset. + rp_result = top_offset. + ENDMETHOD. + + + METHOD get_top_row. + rp_result = top_row. + ENDMETHOD. + + METHOD set_text. me->text = ip_text. @@ -91,17 +151,25 @@ CLASS zcl_excel_comment IMPLEMENTATION. me->ref = ip_ref. ENDIF. + me->left_column = ip_left_column. + me->left_offset = ip_left_offset. + + me->top_row = ip_top_row. + me->top_offset = ip_top_offset. + IF ip_right_column IS NOT INITIAL. me->right_column = ip_right_column. ELSE. me->right_column = default_right_column. ENDIF. + me->right_offset = ip_right_offset. IF ip_bottom_row IS NOT INITIAL. me->bottom_row = ip_bottom_row. ELSE. me->bottom_row = default_bottom_row. ENDIF. + me->bottom_offset = ip_bottom_offset. ENDMETHOD. ENDCLASS. diff --git a/src/zcl_excel_writer_2007.clas.abap b/src/zcl_excel_writer_2007.clas.abap index 958e639..38578c4 100644 --- a/src/zcl_excel_writer_2007.clas.abap +++ b/src/zcl_excel_writer_2007.clas.abap @@ -269,6 +269,11 @@ CLASS zcl_excel_writer_2007 DEFINITION !ip_flag TYPE flag RETURNING VALUE(ep_boolean) TYPE tv_charbool . + METHODS number2string + IMPORTING + !ip_number TYPE numeric + RETURNING + VALUE(ep_string) TYPE string. ENDCLASS. @@ -3139,7 +3144,6 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. lc_xml_attr_val_none TYPE string VALUE 'none', lc_xml_attr_val_msodir TYPE string VALUE 'mso-direction-alt:auto', lc_xml_attr_val_note TYPE string VALUE 'Note'. - CONSTANTS lc_anchor_init TYPE string VALUE '2, 15, 11, 10, &right_column&, 31, &bottom_row&, 9'. DATA: lo_document TYPE REF TO if_ixml_document, @@ -3181,6 +3185,10 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. DATA lv_right_column TYPE i. DATA lv_bottom_row_str TYPE string. DATA lv_right_column_str TYPE string. + DATA lv_top_row TYPE i. + DATA lv_left_column TYPE i. + DATA lv_top_row_str TYPE string. + DATA lv_left_column_str TYPE string. ********************************************************************** @@ -3310,17 +3318,14 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. " Offsets are a number of pixels. " Reference: Anchor Class at " https://learn.microsoft.com/en-us/dotnet/api/documentformat.openxml.vml.spreadsheet.anchor?view=openxml-3.0.1 - lv_right_column = lo_comment->get_right_column( ). - lv_bottom_row = lo_comment->get_bottom_row( ). - - lv_right_column_str = lv_right_column. - CONDENSE lv_right_column_str. - lv_bottom_row_str = lv_bottom_row. - CONDENSE lv_bottom_row_str. - - lv_anchor = lc_anchor_init. - REPLACE '&right_column&' WITH lv_right_column_str INTO lv_anchor. - REPLACE '&bottom_row&' WITH lv_bottom_row_str INTO lv_anchor. + lv_anchor = number2string( lo_comment->get_left_column( ) ) + && `, ` && number2string( lo_comment->get_left_offset( ) ) + && `, ` && number2string( lo_comment->get_top_row( ) ) + && `, ` && number2string( lo_comment->get_top_offset( ) ) + && `, ` && number2string( lo_comment->get_right_column( ) ) + && `, ` && number2string( lo_comment->get_right_offset( ) ) + && `, ` && number2string( lo_comment->get_bottom_row( ) ) + && `, ` && number2string( lo_comment->get_bottom_offset( ) ). lo_element_anchor->set_value( lv_anchor ). lo_element_clientdata->append_child( new_child = lo_element_anchor ). @@ -6224,6 +6229,12 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. ENDMETHOD. + METHOD number2string. + ep_string = ip_number. + CONDENSE ep_string. + ENDMETHOD. + + METHOD render_xml_document. DATA lo_streamfactory TYPE REF TO if_ixml_stream_factory. DATA lo_ostream TYPE REF TO if_ixml_ostream. From c2096d1f9bcc69101350ef16893add6998eed08a Mon Sep 17 00:00:00 2001 From: RixarSAP <168567887+RixarSAP@users.noreply.github.com> Date: Sat, 11 May 2024 17:34:06 +0200 Subject: [PATCH 37/47] Added field WIDTH in field catalog of method BIND_TABLE (#1224) Fix #1227 --- src/zcl_excel_worksheet.clas.abap | 4 ++++ src/zexcel_s_fieldcatalog.tabl.xml | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index cfa86a3..6ef57ac 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -1083,6 +1083,10 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ). + IF -width IS NOT INITIAL. + set_column_width( ip_column = lv_column_alpha ip_width_fix = -width ). + ENDIF. + " First of all write column header IF -style_header IS NOT INITIAL. me->set_cell( ip_column = lv_column_alpha diff --git a/src/zexcel_s_fieldcatalog.tabl.xml b/src/zexcel_s_fieldcatalog.tabl.xml index 2b77705..30e2add 100644 --- a/src/zexcel_s_fieldcatalog.tabl.xml +++ b/src/zexcel_s_fieldcatalog.tabl.xml @@ -123,6 +123,12 @@ 0 E + + WIDTH + INT4 + 0 + E + 1 From fd2dc14ac21cc785406b29ecd27c4fe3ebfa20fe Mon Sep 17 00:00:00 2001 From: sandraros <34005250+sandraros@users.noreply.github.com> Date: Sun, 12 May 2024 11:57:33 +0200 Subject: [PATCH 38/47] Support of empty cell address by LOAD (workbook) (#1225) Fix #1081 Co-authored-by: sandraros Co-authored-by: Andrea Borgia --- src/zcl_excel_reader_2007.clas.abap | 31 +++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/zcl_excel_reader_2007.clas.abap b/src/zcl_excel_reader_2007.clas.abap index 0731548..70dae56 100644 --- a/src/zcl_excel_reader_2007.clas.abap +++ b/src/zcl_excel_reader_2007.clas.abap @@ -2558,6 +2558,7 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. lv_max_col = lv_index. ENDIF. lv_cell_row = ls_row-r. + lv_cell_column = ''. lo_row = io_worksheet->get_row( lv_cell_row ). IF ls_row-customheight = '1'. lo_row->set_row_height( ip_row_height = ls_row-ht ip_custom_height = abap_true ). @@ -2594,6 +2595,26 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_cell_elem CHANGING cp_structure = ls_cell ). + " Determine the column number + IF ls_cell-r IS NOT INITIAL. + " Note that the row should remain unchanged = the one defined by + " i.e. in ..., ls_cell-r would be "A1", + " the "1" of A1 should always be equal to the "1" of convert_columnrow2column_a_row( EXPORTING + i_columnrow = ls_cell-r + IMPORTING + e_column = lv_cell_column + e_row = lv_cell_row ). + ELSE. + " The column is the column after the last cell previously initialized in the same row. + " NB: the row is unchanged = the one defined by e.g. "1" in ... + IF lv_cell_column IS INITIAL. + lv_cell_column = 'A'. + ELSE. + lv_cell_column = zcl_excel_common=>convert_column2alpha( zcl_excel_common=>convert_column2int( lv_cell_column ) + 1 ). + ENDIF. + ENDIF. + lo_ixml_value_elem = lo_ixml_cell_elem->find_from_name_ns( name = 'v' uri = namespace-main ). CASE ls_cell-t. @@ -2642,11 +2663,6 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_formula_elem CHANGING cp_structure = ls_formula_attributes ). IF ls_formula_attributes-t = 'shared'. - zcl_excel_common=>convert_columnrow2column_a_row( EXPORTING - i_columnrow = ls_cell-r - IMPORTING - e_column = lv_cell_column - e_row = lv_cell_row ). TRY. CLEAR ls_ref_formula. @@ -2671,11 +2687,6 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. IF lv_cell_value IS NOT INITIAL OR lv_cell_formula IS NOT INITIAL OR lv_style_guid IS NOT INITIAL. - zcl_excel_common=>convert_columnrow2column_a_row( EXPORTING - i_columnrow = ls_cell-r - IMPORTING - e_column = lv_cell_column - e_row = lv_cell_row ). io_worksheet->set_cell( ip_column = lv_cell_column " cell_elem Column ip_row = lv_cell_row " cell_elem row_elem ip_value = lv_cell_value " cell_elem Value From 564d60e0f55a540e19c99ddc35f05883514c617e Mon Sep 17 00:00:00 2001 From: Bernd <135710507+darnoc312@users.noreply.github.com> Date: Sun, 9 Jun 2024 10:39:59 +0200 Subject: [PATCH 39/47] Update zcl_excel_reader_2007.clas.abap (#1234) --- src/zcl_excel_reader_2007.clas.abap | 1 + 1 file changed, 1 insertion(+) diff --git a/src/zcl_excel_reader_2007.clas.abap b/src/zcl_excel_reader_2007.clas.abap index 70dae56..53fc484 100644 --- a/src/zcl_excel_reader_2007.clas.abap +++ b/src/zcl_excel_reader_2007.clas.abap @@ -2190,6 +2190,7 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION. ENDIF. WHEN OTHERS. + lo_range = -worksheet->add_new_range( ). ENDCASE. ENDIF. From e389d2dff58f5987decde6ed036d2ee61e7f1b7a Mon Sep 17 00:00:00 2001 From: Bernd <135710507+darnoc312@users.noreply.github.com> Date: Sun, 9 Jun 2024 20:34:29 +0200 Subject: [PATCH 40/47] Worksheet's method set_title doesn't handle escaped titles and sheetlocal ranges (#1236) Fix #1235 --- src/zcl_excel_worksheet.clas.abap | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index 6ef57ac..e2c418d 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -4525,7 +4525,6 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. *--------------------------------------------------------------------* DATA: lo_worksheets_iterator TYPE REF TO zcl_excel_collection_iterator, lo_worksheet TYPE REF TO zcl_excel_worksheet, - errormessage TYPE string, lv_rangesheetname_old TYPE string, lv_rangesheetname_new TYPE string, lo_ranges_iterator TYPE REF TO zcl_excel_collection_iterator, @@ -4555,14 +4554,14 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. * Check whether title is unique in workbook *--------------------------------------------------------------------* lo_worksheets_iterator = me->excel->get_worksheets_iterator( ). - WHILE lo_worksheets_iterator->has_next( ) = 'X'. + WHILE lo_worksheets_iterator->has_next( ) = abap_true. lo_worksheet ?= lo_worksheets_iterator->get_next( ). CHECK me->guid <> lo_worksheet->get_guid( ). " Don't check against itself IF ip_title = lo_worksheet->get_title( ). " Not unique --> raise exception - errormessage = 'Duplicate sheetname &'. - REPLACE '&' IN errormessage WITH ip_title. - zcx_excel=>raise_text( errormessage ). + lv_errormessage = 'Duplicate sheetname &'. + REPLACE '&' IN lv_errormessage WITH ip_title. + zcx_excel=>raise_text( lv_errormessage ). ENDIF. ENDWHILE. @@ -4570,7 +4569,7 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. *--------------------------------------------------------------------* * Remember old sheetname and rename sheet to desired name *--------------------------------------------------------------------* - CONCATENATE me->title '!' INTO lv_rangesheetname_old. + lv_rangesheetname_old = zcl_excel_common=>escape_string( me->title ) && '!'. me->title = ip_title. *--------------------------------------------------------------------* @@ -4581,10 +4580,10 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. * I fear it isn't - but this implementation is better then * nothing at all since it handles a supposed majority of cases *--------------------------------------------------------------------* - CONCATENATE me->title '!' INTO lv_rangesheetname_new. + lv_rangesheetname_new = zcl_excel_common=>escape_string( me->title ) && '!'. - lo_ranges_iterator = me->excel->get_ranges_iterator( ). - WHILE lo_ranges_iterator->has_next( ) = 'X'. + lo_ranges_iterator = me->excel->get_ranges_iterator( ). "workbookglobal ranges + WHILE lo_ranges_iterator->has_next( ) = abap_true. lo_range ?= lo_ranges_iterator->get_next( ). lv_range_value = lo_range->get_value( ). @@ -4595,6 +4594,20 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ENDWHILE. + IF me->ranges IS BOUND. "not yet bound if called from worksheet's constructor + lo_ranges_iterator = me->get_ranges_iterator( ). "sheetlocal ranges, repeat rows and columns + WHILE lo_ranges_iterator->has_next( ) = abap_true. + + lo_range ?= lo_ranges_iterator->get_next( ). + lv_range_value = lo_range->get_value( ). + REPLACE ALL OCCURRENCES OF lv_rangesheetname_old IN lv_range_value WITH lv_rangesheetname_new. + IF sy-subrc = 0. + lo_range->set_range_value( lv_range_value ). + ENDIF. + + ENDWHILE. + ENDIF. + ENDMETHOD. "SET_TITLE From d25eb31d78abb5762d4cd6131ba253b3124472ed Mon Sep 17 00:00:00 2001 From: sandraros <34005250+sandraros@users.noreply.github.com> Date: Sun, 9 Jun 2024 20:40:45 +0200 Subject: [PATCH 41/47] Remove no-more-appropriate comments from set_title (#1237) These comments are old and useless --- src/zcl_excel_worksheet.clas.abap | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index e2c418d..ec2e692 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -4505,24 +4505,6 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. METHOD set_title. -*--------------------------------------------------------------------* -* ToDos: -* 2do §1 The current coding for replacing a named ranges name -* after renaming a sheet should be checked if it is -* really working if sheetname should be escaped -*--------------------------------------------------------------------* - -*--------------------------------------------------------------------* -* issue #230 - Pimp my Code -* - Stefan Schmoecker, (wip ) 2012-12-08 -* - ... -* changes: aligning code -* message made to support multilinguality -*--------------------------------------------------------------------* -* issue#243 - ' is not allowed as first character in sheet title -* - Stefan Schmoecker, 2012-12-02 -* changes: added additional check for ' as first character -*--------------------------------------------------------------------* DATA: lo_worksheets_iterator TYPE REF TO zcl_excel_collection_iterator, lo_worksheet TYPE REF TO zcl_excel_worksheet, lv_rangesheetname_old TYPE string, @@ -4575,10 +4557,6 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. *--------------------------------------------------------------------* * After changing this worksheet's title we have to adjust * all ranges that are referring to this worksheet. -*--------------------------------------------------------------------* -* 2do §1 - Check if the following quickfix is solid -* I fear it isn't - but this implementation is better then -* nothing at all since it handles a supposed majority of cases *--------------------------------------------------------------------* lv_rangesheetname_new = zcl_excel_common=>escape_string( me->title ) && '!'. From 48db7f0b1b737d71a9e6ed2c9c1d45487df4f6af Mon Sep 17 00:00:00 2001 From: Bernd <135710507+darnoc312@users.noreply.github.com> Date: Sat, 15 Jun 2024 12:07:36 +0200 Subject: [PATCH 42/47] How to get rid of the obscure code in writer's method create_xl_sheet_sheet_data step #1 (#1231) Fix #440 --- src/zcl_excel_autofilter.clas.abap | 26 +++++----------- src/zcl_excel_writer_2007.clas.abap | 48 ++++------------------------- 2 files changed, 14 insertions(+), 60 deletions(-) diff --git a/src/zcl_excel_autofilter.clas.abap b/src/zcl_excel_autofilter.clas.abap index a0ed31f..13bff99 100644 --- a/src/zcl_excel_autofilter.clas.abap +++ b/src/zcl_excel_autofilter.clas.abap @@ -19,7 +19,7 @@ CLASS zcl_excel_autofilter DEFINITION tr_textfilter2 TYPE RANGE OF string, END OF ts_filter . TYPES: - tt_filters TYPE HASHED TABLE OF ts_filter WITH UNIQUE KEY column . + tt_filters TYPE SORTED TABLE OF ts_filter WITH UNIQUE KEY column . DATA filter_area TYPE zexcel_s_autofilter_area . CONSTANTS mc_filter_rule_single_values TYPE tv_filter_rule VALUE 'single_values'. "#EC NOTEXT @@ -208,9 +208,6 @@ CLASS zcl_excel_autofilter IMPLEMENTATION. METHOD is_row_hidden. - DATA: lr_filter TYPE REF TO ts_filter, - lv_col TYPE i. - FIELD-SYMBOLS: TYPE ts_filter. rv_is_hidden = abap_false. @@ -219,29 +216,25 @@ CLASS zcl_excel_autofilter IMPLEMENTATION. * 1st row of filter area is never hidden, because here the filter * symbol is being shown *--------------------------------------------------------------------* - IF iv_row = me->filter_area-row_start. + IF iv_row <= me->filter_area-row_start OR + iv_row > me->filter_area-row_end. RETURN. ENDIF. - lv_col = me->filter_area-col_start. - - - WHILE lv_col <= me->filter_area-col_end. - - lr_filter = me->get_column_filter( lv_col ). - ASSIGN lr_filter->* TO . + LOOP AT mt_filters ASSIGNING WHERE column >= me->filter_area-col_start + AND column <= me->filter_area-col_end. CASE -rule. WHEN mc_filter_rule_single_values. rv_is_hidden = me->is_row_hidden_single_values( iv_row = iv_row - iv_col = lv_col + iv_col = -column is_filter = ). WHEN mc_filter_rule_text_pattern. rv_is_hidden = me->is_row_hidden_text_pattern( iv_row = iv_row - iv_col = lv_col + iv_col = -column is_filter = ). ENDCASE. @@ -250,10 +243,7 @@ CLASS zcl_excel_autofilter IMPLEMENTATION. RETURN. ENDIF. - - ADD 1 TO lv_col. - - ENDWHILE. + ENDLOOP. ENDMETHOD. diff --git a/src/zcl_excel_writer_2007.clas.abap b/src/zcl_excel_writer_2007.clas.abap index 38578c4..06e0b62 100644 --- a/src/zcl_excel_writer_2007.clas.abap +++ b/src/zcl_excel_writer_2007.clas.abap @@ -4233,10 +4233,6 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. DATA: col_count TYPE int4, lo_autofilters TYPE REF TO zcl_excel_autofilters, lo_autofilter TYPE REF TO zcl_excel_autofilter, - l_autofilter_hidden TYPE flag, - lt_values TYPE zexcel_t_autofilter_values, - ls_values TYPE zexcel_s_autofilter_values, - ls_area TYPE zexcel_s_autofilter_area, lo_iterator TYPE REF TO zcl_excel_collection_iterator, lo_table TYPE REF TO zcl_excel_table, @@ -4282,9 +4278,8 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. lo_autofilters = excel->get_autofilters_reference( ). lo_autofilter = lo_autofilters->get( io_worksheet = io_worksheet ) . IF lo_autofilter IS BOUND. - lt_values = lo_autofilter->get_values( ) . - ls_area = lo_autofilter->get_filter_area( ) . - l_autofilter_hidden = abap_true. " First defautl is not showing +* Area not used here, but makes the validation for lo_autofilter->is_row_hidden + lo_autofilter->get_filter_area( ) . ENDIF. *--------------------------------------------------------------------* *issue #220 - If cell in tables-area don't use default from row or column or sheet - Coding 1 - start @@ -4347,14 +4342,6 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. CLEAR ls_sheet_content. LOOP AT io_worksheet->sheet_content INTO ls_sheet_content. - IF lt_values IS INITIAL. " no values attached to autofilter " issue #368 autofilter filtering too much - CLEAR l_autofilter_hidden. - ELSE. - READ TABLE lt_values INTO ls_values WITH KEY column = ls_last_row-cell_column. - IF sy-subrc = 0 AND ls_values-value = ls_last_row-cell_value. - CLEAR l_autofilter_hidden. - ENDIF. - ENDIF. CLEAR ls_style_mapping. *Create row element *issues #346,#154, #195 - problems when we have information in row_dimension but no cell content in that row @@ -4385,18 +4372,11 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. ENDIF. IF ls_last_row-cell_row NE -cell_row. - IF lo_autofilter IS BOUND. - IF ls_area-row_start >= ls_last_row-cell_row OR " One less for header - ls_area-row_end < ls_last_row-cell_row . - CLEAR l_autofilter_hidden. - ENDIF. - ELSE. - CLEAR l_autofilter_hidden. - ENDIF. IF ls_last_row-cell_row IS NOT INITIAL. " Row visibility of previos row. IF lo_row->get_visible( io_worksheet ) = abap_false OR - l_autofilter_hidden = abap_true. + ( lo_autofilter IS BOUND AND + lo_autofilter->is_row_hidden( ls_last_row-cell_row ) = abap_true ). lo_element_2->set_attribute_ns( name = 'hidden' value = 'true' ). ENDIF. rv_ixml_sheet_data_root->append_child( new_child = lo_element_2 ). " row node @@ -4444,11 +4424,6 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. lo_element_2->set_attribute_ns( name = 's' value = lv_value ). lo_element_2->set_attribute_ns( name = 'customFormat' value = '1' ). ENDIF. - IF lt_values IS INITIAL. " no values attached to autofilter " issue #368 autofilter filtering too much - CLEAR l_autofilter_hidden. - ELSE. - l_autofilter_hidden = abap_true. " First default is not showing - ENDIF. ELSE. ENDIF. @@ -4561,21 +4536,10 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION. ls_last_row = . ENDLOOP. IF sy-subrc = 0. - READ TABLE lt_values INTO ls_values WITH KEY column = ls_last_row-cell_column. - IF sy-subrc = 0 AND ls_values-value = ls_last_row-cell_value. - CLEAR l_autofilter_hidden. - ENDIF. - IF lo_autofilter IS BOUND. - IF ls_area-row_start >= ls_last_row-cell_row OR " One less for header - ls_area-row_end < ls_last_row-cell_row . - CLEAR l_autofilter_hidden. - ENDIF. - ELSE. - CLEAR l_autofilter_hidden. - ENDIF. " Row visibility of previos row. IF lo_row->get_visible( ) = abap_false OR - l_autofilter_hidden = abap_true. + ( lo_autofilter IS BOUND AND + lo_autofilter->is_row_hidden( ls_last_row-cell_row ) = abap_true ). lo_element_2->set_attribute_ns( name = 'hidden' value = 'true' ). ENDIF. rv_ixml_sheet_data_root->append_child( new_child = lo_element_2 ). " row node From 5ee365d8316efbd7d628ecf6d6f40a1ffe436a85 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Mon, 5 Aug 2024 19:06:55 +0200 Subject: [PATCH 43/47] update npm dependencies (#1207) --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index f5817ab..935f0ad 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,8 @@ "url": "git+https://github.com/abap2xlsx/abap2xlsx.git" }, "devDependencies": { - "@abaplint/cli": "^2.105.14", - "@abaplint/transpiler-cli": "^2.7.153", - "@abaplint/runtime": "^2.7.153" + "@abaplint/cli": "^2.112.10", + "@abaplint/transpiler-cli": "^2.10.7", + "@abaplint/runtime": "^2.10.7" } } From 0f19081a043341b8e773a9bd3dfd358a12cbdc5e Mon Sep 17 00:00:00 2001 From: sandraros <34005250+sandraros@users.noreply.github.com> Date: Tue, 6 Aug 2024 14:12:23 +0200 Subject: [PATCH 44/47] Code to handle the UTCLONG type added in ABAP 7.54 (#1253) Fix #1252 --- abap_transpile.json | 1 + package.json | 4 +-- src/zcl_excel_common.clas.abap | 20 +++++++++++ src/zcl_excel_common.clas.testclasses.abap | 41 ++++++++++++++++++++++ src/zcl_excel_worksheet.clas.abap | 36 +++++++++++++++++++ 5 files changed, 100 insertions(+), 2 deletions(-) diff --git a/abap_transpile.json b/abap_transpile.json index 3bc587c..db1ca88 100644 --- a/abap_transpile.json +++ b/abap_transpile.json @@ -54,6 +54,7 @@ {"object": "ZCL_EXCEL_WRITER_2007", "class": "ltc_column_formula", "method": "one_column_formula", "note": "?? CALL TRANSFORMATION xml_header = 'no'"}, {"object": "ZCL_EXCEL_WRITER_2007", "class": "ltc_column_formula", "method": "two_column_formulas", "note": "??"}, + {"object": "ZCL_EXCEL_COMMON", "class": "ltc_utclong_to_excel_string", "method": "simple", "note": "?? missing method CL_ABAP_TSTMP=>UTCLONG2TSTMP_SHORT, I'm too lazy to add it today"}, {"object": "ZCL_EXCEL_COMMON", "class": "lcl_excel_common_test", "method": "convert_column2int_oob_empty", "note": "?? sy value defaults"} ] } diff --git a/package.json b/package.json index 935f0ad..d96f562 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ }, "devDependencies": { "@abaplint/cli": "^2.112.10", - "@abaplint/transpiler-cli": "^2.10.7", - "@abaplint/runtime": "^2.10.7" + "@abaplint/transpiler-cli": "^2.10.9", + "@abaplint/runtime": "^2.10.9" } } diff --git a/src/zcl_excel_common.clas.abap b/src/zcl_excel_common.clas.abap index 67a9e6c..917486b 100644 --- a/src/zcl_excel_common.clas.abap +++ b/src/zcl_excel_common.clas.abap @@ -166,6 +166,11 @@ CLASS zcl_excel_common DEFINITION !ip_value TYPE t RETURNING VALUE(ep_value) TYPE zexcel_cell_value . + CLASS-METHODS utclong_to_excel_string + IMPORTING + !ip_utclong TYPE any + RETURNING + VALUE(ep_value) TYPE zexcel_cell_value . TYPES: t_char10 TYPE c LENGTH 10. TYPES: t_char255 TYPE c LENGTH 255. CLASS-METHODS split_file @@ -1725,4 +1730,19 @@ CLASS zcl_excel_common IMPLEMENTATION. ENDMETHOD. + METHOD utclong_to_excel_string. + DATA lv_timestamp TYPE timestamp. + DATA lv_date TYPE d. + DATA lv_time TYPE t. + + " The data type UTCLONG and the method UTCLONG2TSTMP_SHORT are not available before ABAP 7.54 + " -> Need of a dynamic call to avoid compilation error before ABAP 7.54 + + CALL METHOD cl_abap_tstmp=>('UTCLONG2TSTMP_SHORT') + EXPORTING utclong = ip_utclong + RECEIVING timestamp = lv_timestamp. + CONVERT TIME STAMP lv_timestamp TIME ZONE 'UTC ' INTO DATE lv_date TIME lv_time. + ep_value = |{ date_to_excel_string( lv_date ) + time_to_excel_string( lv_time ) }|. + ENDMETHOD. + ENDCLASS. diff --git a/src/zcl_excel_common.clas.testclasses.abap b/src/zcl_excel_common.clas.testclasses.abap index bf5f471..a6e2970 100644 --- a/src/zcl_excel_common.clas.testclasses.abap +++ b/src/zcl_excel_common.clas.testclasses.abap @@ -136,6 +136,17 @@ CLASS lcl_excel_common_test DEFINITION FOR TESTING ENDCLASS. +CLASS ltc_utclong_to_excel_string DEFINITION + FOR TESTING + RISK LEVEL HARMLESS + DURATION SHORT. + + PRIVATE SECTION. + + METHODS simple FOR TESTING. + +ENDCLASS. + *----------------------------------------------------------------------* * CLASS lcl_Excel_Common_Test IMPLEMENTATION @@ -1812,3 +1823,33 @@ CLASS lcl_excel_common_test IMPLEMENTATION. ENDMETHOD. ENDCLASS. + + +CLASS ltc_utclong_to_excel_string IMPLEMENTATION. + METHOD simple. + FIELD-SYMBOLS TYPE abap_typekind. + FIELD-SYMBOLS TYPE simple. + DATA lo_rtti_utclong TYPE REF TO cl_abap_datadescr. + DATA lv_variable_utclong TYPE REF TO data. + DATA lv_excel_string TYPE zexcel_cell_value. + + " Skip this test before ABAP 7.54 (UTCLONG does not exist). + " Need of dynamic referencing and dynamic call to avoid compilation error before ABAP 7.54. + + ASSIGN ('CL_ABAP_TYPEDESCR=>TYPEKIND_UTCLONG') TO . + IF sy-subrc <> 0. + RETURN. + ENDIF. + + CALL METHOD cl_abap_elemdescr=>('GET_UTCLONG') + RECEIVING p_result = lo_rtti_utclong. + CREATE DATA lv_variable_utclong TYPE HANDLE lo_rtti_utclong. + ASSIGN lv_variable_utclong->* TO . + + = '2024-08-04 19:47:00.9999999'. + lv_excel_string = zcl_excel_common=>utclong_to_excel_string( ). + + cl_abap_unit_assert=>assert_equals( exp = '45508.82430555555556' + act = lv_excel_string ). + ENDMETHOD. +ENDCLASS. diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index ec2e692..169e293 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -708,6 +708,10 @@ CLASS zcl_excel_worksheet DEFINITION *"* 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. + + CLASS-DATA typekind_utclong TYPE abap_typekind. + CLASS-DATA variable_utclong TYPE REF TO data. + DATA active_cell TYPE zexcel_s_cell_data . DATA charts TYPE REF TO zcl_excel_drawings . DATA columns TYPE REF TO zcl_excel_columns . @@ -2023,12 +2027,21 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. METHOD class_constructor. + FIELD-SYMBOLS TYPE abap_typekind. + DATA lo_rtti TYPE REF TO cl_abap_datadescr. 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) }|. + ASSIGN ('CL_ABAP_TYPEDESCR=>TYPEKIND_UTCLONG') TO . + IF sy-subrc = 0. + typekind_utclong = . + CALL METHOD cl_abap_elemdescr=>('GET_UTCLONG') RECEIVING p_result = lo_rtti. + CREATE DATA variable_utclong TYPE HANDLE lo_rtti. + ENDIF. + ENDMETHOD. @@ -3847,6 +3860,7 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. TYPE abap_typekind. FIELD-SYMBOLS: TYPE mty_s_column_formula. FIELD-SYMBOLS: TYPE zexcel_s_fieldcatalog. + FIELD-SYMBOLS TYPE simple. IF ip_value IS NOT SUPPLIED AND ip_formula IS NOT SUPPLIED @@ -3990,6 +4004,13 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. * ENDIF. * End of change issue #152 - don't touch exisiting style if only value is passed + WHEN typekind_utclong. + ASSIGN variable_utclong->* TO . + IF sy-subrc = 0. + = . + lv_value = zcl_excel_common=>utclong_to_excel_string( ). + ENDIF. + WHEN OTHERS. zcx_excel=>raise_text( 'Invalid data type of input value' ). ENDCASE. @@ -4095,6 +4116,21 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ip_row = lv_row ip_number_format_format_code = lo_format_code_datetime ). + WHEN typekind_utclong. + TRY. + stylemapping = me->excel->get_style_to_guid( -cell_style ). + CATCH zcx_excel . + ENDTRY. + IF stylemapping-complete_stylex-number_format-format_code IS INITIAL OR + stylemapping-complete_style-number_format-format_code IS INITIAL. + lo_format_code_datetime = zcl_excel_style_number_format=>c_format_date_datetime. + ELSE. + lo_format_code_datetime = stylemapping-complete_style-number_format-format_code. + ENDIF. + me->change_cell_style( ip_column = lv_column + ip_row = lv_row + ip_number_format_format_code = lo_format_code_datetime ). + ENDCASE. * End of change issue #152 - don't touch exisiting style if only value is passed From 4e1931af159498bca2359eba60c9932ccceee61a Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Wed, 7 Aug 2024 09:05:50 +0200 Subject: [PATCH 45/47] font class cleanup (#1125) --- src/zcl_excel_font.clas.abap | 30 ++++++++++++++++-------------- src/zcl_excel_worksheet.clas.abap | 2 +- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/zcl_excel_font.clas.abap b/src/zcl_excel_font.clas.abap index b670008..343d90e 100644 --- a/src/zcl_excel_font.clas.abap +++ b/src/zcl_excel_font.clas.abap @@ -5,6 +5,21 @@ CLASS zcl_excel_font DEFINITION PUBLIC SECTION. + TYPES ty_font_height TYPE n LENGTH 3. + CONSTANTS lc_default_font_height TYPE ty_font_height VALUE '110' ##NO_TEXT. + CONSTANTS lc_default_font_name TYPE zexcel_style_font_name VALUE 'Calibri' ##NO_TEXT. + + CLASS-METHODS calculate_text_width + IMPORTING + !iv_font_name TYPE zexcel_style_font_name + !iv_font_height TYPE ty_font_height + !iv_flag_bold TYPE abap_bool + !iv_flag_italic TYPE abap_bool + !iv_cell_value TYPE zexcel_cell_value + RETURNING + VALUE(rv_width) TYPE f . + PROTECTED SECTION. + PRIVATE SECTION. TYPES: BEGIN OF mty_s_font_metric, char TYPE c LENGTH 1, @@ -17,7 +32,7 @@ CLASS zcl_excel_font DEFINITION TYPES: BEGIN OF mty_s_font_cache, font_name TYPE zexcel_style_font_name, - font_height TYPE tdfontsize, + font_height TYPE ty_font_height, flag_bold TYPE abap_bool, flag_italic TYPE abap_bool, th_font_metrics TYPE mty_th_font_metrics, @@ -27,21 +42,8 @@ CLASS zcl_excel_font DEFINITION TYPE HASHED TABLE OF mty_s_font_cache WITH UNIQUE KEY font_name font_height flag_bold flag_italic . - CONSTANTS lc_default_font_height TYPE tdfontsize VALUE '110' ##NO_TEXT. - CONSTANTS lc_default_font_name TYPE zexcel_style_font_name VALUE 'Calibri' ##NO_TEXT. CLASS-DATA mth_font_cache TYPE mty_th_font_cache . - CLASS-METHODS calculate_text_width - IMPORTING - !iv_font_name TYPE zexcel_style_font_name - !iv_font_height TYPE tdfontsize - !iv_flag_bold TYPE abap_bool - !iv_flag_italic TYPE abap_bool - !iv_cell_value TYPE zexcel_cell_value - RETURNING - VALUE(rv_width) TYPE f . - PROTECTED SECTION. - PRIVATE SECTION. ENDCLASS. diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index 169e293..3da076d 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -1303,7 +1303,7 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. 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_height TYPE zcl_excel_font=>ty_font_height 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 From 3d2926c5a676daa47680a3f0a028c027d254c138 Mon Sep 17 00:00:00 2001 From: Bernd <135710507+darnoc312@users.noreply.github.com> Date: Sat, 17 Aug 2024 17:07:05 +0200 Subject: [PATCH 46/47] Update ZEXCEL_FILL_TYPE 'cornerRB' (#1258) Fix #1257 --- src/zcl_excel_style_fill.clas.abap | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/zcl_excel_style_fill.clas.abap b/src/zcl_excel_style_fill.clas.abap index f20b06d..0ca8cc7 100644 --- a/src/zcl_excel_style_fill.clas.abap +++ b/src/zcl_excel_style_fill.clas.abap @@ -135,10 +135,10 @@ CLASS zcl_excel_style_fill IMPLEMENTATION. gradtype-type = c_fill_gradient_path. gradtype-position1 = '0'. gradtype-position2 = '1'. - gradtype-bottom = '0.5'. - gradtype-top = '0.5'. - gradtype-left = '0.5'. - gradtype-right = '0.5'. + gradtype-bottom = '1'. + gradtype-top = '1'. + gradtype-left = '1'. + gradtype-right = '1'. ENDCASE. ENDMETHOD. "build_gradient From b5f5d11e1c7c91a139231f4e628c754bed91aa22 Mon Sep 17 00:00:00 2001 From: sandraros <34005250+sandraros@users.noreply.github.com> Date: Sun, 18 Aug 2024 14:52:53 +0200 Subject: [PATCH 47/47] Fix default cell format to not use UTCLONG (#1262) Fix #1261 Co-authored-by: sandraros --- src/zcl_excel_worksheet.clas.abap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index 3da076d..acd45fb 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -709,7 +709,8 @@ CLASS zcl_excel_worksheet DEFINITION *"* do not include other source files here!!! TYPES ty_table_settings TYPE STANDARD TABLE OF zexcel_s_table_settings WITH DEFAULT KEY. - CLASS-DATA typekind_utclong TYPE abap_typekind. + CONSTANTS typekind_utclong TYPE abap_typekind VALUE 'p'. + CLASS-DATA variable_utclong TYPE REF TO data. DATA active_cell TYPE zexcel_s_cell_data . @@ -2037,7 +2038,6 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ASSIGN ('CL_ABAP_TYPEDESCR=>TYPEKIND_UTCLONG') TO . IF sy-subrc = 0. - typekind_utclong = . CALL METHOD cl_abap_elemdescr=>('GET_UTCLONG') RECEIVING p_result = lo_rtti. CREATE DATA variable_utclong TYPE HANDLE lo_rtti. ENDIF.