fix #687 for reading range of hyperlinks (#750)

fix-#687-for-reading-range-of-hyperlinks

Co-authored-by: sandraros <sandra.rossi@gmail.com>
Co-authored-by: Gregor Wolf <gregor.wolf@gmail.com>
This commit is contained in:
sandraros 2021-05-21 21:15:49 +02:00 committed by GitHub
parent 6eac42678c
commit 7b48cd0d90
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 87 additions and 23 deletions

View File

@ -3414,9 +3414,12 @@ METHOD load_worksheet_hyperlinks.
DATA: lo_ixml_hyperlinks TYPE REF TO if_ixml_node_collection, DATA: lo_ixml_hyperlinks TYPE REF TO if_ixml_node_collection,
lo_ixml_hyperlink TYPE REF TO if_ixml_element, lo_ixml_hyperlink TYPE REF TO if_ixml_element,
lo_ixml_iterator TYPE REF TO if_ixml_node_iterator, lo_ixml_iterator TYPE REF TO if_ixml_node_iterator,
lv_row TYPE zexcel_cell_row, lv_row_start TYPE zexcel_cell_row,
lv_column TYPE zexcel_cell_column_alpha, lv_row_end TYPE zexcel_cell_row,
lo_hyperlink TYPE REF TO zcl_excel_hyperlink, 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. lv_value TYPE zexcel_cell_value.
DATA: BEGIN OF ls_hyperlink, DATA: BEGIN OF ls_hyperlink,
@ -3435,7 +3438,7 @@ METHOD load_worksheet_hyperlinks.
WHILE lo_ixml_hyperlink IS BOUND. WHILE lo_ixml_hyperlink IS BOUND.
CLEAR ls_hyperlink. CLEAR ls_hyperlink.
CLEAR lo_hyperlink. CLEAR lv_url.
ls_hyperlink-ref = lo_ixml_hyperlink->get_attribute_ns( 'ref' ). ls_hyperlink-ref = lo_ixml_hyperlink->get_attribute_ns( 'ref' ).
ls_hyperlink-display = lo_ixml_hyperlink->get_attribute_ns( 'display' ). 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' ls_hyperlink-r_id = lo_ixml_hyperlink->get_attribute( name = 'id'
namespace = 'r' ). namespace = 'r' ).
IF ls_hyperlink-r_id IS INITIAL. " Internal link 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 ELSE. " External link
READ TABLE it_external_hyperlinks ASSIGNING <ls_external_hyperlink> WITH TABLE KEY id = ls_hyperlink-r_id. READ TABLE it_external_hyperlinks ASSIGNING <ls_external_hyperlink> WITH TABLE KEY id = ls_hyperlink-r_id.
IF sy-subrc = 0. IF sy-subrc = 0.
lo_hyperlink = zcl_excel_hyperlink=>create_external_link( iv_url = <ls_external_hyperlink>-target ). lv_is_internal = abap_false.
lv_url = <ls_external_hyperlink>-target.
ENDIF. ENDIF.
ENDIF. ENDIF.
IF lo_hyperlink IS BOUND. " because of unsupported external links
zcl_excel_common=>convert_columnrow2column_a_row( EXPORTING IF lv_url IS NOT INITIAL. " because of unsupported external links
i_columnrow = ls_hyperlink-ref
zcl_excel_common=>convert_range2column_a_row(
EXPORTING
i_range = ls_hyperlink-ref
IMPORTING IMPORTING
e_row = lv_row e_column_start = lv_column_start
e_column = lv_column ). e_column_end = lv_column_end
* Currently it is not allowed to pass a hyperlink w/o text, but text has already been read. e_row_start = lv_row_start
* So just reread it and be done with it e_row_end = lv_row_end ).
io_worksheet->get_cell( EXPORTING
ip_column = lv_column io_worksheet->set_area_hyperlink(
ip_row = lv_row EXPORTING
IMPORTING ip_column_start = lv_column_start
ep_value = lv_value ). ip_column_end = lv_column_end
io_worksheet->set_cell( ip_column = lv_column ip_row = lv_row_start
ip_row = lv_row ip_row_to = lv_row_end
ip_value = lv_value ip_url = lv_url
ip_hyperlink = lo_hyperlink ). ip_is_internal = lv_is_internal ).
ENDIF. ENDIF.
lo_ixml_hyperlink ?= lo_ixml_iterator->get_next( ). lo_ixml_hyperlink ?= lo_ixml_iterator->get_next( ).

View File

@ -545,6 +545,16 @@ CLASS zcl_excel_worksheet DEFINITION
METHODS get_header_footer_drawings METHODS get_header_footer_drawings
RETURNING RETURNING
VALUE(rt_drawings) TYPE zexcel_t_drawings . 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. PROTECTED SECTION.
PRIVATE SECTION. PRIVATE SECTION.
@ -4818,6 +4828,52 @@ CLASS zcl_excel_worksheet IMPLEMENTATION.
ENDMETHOD. "SET_AREA_STYLE 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. METHOD set_cell.
DATA: lv_column TYPE zexcel_cell_column, DATA: lv_column TYPE zexcel_cell_column,