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/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.testclasses.abap b/src/zcl_excel_common.clas.testclasses.abap index eaa4279..579afd1 100644 --- a/src/zcl_excel_common.clas.testclasses.abap +++ b/src/zcl_excel_common.clas.testclasses.abap @@ -128,12 +128,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. @@ -374,37 +376,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. @@ -1671,6 +1673,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 1c89b39..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 ). @@ -2884,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 @@ -2908,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 ). @@ -3885,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, @@ -4123,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. @@ -4146,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. @@ -4272,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_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index c2bbe82..fab6878 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 . @@ -4353,6 +4365,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 @@ -4409,6 +4440,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.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 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 + + 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/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 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