Fix freeze and topLeftCell in reader/writer (#1178)

Fix freeze and topLeftCell in reader/writer

Fix #1175
Adds new methods set_pane_top_left_cell and set_sheetview_top_left_cell to zcl_excel_worksheet
This commit is contained in:
sandraros 2024-01-31 16:23:15 +01:00 committed by GitHub
parent 1148838a0f
commit cc8fb819ad
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 73 additions and 17 deletions

View File

@ -2262,6 +2262,7 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
workbookviewid TYPE string,
showrowcolheaders TYPE string,
righttoleft TYPE string,
topleftcell TYPE string,
END OF lty_sheetview.
TYPES: BEGIN OF lty_mergecell,
@ -2812,6 +2813,9 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
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 ).
@ -2928,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
@ -2952,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 ).

View File

@ -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 .
@ -4310,6 +4322,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
@ -4366,6 +4397,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

View File

@ -395,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 ).
@ -417,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' ).