From 7fdba5e3a41767bec590832a8e5ad2e5ba724b24 Mon Sep 17 00:00:00 2001 From: StefanSchmoecker Date: Sat, 3 Jan 2015 19:16:14 +0100 Subject: [PATCH] issue #346 - Reader not reading outlines correctly: READER: Now reads outlines and sorts them into the new way to represent outlines WRITER: TYPO - one active line was commented out falsely --- ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk | 145 +++++++++++++++++++++++---- ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk | 3 +- 2 files changed, 128 insertions(+), 20 deletions(-) diff --git a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk index 5da9c8a..dfef180 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk @@ -399,7 +399,110 @@ ENDMETHOD. ENDCASE. ENDMETHOD. - + + + + METHOD fill_row_outlines. + + TYPES: BEGIN OF lts_row_data, + row TYPE i, + outline_level TYPE i, + END OF lts_row_data, + ltt_row_data TYPE SORTED TABLE OF lts_row_data WITH UNIQUE KEY row. + + DATA: lt_row_dimensions TYPE zexcel_t_worksheet_rowdimensio, + + lt_row_data TYPE ltt_row_data, + ls_row_data LIKE LINE OF lt_row_data, + lt_collapse_rows TYPE HASHED TABLE OF i WITH UNIQUE KEY table_line, + + lv_collapsed TYPE abap_bool, + + lv_outline_level TYPE i, + lv_next_consecutive_row TYPE i, + lt_outline_rows TYPE zcl_excel_worksheet=>mty_ts_outlines_row, + ls_outline_row LIKE LINE OF lt_outline_rows, + + lv_row_offset TYPE i, + lv_row_collapse_flag TYPE i. + + + FIELD-SYMBOLS: <ls_row_dimension> LIKE LINE OF lt_row_dimensions, + <ls_row_data> LIKE LINE OF lt_row_data. + +* First collect information about outlines ( outline leven and collapsed state ) + lt_row_dimensions = io_worksheet->get_row_dimensions( ). + LOOP AT lt_row_dimensions ASSIGNING <ls_row_dimension>. + + ls_row_data-row = <ls_row_dimension>-row. + ls_row_data-outline_level = <ls_row_dimension>-row_dimension->get_outline_level( ). + IF ls_row_data-outline_level IS NOT INITIAL. + INSERT ls_row_data INTO TABLE lt_row_data. + ENDIF. + + lv_collapsed = <ls_row_dimension>-row_dimension->get_collapsed( ). + IF lv_collapsed = abap_true. + INSERT <ls_row_dimension>-row INTO TABLE lt_collapse_rows. + ENDIF. + + ENDLOOP. + +* Now parse this information - we need consecutive rows - any gap will create a new outline + DO 7 TIMES. " max number of outlines allowed + lv_outline_level = sy-index. + CLEAR lv_next_consecutive_row. + CLEAR ls_outline_row. + LOOP AT lt_row_data ASSIGNING <ls_row_data> WHERE outline_level >= lv_outline_level. + + IF lv_next_consecutive_row <> <ls_row_data>-row " A gap --> close all open outlines + AND lv_next_consecutive_row IS NOT INITIAL. " First time in loop. + INSERT ls_outline_row INTO TABLE lt_outline_rows. + CLEAR: ls_outline_row. + ENDIF. + + IF ls_outline_row-row_from IS INITIAL. + ls_outline_row-row_from = <ls_row_data>-row. + ENDIF. + ls_outline_row-row_to = <ls_row_data>-row. + + lv_next_consecutive_row = <ls_row_data>-row + 1. + + ENDLOOP. + IF ls_outline_row-row_from IS NOT INITIAL. + INSERT ls_outline_row INTO TABLE lt_outline_rows. + ENDIF. + ENDDO. + +* lt_outline_rows holds all outline information +* we now need to determine whether the outline is collapsed or not + LOOP AT lt_outline_rows INTO ls_outline_row. + + IF io_worksheet->zif_excel_sheet_properties~summarybelow = zif_excel_sheet_properties=>c_below_off. + lv_row_collapse_flag = ls_outline_row-row_from - 1. + ELSE. + lv_row_collapse_flag = ls_outline_row-row_to + 1. + ENDIF. + READ TABLE lt_collapse_rows TRANSPORTING NO FIELDS WITH TABLE KEY table_line = lv_row_collapse_flag. + IF sy-subrc = 0. + ls_outline_row-collapsed = abap_true. + ENDIF. + io_worksheet->set_row_outline( iv_row_from = ls_outline_row-row_from + iv_row_to = ls_outline_row-row_to + iv_collapsed = ls_outline_row-collapsed ). + + ENDLOOP. + +* Finally purge outline information ( collapsed state, outline leve) from row_dimensions, since we want to keep these in the outline-table + LOOP AT lt_row_dimensions ASSIGNING <ls_row_dimension>. + + <ls_row_dimension>-row_dimension->set_outline_level( 0 ). + <ls_row_dimension>-row_dimension->set_collapsed( abap_false ). + + ENDLOOP. + +ENDMETHOD. + + method fill_struct_from_attributes. @@ -450,7 +553,7 @@ ENDMETHOD. endmethod. - + @@ -462,7 +565,7 @@ endmethod. ENDMETHOD. - + @@ -493,7 +596,7 @@ ENDMETHOD. ENDMETHOD. - + @@ -645,7 +748,7 @@ ENDMETHOD. endmethod. - + method LOAD_SHARED_STRINGS. @@ -764,7 +867,7 @@ ENDMETHOD. endmethod. - + @@ -1003,7 +1106,7 @@ ENDMETHOD. endmethod. - + method LOAD_STYLE_BORDERS. @@ -1133,7 +1236,7 @@ ENDMETHOD. endmethod. - + method LOAD_STYLE_FILLS. @@ -1251,7 +1354,7 @@ ENDMETHOD. endmethod. - + method LOAD_STYLE_FONTS. @@ -1377,7 +1480,7 @@ ENDMETHOD. endmethod. - + method LOAD_STYLE_NUM_FORMATS. @@ -1490,7 +1593,7 @@ ENDMETHOD. endmethod. - + @@ -1909,7 +2012,7 @@ ENDMETHOD. endmethod. - + @@ -2618,11 +2721,15 @@ ENDMETHOD. CATCH zcx_excel. " Ignore Hyperlink reading errors - pass everything we were able to identify ENDTRY. + TRY. + me->fill_row_outlines( io_worksheet = io_worksheet ). + CATCH zcx_excel. " Ignore Hyperlink reading errors - pass everything we were able to identify + ENDTRY. ENDMETHOD. - + @@ -2741,7 +2848,7 @@ ENDMETHOD. endmethod. - + @@ -2815,7 +2922,7 @@ ENDMETHOD. ENDMETHOD. - + @@ -2850,7 +2957,7 @@ ENDMETHOD. ENDMETHOD. - + METHOD read_from_applserver. @@ -2894,7 +3001,7 @@ ENDMETHOD. binary_tab = lt_binary_data. ENDMETHOD. - + @@ -2954,7 +3061,7 @@ ENDMETHOD. ENDMETHOD. - + method RESOLVE_PATH. @@ -2998,7 +3105,7 @@ ENDMETHOD. endmethod. - + method RESOLVE_REFERENCED_FORMULAE. TYPES: BEGIN OF ty_referenced_cells, sheet TYPE REF TO zcl_excel_worksheet, diff --git a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk index d777c38..bdcd5ab 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk @@ -3380,7 +3380,8 @@ * Set last line if necessary * Last row with cell content lv_last_row = io_worksheet->get_highest_row( ). -* Last line with row-information set directly ( like line height, hidden-status ... ) lts_row_dimensions = io_worksheet->get_row_dimensions( ). +* Last line with row-information set directly ( like line height, hidden-status ... ) + lts_row_dimensions = io_worksheet->get_row_dimensions( ). SORT lts_row_dimensions BY row DESCENDING. READ TABLE lts_row_dimensions INDEX 1 ASSIGNING <row_dimension>. IF sy-subrc = 0 AND <row_dimension>-row > lv_last_row.