From cc8fb819ad92c9f324eea39924f6b847aa45cd30 Mon Sep 17 00:00:00 2001 From: sandraros <34005250+sandraros@users.noreply.github.com> Date: Wed, 31 Jan 2024 16:23:15 +0100 Subject: [PATCH] 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 --- src/zcl_excel_reader_2007.clas.abap | 21 ++++---- src/zcl_excel_worksheet.clas.abap | 50 +++++++++++++++++++ ...zcl_excel_writer_2007.clas.locals_imp.abap | 19 +++++-- 3 files changed, 73 insertions(+), 17 deletions(-) diff --git a/src/zcl_excel_reader_2007.clas.abap b/src/zcl_excel_reader_2007.clas.abap index 3b577d0..c130620 100644 --- a/src/zcl_excel_reader_2007.clas.abap +++ b/src/zcl_excel_reader_2007.clas.abap @@ -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 ). diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index 5cb1ce0..07c2ad7 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -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 diff --git a/src/zcl_excel_writer_2007.clas.locals_imp.abap b/src/zcl_excel_writer_2007.clas.locals_imp.abap index 7e01e73..0ae8e20 100644 --- a/src/zcl_excel_writer_2007.clas.locals_imp.abap +++ b/src/zcl_excel_writer_2007.clas.locals_imp.abap @@ -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' ).