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/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.
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/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": {
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/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/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..011dc9d 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.
@@ -122,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.
@@ -347,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.
@@ -467,6 +472,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.
* ========================
@@ -1603,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.
diff --git a/src/zcl_excel_reader_2007.clas.abap b/src/zcl_excel_reader_2007.clas.abap
index f7afd92..c130620 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
@@ -290,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',
@@ -2232,12 +2253,16 @@ 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,
+ topleftcell TYPE string,
END OF lty_sheetview.
TYPES: BEGIN OF lty_mergecell,
@@ -2314,6 +2339,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 +2434,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 +2506,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 +2533,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( ).
@@ -2767,7 +2809,13 @@ 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.
+ 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 ).
@@ -2859,6 +2907,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.
@@ -2869,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
@@ -2893,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 ).
@@ -3870,6 +3926,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,
@@ -4108,17 +4288,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.
@@ -4131,10 +4315,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.
@@ -4257,4 +4442,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.
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
diff --git a/src/zcl_excel_theme.clas.abap b/src/zcl_excel_theme.clas.abap
index 75c3323..931c7a0 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( ).
@@ -208,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
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 ).
diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap
index c650015..81b24f0 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
@@ -172,6 +174,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 +502,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
@@ -547,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 .
@@ -563,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 .
@@ -673,6 +687,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
@@ -796,15 +811,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
@@ -974,7 +989,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,
@@ -1000,7 +1016,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.
@@ -1099,6 +1116,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.
@@ -1150,18 +1168,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.
@@ -1170,11 +1196,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.
@@ -2263,6 +2291,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.
@@ -3900,12 +3932,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
@@ -4284,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
@@ -4340,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
@@ -4357,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,
@@ -4375,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 .
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_2007.clas.locals_imp.abap b/src/zcl_excel_writer_2007.clas.locals_imp.abap
index 988607c..0ae8e20 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.
@@ -393,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 ).
@@ -415,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' ).
diff --git a/src/zcl_excel_writer_csv.clas.abap b/src/zcl_excel_writer_csv.clas.abap
index 5c1bd82..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,13 +60,17 @@ ENDCLASS.
-CLASS zcl_excel_writer_csv IMPLEMENTATION.
+CLASS ZCL_EXCEL_WRITER_CSV IMPLEMENTATION.
METHOD create.
* .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.
@@ -216,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 ).
@@ -298,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
+
+
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( ).
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
+
+ ZCX_EXCEL
+ 0001
+
+
CONSTRUCTOR
diff --git a/src/zexcel_s_fieldcatalog.tabl.xml b/src/zexcel_s_fieldcatalog.tabl.xml
index b7958b7..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
@@ -117,7 +117,132 @@
0
E
+
+ CURRENCY_COLUMN
+ ZEXCEL_FIELDNAME
+ 0
+ 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
+
+
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
-
-
-
-
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