From 7b48cd0d90583a27bfa1fc97898b14aff79711fb Mon Sep 17 00:00:00 2001 From: sandraros <34005250+sandraros@users.noreply.github.com> Date: Fri, 21 May 2021 21:15:49 +0200 Subject: [PATCH] fix #687 for reading range of hyperlinks (#750) fix-#687-for-reading-range-of-hyperlinks Co-authored-by: sandraros Co-authored-by: Gregor Wolf --- src/zcl_excel_reader_2007.clas.abap | 54 ++++++++++++++++------------ src/zcl_excel_worksheet.clas.abap | 56 +++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 23 deletions(-) diff --git a/src/zcl_excel_reader_2007.clas.abap b/src/zcl_excel_reader_2007.clas.abap index 492ebbe..e42e962 100644 --- a/src/zcl_excel_reader_2007.clas.abap +++ b/src/zcl_excel_reader_2007.clas.abap @@ -3414,9 +3414,12 @@ METHOD load_worksheet_hyperlinks. DATA: lo_ixml_hyperlinks TYPE REF TO if_ixml_node_collection, lo_ixml_hyperlink TYPE REF TO if_ixml_element, lo_ixml_iterator TYPE REF TO if_ixml_node_iterator, - lv_row TYPE zexcel_cell_row, - lv_column TYPE zexcel_cell_column_alpha, - lo_hyperlink TYPE REF TO zcl_excel_hyperlink, + lv_row_start TYPE zexcel_cell_row, + lv_row_end TYPE zexcel_cell_row, + lv_column_start TYPE zexcel_cell_column_alpha, + lv_column_end TYPE zexcel_cell_column_alpha, + lv_is_internal TYPE abap_bool, + lv_url TYPE string, lv_value TYPE zexcel_cell_value. DATA: BEGIN OF ls_hyperlink, @@ -3435,7 +3438,7 @@ METHOD load_worksheet_hyperlinks. WHILE lo_ixml_hyperlink IS BOUND. CLEAR ls_hyperlink. - CLEAR lo_hyperlink. + CLEAR lv_url. ls_hyperlink-ref = lo_ixml_hyperlink->get_attribute_ns( 'ref' ). ls_hyperlink-display = lo_ixml_hyperlink->get_attribute_ns( 'display' ). @@ -3444,31 +3447,36 @@ METHOD load_worksheet_hyperlinks. ls_hyperlink-r_id = lo_ixml_hyperlink->get_attribute( name = 'id' namespace = 'r' ). IF ls_hyperlink-r_id IS INITIAL. " Internal link - lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = ls_hyperlink-location ). + lv_is_internal = abap_true. + lv_url = ls_hyperlink-location. ELSE. " External link READ TABLE it_external_hyperlinks ASSIGNING WITH TABLE KEY id = ls_hyperlink-r_id. IF sy-subrc = 0. - lo_hyperlink = zcl_excel_hyperlink=>create_external_link( iv_url = -target ). + lv_is_internal = abap_false. + lv_url = -target. ENDIF. ENDIF. - IF lo_hyperlink IS BOUND. " because of unsupported external links - zcl_excel_common=>convert_columnrow2column_a_row( EXPORTING - i_columnrow = ls_hyperlink-ref - IMPORTING - e_row = lv_row - e_column = lv_column ). -* Currently it is not allowed to pass a hyperlink w/o text, but text has already been read. -* So just reread it and be done with it - io_worksheet->get_cell( EXPORTING - ip_column = lv_column - ip_row = lv_row - IMPORTING - ep_value = lv_value ). - io_worksheet->set_cell( ip_column = lv_column - ip_row = lv_row - ip_value = lv_value - ip_hyperlink = lo_hyperlink ). + IF lv_url IS NOT INITIAL. " because of unsupported external links + + zcl_excel_common=>convert_range2column_a_row( + EXPORTING + i_range = ls_hyperlink-ref + IMPORTING + e_column_start = lv_column_start + e_column_end = lv_column_end + e_row_start = lv_row_start + e_row_end = lv_row_end ). + + io_worksheet->set_area_hyperlink( + EXPORTING + ip_column_start = lv_column_start + ip_column_end = lv_column_end + ip_row = lv_row_start + ip_row_to = lv_row_end + ip_url = lv_url + ip_is_internal = lv_is_internal ). + ENDIF. lo_ixml_hyperlink ?= lo_ixml_iterator->get_next( ). diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index 8f57489..e0a649e 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -545,6 +545,16 @@ CLASS zcl_excel_worksheet DEFINITION METHODS get_header_footer_drawings RETURNING VALUE(rt_drawings) TYPE zexcel_t_drawings . + METHODS set_area_hyperlink + IMPORTING + !ip_column_start TYPE simple + !ip_column_end TYPE simple OPTIONAL + !ip_row TYPE zexcel_cell_row + !ip_row_to TYPE zexcel_cell_row OPTIONAL + !ip_url TYPE string + !ip_is_internal TYPE abap_bool + RAISING + zcx_excel . PROTECTED SECTION. PRIVATE SECTION. @@ -4818,6 +4828,52 @@ CLASS zcl_excel_worksheet IMPLEMENTATION. ENDMETHOD. "SET_AREA_STYLE + METHOD set_area_hyperlink. + DATA: ld_row_start TYPE zexcel_cell_row, + ld_row_end TYPE zexcel_cell_row, + ld_column_start_int TYPE zexcel_cell_column, + ld_column_end_int TYPE zexcel_cell_column, + ld_current_column TYPE zexcel_cell_column_alpha, + ld_current_row TYPE zexcel_cell_row, + ld_value TYPE string. + DATA: lv_column TYPE zexcel_cell_column, + lo_hyperlink TYPE REF TO zcl_excel_hyperlink. + + MOVE: ip_row_to TO ld_row_end, + ip_row TO ld_row_start. + IF ld_row_end IS INITIAL OR ip_row_to IS NOT SUPPLIED. + ld_row_end = ld_row_start. + ENDIF. + ld_column_start_int = zcl_excel_common=>convert_column2int( ip_column_start ). + ld_column_end_int = zcl_excel_common=>convert_column2int( ip_column_end ). + IF ld_column_end_int IS INITIAL OR ip_column_end IS NOT SUPPLIED. + ld_column_end_int = ld_column_start_int. + ENDIF. + + WHILE ld_column_start_int <= ld_column_end_int. + ld_current_column = zcl_excel_common=>convert_column2alpha( ld_column_start_int ). + ld_current_row = ld_row_start. + WHILE ld_current_row <= ld_row_end. + + me->get_cell( EXPORTING ip_column = ld_current_column ip_row = ld_current_row + IMPORTING ep_value = ld_value ). + + IF ip_is_internal = abap_true. + lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = ip_url ). + ELSE. + lo_hyperlink = zcl_excel_hyperlink=>create_external_link( iv_url = ip_url ). + ENDIF. + + me->set_cell( ip_column = ld_current_column ip_row = ld_current_row ip_value = ld_value ip_hyperlink = lo_hyperlink ). + + ADD 1 TO ld_current_row. + ENDWHILE. + ADD 1 TO ld_column_start_int. + ENDWHILE. + + ENDMETHOD. "SET_AREA_HYPERLINK + + METHOD set_cell. DATA: lv_column TYPE zexcel_cell_column,