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