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..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,8 +74,18 @@ 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.
- 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.
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.
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
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