From 76a39a7819d03e15ab362841b93445d9b3054c76 Mon Sep 17 00:00:00 2001
From: sandraros <34005250+sandraros@users.noreply.github.com>
Date: Mon, 25 Dec 2023 16:36:58 +0100
Subject: [PATCH] Make the reader get the Tables (#1159)
Fix #1158
Fix #1168
---
src/zcl_excel_reader_2007.clas.abap | 157 ++++++++++++++++++++++++++++
src/zcl_excel_reader_2007.clas.xml | 5 +
2 files changed, 162 insertions(+)
diff --git a/src/zcl_excel_reader_2007.clas.abap b/src/zcl_excel_reader_2007.clas.abap
index 1c89b39..edbf1de 100644
--- a/src/zcl_excel_reader_2007.clas.abap
+++ b/src/zcl_excel_reader_2007.clas.abap
@@ -106,6 +106,13 @@ CLASS zcl_excel_reader_2007 DEFINITION
END OF t_shared_string .
TYPES:
t_shared_strings TYPE STANDARD TABLE OF t_shared_string WITH DEFAULT KEY .
+ TYPES:
+ BEGIN OF t_table,
+ id TYPE string,
+ target TYPE string,
+ END OF t_table .
+ TYPES:
+ t_tables TYPE HASHED TABLE OF t_table WITH UNIQUE KEY id .
DATA shared_strings TYPE t_shared_strings .
DATA styles TYPE t_style_refs .
@@ -268,6 +275,15 @@ CLASS zcl_excel_reader_2007 DEFINITION
!io_worksheet TYPE REF TO zcl_excel_worksheet
RAISING
zcx_excel .
+ "!
Load worksheet tables
+ METHODS load_worksheet_tables
+ IMPORTING
+ io_ixml_worksheet TYPE REF TO if_ixml_document
+ io_worksheet TYPE REF TO zcl_excel_worksheet
+ iv_dirname TYPE string
+ it_tables TYPE t_tables
+ RAISING
+ zcx_excel .
CLASS-METHODS resolve_path
IMPORTING
!ip_path TYPE string
@@ -2314,6 +2330,7 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
lc_rel_hyperlink TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink',
lc_rel_comments TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments',
lc_rel_printer TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings'.
+ CONSTANTS lc_rel_table TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/table'.
DATA: lo_ixml_worksheet TYPE REF TO if_ixml_document,
lo_ixml_cells TYPE REF TO if_ixml_node_collection,
@@ -2408,6 +2425,8 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
lt_datavalidation_range TYPE TABLE OF string,
lt_rtf TYPE zexcel_t_rtf,
ex TYPE REF TO cx_root.
+ DATA lt_tables TYPE t_tables.
+ DATA ls_table TYPE t_table.
FIELD-SYMBOLS:
TYPE t_shared_string.
@@ -2478,6 +2497,10 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
CATCH zcx_excel.
ENDTRY.
+ WHEN lc_rel_table.
+ MOVE-CORRESPONDING ls_relationship TO ls_table.
+ INSERT ls_table INTO TABLE lt_tables.
+
WHEN OTHERS.
ENDCASE.
@@ -2501,6 +2524,16 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
ENDIF.
ENDIF.
+ " Read tables (must be done before loading sheet contents)
+ TRY.
+ me->load_worksheet_tables( io_ixml_worksheet = lo_ixml_worksheet
+ io_worksheet = io_worksheet
+ iv_dirname = lv_dirname
+ it_tables = lt_tables ).
+ CATCH zcx_excel. " Ignore reading errors - pass everything we were able to identify
+ ENDTRY.
+
+ " Sheet contents
lo_ixml_rows = lo_ixml_worksheet->get_elements_by_tag_name_ns( name = 'row' uri = namespace-main ).
lo_ixml_iterator = lo_ixml_rows->create_iterator( ).
lo_ixml_row_elem ?= lo_ixml_iterator->get_next( ).
@@ -3885,6 +3918,130 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
ENDMETHOD.
+ METHOD load_worksheet_tables.
+
+ DATA lo_ixml_table_columns TYPE REF TO if_ixml_node_collection.
+ DATA lo_ixml_table_column TYPE REF TO if_ixml_element.
+ DATA lo_ixml_table TYPE REF TO if_ixml_element.
+ DATA lo_ixml_table_style TYPE REF TO if_ixml_element.
+ DATA lt_field_catalog TYPE zexcel_t_fieldcatalog.
+ DATA ls_field_catalog TYPE zexcel_s_fieldcatalog.
+ DATA lo_ixml_iterator TYPE REF TO if_ixml_node_iterator.
+ DATA ls_table_settings TYPE zexcel_s_table_settings.
+ DATA lv_path TYPE string.
+ DATA lt_components TYPE abap_component_tab.
+ DATA ls_component TYPE abap_componentdescr.
+ DATA lo_rtti_table TYPE REF TO cl_abap_tabledescr.
+ DATA lv_dref_table TYPE REF TO data.
+ DATA lv_num_lines TYPE i.
+ DATA lo_line_type TYPE REF TO cl_abap_structdescr.
+
+ DATA: BEGIN OF ls_table,
+ id TYPE string,
+ name TYPE string,
+ displayname TYPE string,
+ ref TYPE string,
+ totalsrowshown TYPE string,
+ END OF ls_table.
+
+ DATA: BEGIN OF ls_table_style,
+ name TYPE string,
+ showrowstripes TYPE string,
+ showcolumnstripes TYPE string,
+ END OF ls_table_style.
+
+ DATA: BEGIN OF ls_table_column,
+ id TYPE string,
+ name TYPE string,
+ END OF ls_table_column.
+
+ FIELD-SYMBOLS LIKE LINE OF it_tables.
+ FIELD-SYMBOLS TYPE STANDARD TABLE.
+ FIELD-SYMBOLS TYPE zexcel_s_fieldcatalog.
+
+ LOOP AT it_tables ASSIGNING .
+
+ CONCATENATE iv_dirname -target INTO lv_path.
+ lv_path = resolve_path( lv_path ).
+
+ lo_ixml_table = me->get_ixml_from_zip_archive( lv_path )->get_root_element( ).
+ fill_struct_from_attributes( EXPORTING
+ ip_element = lo_ixml_table
+ CHANGING
+ cp_structure = ls_table ).
+
+ lo_ixml_table_style ?= lo_ixml_table->find_from_name( 'tableStyleInfo' ).
+ fill_struct_from_attributes( EXPORTING
+ ip_element = lo_ixml_table_style
+ CHANGING
+ cp_structure = ls_table_style ).
+
+ ls_table_settings-table_name = ls_table-name.
+ ls_table_settings-table_style = ls_table_style-name.
+ ls_table_settings-show_column_stripes = boolc( ls_table_style-showcolumnstripes = '1' ).
+ ls_table_settings-show_row_stripes = boolc( ls_table_style-showrowstripes = '1' ).
+
+ zcl_excel_common=>convert_range2column_a_row(
+ EXPORTING
+ i_range = ls_table-ref
+ IMPORTING
+ e_column_start = ls_table_settings-top_left_column
+ e_column_end = ls_table_settings-bottom_right_column
+ e_row_start = ls_table_settings-top_left_row
+ e_row_end = ls_table_settings-bottom_right_row ).
+
+ lo_ixml_table_columns = lo_ixml_table->get_elements_by_tag_name( name = 'tableColumn' ).
+ lo_ixml_iterator = lo_ixml_table_columns->create_iterator( ).
+ lo_ixml_table_column ?= lo_ixml_iterator->get_next( ).
+ CLEAR lt_field_catalog.
+ WHILE lo_ixml_table_column IS BOUND.
+
+ CLEAR ls_table_column.
+ fill_struct_from_attributes( EXPORTING
+ ip_element = lo_ixml_table_column
+ CHANGING
+ cp_structure = ls_table_column ).
+
+ ls_field_catalog-position = lines( lt_field_catalog ) + 1.
+ ls_field_catalog-fieldname = |COMP_{ ls_field_catalog-position PAD = '0' ALIGN = RIGHT WIDTH = 4 }|.
+ ls_field_catalog-scrtext_l = ls_table_column-name.
+ ls_field_catalog-dynpfld = abap_true.
+ ls_field_catalog-abap_type = cl_abap_typedescr=>typekind_string.
+ APPEND ls_field_catalog TO lt_field_catalog.
+
+ lo_ixml_table_column ?= lo_ixml_iterator->get_next( ).
+
+ ENDWHILE.
+
+ CLEAR lt_components.
+ LOOP AT lt_field_catalog ASSIGNING .
+ CLEAR ls_component.
+ ls_component-name = -fieldname.
+ ls_component-type = cl_abap_elemdescr=>get_string( ).
+ APPEND ls_component TO lt_components.
+ ENDLOOP.
+
+ lo_line_type = cl_abap_structdescr=>get( lt_components ).
+ lo_rtti_table = cl_abap_tabledescr=>get( lo_line_type ).
+ CREATE DATA lv_dref_table TYPE HANDLE lo_rtti_table.
+ ASSIGN lv_dref_table->* TO .
+
+ lv_num_lines = ls_table_settings-bottom_right_row - ls_table_settings-top_left_row.
+ DO lv_num_lines TIMES.
+ APPEND INITIAL LINE TO .
+ ENDDO.
+
+ io_worksheet->bind_table(
+ EXPORTING
+ ip_table =
+ it_field_catalog = lt_field_catalog
+ is_table_settings = ls_table_settings ).
+
+ ENDLOOP.
+
+ ENDMETHOD.
+
+
METHOD read_from_applserver.
DATA: lv_filelength TYPE i,
diff --git a/src/zcl_excel_reader_2007.clas.xml b/src/zcl_excel_reader_2007.clas.xml
index d7843d3..e03ffa7 100644
--- a/src/zcl_excel_reader_2007.clas.xml
+++ b/src/zcl_excel_reader_2007.clas.xml
@@ -253,6 +253,11 @@
E
Loads pagemargings of worksheet
+
+ LOAD_WORKSHEET_TABLES
+ E
+ Load worksheet tables
+
MT_DXF_STYLES
E