From 0f83a0a7585ff9deab30ede2359338eabfc94ced Mon Sep 17 00:00:00 2001 From: StefanSchmoecker Date: Mon, 1 Jun 2015 14:23:50 +0200 Subject: [PATCH] Issue #377 - support pagebreaks --- ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk | 87 ++++++++++- ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk | 145 ++++++++++-------- ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_PAGEBREAKS.slnk | 40 +++++ ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk | 143 ++++++++++++++--- 4 files changed, 315 insertions(+), 100 deletions(-) create mode 100644 ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_PAGEBREAKS.slnk diff --git a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk index 899e3e4..3037956 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk @@ -559,7 +559,7 @@ ENDMETHOD. endmethod. - + @@ -2776,7 +2776,7 @@ ENDMETHOD. ENDIF. * issue #367 - hide columns from - IF ls_column-max = zcl_excel_common=>c_excel_sheet_max_col " Max = very right column + IF ls_column-max = zcl_excel_common=>c_excel_sheet_max_col. " Max = very right column IF ls_column-hidden = 1 " all hidden AND ls_column-min > 0. io_worksheet->zif_excel_sheet_properties~hide_columns_from = zcl_excel_common=>convert_column2alpha( ls_column-min ). @@ -2975,6 +2975,12 @@ ENDMETHOD. CATCH zcx_excel. " Ignore Hyperlink reading errors - pass everything we were able to identify ENDTRY. + " Issue #377 - pagebreaks + TRY. + me->load_worksheet_pagebreaks( io_ixml_worksheet = lo_ixml_worksheet + io_worksheet = io_worksheet ). + CATCH zcx_excel. " Ignore pagebreak reading errors - pass everything we were able to identify + ENDTRY. ENDMETHOD. @@ -3601,7 +3607,74 @@ ENDMETHOD. ENDMETHOD. - + + + + + METHOD load_worksheet_pagebreaks. + + DATA: lo_node TYPE REF TO if_ixml_element, + lo_ixml_rowbreaks TYPE REF TO if_ixml_node_collection, + lo_ixml_colbreaks TYPE REF TO if_ixml_node_collection, + lo_ixml_iterator TYPE REF TO if_ixml_node_iterator, + lo_ixml_rowbreak TYPE REF TO if_ixml_element, + lo_ixml_colbreak TYPE REF TO if_ixml_element, + lo_style_conditional TYPE REF TO zcl_excel_style_conditional, + lv_count TYPE i. + + + DATA: lt_pagebreaks TYPE STANDARD TABLE OF zcl_excel_worksheet_pagebreaks=>ts_pagebreak_at, + lo_pagebreaks TYPE REF TO zcl_excel_worksheet_pagebreaks. + + FIELD-SYMBOLS: <ls_pagebreak_row> LIKE LINE OF lt_pagebreaks. + FIELD-SYMBOLS: <ls_pagebreak_col> LIKE LINE OF lt_pagebreaks. + +*--------------------------------------------------------------------* +* Get minimal number of cells where to add pagebreaks +* Since rows and columns are handled in separate nodes +* Build table to identify these cells +*--------------------------------------------------------------------* + lo_node ?= io_ixml_worksheet->find_from_name( 'rowBreaks' ). + lo_ixml_rowbreaks = lo_node->get_elements_by_tag_name( name = 'brk' ). + lo_ixml_iterator = lo_ixml_rowbreaks->create_iterator( ). + lo_ixml_rowbreak ?= lo_ixml_iterator->get_next( ). + WHILE lo_ixml_rowbreak IS BOUND. + APPEND INITIAL LINE TO lt_pagebreaks ASSIGNING <ls_pagebreak_row>. + <ls_pagebreak_row>-cell_row = lo_ixml_rowbreak->get_attribute_ns( 'id' ). + + lo_ixml_rowbreak ?= lo_ixml_iterator->get_next( ). + ENDWHILE. + CHECK <ls_pagebreak_row> IS ASSIGNED. + + lo_node ?= io_ixml_worksheet->find_from_name( 'colBreaks' ). + lo_ixml_colbreaks = lo_node->get_elements_by_tag_name( name = 'brk' ). + lo_ixml_iterator = lo_ixml_colbreaks->create_iterator( ). + lo_ixml_colbreak ?= lo_ixml_iterator->get_next( ). + CLEAR lv_count. + WHILE lo_ixml_colbreak IS BOUND. + ADD 1 TO lv_count. + READ TABLE lt_pagebreaks INDEX lv_count ASSIGNING <ls_pagebreak_col>. + IF sy-subrc <> 0. + APPEND INITIAL LINE TO lt_pagebreaks ASSIGNING <ls_pagebreak_col>. + <ls_pagebreak_col>-cell_row = <ls_pagebreak_row>-cell_row. + ENDIF. + <ls_pagebreak_col>-cell_column = lo_ixml_colbreak->get_attribute_ns( 'id' ). + + lo_ixml_colbreak ?= lo_ixml_iterator->get_next( ). + ENDWHILE. +*--------------------------------------------------------------------* +* Finally add each pagebreak +*--------------------------------------------------------------------* + lo_pagebreaks = io_worksheet->get_pagebreaks( ). + LOOP AT lt_pagebreaks ASSIGNING <ls_pagebreak_row>. + lo_pagebreaks->add_pagebreak( ip_column = <ls_pagebreak_row>-cell_column + ip_row = <ls_pagebreak_row>-cell_row ). + ENDLOOP. + + +ENDMETHOD. + + @@ -3636,7 +3709,7 @@ ENDMETHOD. ENDMETHOD. - + METHOD read_from_applserver. @@ -3680,7 +3753,7 @@ ENDMETHOD. binary_tab = lt_binary_data. ENDMETHOD. - + @@ -3740,7 +3813,7 @@ ENDMETHOD. ENDMETHOD. - + method RESOLVE_PATH. @@ -3784,7 +3857,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_WORKSHEET.slnk b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk index 873d4b6..5c975fc 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET.slnk @@ -246,25 +246,26 @@ ENDCLASS. "lcl_gui_alv_grid DEFINITION + - - - - - - + + + + + + - - - + + + method ZIF_EXCEL_SHEET_PRINTSETTINGS~CLEAR_PRINT_REPEAT_COLUMNS. @@ -2893,7 +2894,7 @@ ENDCLASS. "lcl_gui_alv_grid DEFINITION endmethod. - + @@ -3021,7 +3022,7 @@ METHOD calculate_cell_width. ld_flag_italic = ls_stylemapping-complete_style-font-italic. ENDIF. - CATCH zcx_excel. "#EC NO_HANDLER + CATCH zcx_excel. "#EC NO_HANDLER " Style GUID is present, but style was not found " Continue with default values @@ -3147,7 +3148,7 @@ METHOD calculate_cell_width. ENDMETHOD. - + method CALCULATE_COLUMN_WIDTHS. TYPES: @@ -3231,7 +3232,7 @@ ENDMETHOD. endmethod. - + @@ -3651,11 +3652,11 @@ ENDMETHOD. ENDMETHOD. - + - method CONSTRUCTOR. + METHOD constructor. DATA: lv_title TYPE zexcel_sheet_title. me->excel = ip_excel. @@ -3678,6 +3679,7 @@ ENDMETHOD. CREATE OBJECT data_validations. CREATE OBJECT tables. CREATE OBJECT ranges. " issue #163 + CREATE OBJECT mo_pagebreaks. CREATE OBJECT drawings EXPORTING ip_type = zcl_excel_drawing=>type_image. @@ -3698,9 +3700,9 @@ ENDMETHOD. upper_cell-cell_row = 1. upper_cell-cell_column = 1. - endmethod. +ENDMETHOD. - + METHOD delete_merge. @@ -3729,7 +3731,7 @@ ENDMETHOD. ENDMETHOD. - + @@ -3745,7 +3747,7 @@ ENDMETHOD. ENDMETHOD. - + @@ -3775,7 +3777,7 @@ ENDMETHOD. freeze_pane_cell_row = ip_num_rows + 1. endmethod. - + method GENERATE_TITLE. DATA: lo_worksheets_iterator TYPE REF TO cl_object_collection_iterator, @@ -3810,7 +3812,7 @@ ENDMETHOD. ENDDO. endmethod. - + method GET_ACTIVE_CELL. @@ -3826,7 +3828,7 @@ ENDMETHOD. endmethod. - + @@ -3865,7 +3867,7 @@ ENDMETHOD. ENDIF. endmethod. - + @@ -3892,33 +3894,33 @@ ENDMETHOD. endmethod. - + method GET_COLUMN_DIMENSIONS. r_column_dimension[] = me->column_dimensions[]. endmethod. - + method GET_COND_STYLES_ITERATOR. eo_iterator = me->conditional_styles->get_iterator( ). endmethod. - + method GET_DATA_VALIDATIONS_ITERATOR. eo_iterator = me->data_validations->get_iterator( ). endmethod. - + method GET_DATA_VALIDATIONS_SIZE. ep_size = me->data_validations->size( ). endmethod. - + method GET_DEFAULT_COLUMN_DIMENSION. IF me->default_column_dimension IS NOT BOUND. @@ -3932,7 +3934,7 @@ ENDMETHOD. r_column_dimension = me->default_column_dimension. endmethod. - + method GET_DEFAULT_EXCEL_DATE_FORMAT. CONSTANTS: c_lang_e TYPE lang VALUE 'E'. @@ -3958,7 +3960,7 @@ ENDMETHOD. ep_default_excel_date_format = default_excel_date_format. endmethod. - + method GET_DEFAULT_EXCEL_TIME_FORMAT. DATA: l_timefm TYPE xutimefm. @@ -3994,7 +3996,7 @@ ENDMETHOD. ep_default_excel_time_format = default_excel_time_format. endmethod. - + method GET_DEFAULT_ROW_DIMENSION. IF me->default_row_dimension IS NOT BOUND. @@ -4004,7 +4006,7 @@ ENDMETHOD. r_row_dimension = me->default_row_dimension. endmethod. - + method GET_DIMENSION_RANGE. @@ -4024,7 +4026,7 @@ ENDMETHOD. endmethod. - + method GET_DRAWINGS. @@ -4056,7 +4058,7 @@ ENDMETHOD. ENDCASE. endmethod. - + method GET_DRAWINGS_ITERATOR. @@ -4068,7 +4070,7 @@ ENDMETHOD. ENDCASE. endmethod. - + method GET_FREEZE_CELL. @@ -4076,7 +4078,7 @@ ENDMETHOD. ep_column = me->freeze_pane_cell_column. endmethod. - + METHOD get_guid. @@ -4084,7 +4086,7 @@ ENDMETHOD. ENDMETHOD. - + method GET_HIGHEST_COLUMN. @@ -4092,7 +4094,7 @@ ENDMETHOD. r_highest_column = me->lower_cell-cell_column. endmethod. - + METHOD get_highest_row. @@ -4100,19 +4102,19 @@ ENDMETHOD. r_highest_row = me->lower_cell-cell_row. ENDMETHOD. - + method GET_HYPERLINKS_ITERATOR. eo_iterator = hyperlinks->get_iterator( ). endmethod. - + method GET_HYPERLINKS_SIZE. ep_size = hyperlinks->size( ). endmethod. - + METHOD get_merge. @@ -4140,7 +4142,14 @@ ENDMETHOD. ENDMETHOD. - + + + + method GET_PAGEBREAKS. + ro_pagebreaks = mo_pagebreaks. +endmethod. + + method GET_RANGES_ITERATOR. @@ -4148,7 +4157,7 @@ ENDMETHOD. endmethod. - + METHOD GET_ROW_DIMENSION. @@ -4173,7 +4182,7 @@ ENDMETHOD. ENDMETHOD. - + METHOD get_row_dimensions. @@ -4181,7 +4190,7 @@ ENDMETHOD. ENDMETHOD. - + METHOD get_row_outlines. @@ -4189,25 +4198,25 @@ ENDMETHOD. ENDMETHOD. - + method GET_TABCOLOR. ev_tabcolor = me->tabcolor. endmethod. - + method GET_TABLES_ITERATOR. eo_iterator = tables->if_object_collection~get_iterator( ). endmethod. - + method GET_TABLES_SIZE. ep_size = tables->if_object_collection~size( ). endmethod. - + method GET_TITLE. @@ -4220,7 +4229,7 @@ ENDMETHOD. ENDIF. endmethod. - + @@ -4281,7 +4290,7 @@ ENDMETHOD. ENDMETHOD. - + @@ -4310,7 +4319,7 @@ ENDMETHOD. ENDMETHOD. - + method PRINT_TITLE_SET_RANGE. *--------------------------------------------------------------------* * issue#235 - repeat rows/columns @@ -4409,7 +4418,7 @@ ENDMETHOD. endmethod. - + @@ -4645,7 +4654,7 @@ ENDMETHOD. endmethod. - + @@ -4679,7 +4688,7 @@ ENDMETHOD. endmethod. - + @@ -4709,7 +4718,7 @@ ENDMETHOD. endmethod. - + @@ -4745,7 +4754,7 @@ ENDMETHOD. endmethod. - + method SET_DEFAULT_EXCEL_DATE_FORMAT. @@ -4759,7 +4768,7 @@ ENDMETHOD. default_excel_date_format = ip_default_excel_date_format. endmethod. - + @@ -4822,13 +4831,13 @@ ENDMETHOD. ENDMETHOD. - + method SET_PRINT_GRIDLINES. me->print_gridlines = i_print_gridlines. endmethod. - + @@ -4859,7 +4868,7 @@ ENDMETHOD. endmethod. - + @@ -4901,25 +4910,25 @@ ENDMETHOD. ENDCASE. ENDMETHOD. - + method SET_SHOW_GRIDLINES. me->show_gridlines = i_show_gridlines. endmethod. - + method SET_SHOW_ROWCOLHEADERS. me->show_rowcolheaders = i_show_rowcolheaders. endmethod. - + method SET_TABCOLOR. me->tabcolor = iv_tabcolor. endmethod. - + @@ -5003,7 +5012,7 @@ ENDMETHOD. endmethod. - + method SET_TITLE. @@ -5106,7 +5115,7 @@ ENDMETHOD. endmethod. - + METHOD update_dimension_range. @@ -5149,4 +5158,4 @@ ENDMETHOD. ENDMETHOD. - \ No newline at end of file + diff --git a/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_PAGEBREAKS.slnk b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_PAGEBREAKS.slnk new file mode 100644 index 0000000..8df439c --- /dev/null +++ b/ZA2X/CLAS/ZCL_EXCEL_WORKSHEET_PAGEBREAKS.slnk @@ -0,0 +1,40 @@ + + + + + *"* use this source file for the definition and implementation of +*"* local helper classes, interface definitions and type +*"* declarations + *"* use this source file for any type of declarations (class +*"* definitions, interfaces or type declarations) you need for +*"* components in the private section + *"* use this source file for any macro definitions you need +*"* in the implementation part of the class + + + + + + METHOD add_pagebreak. + DATA: ls_pagebreak LIKE LINE OF me->mt_pagebreaks. + + ls_pagebreak-cell_row = ip_row. + ls_pagebreak-cell_column = zcl_excel_common=>convert_column2int( ip_column ). + + INSERT ls_pagebreak INTO TABLE me->mt_pagebreaks. + + +ENDMETHOD. + + + + METHOD get_all_pagebreaks. + rt_pagebreaks = me->mt_pagebreaks. +ENDMETHOD. + + diff --git a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk index 3546856..410b5a4 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk @@ -37,13 +37,13 @@ ep_file = me->create( ). endmethod. - + METHOD add_further_data_to_zip. * Can be used by child classes like xlsm-writer to write additional data to zip archive ENDMETHOD. - + method CREATE. @@ -243,7 +243,7 @@ ENDMETHOD. endmethod. - + method CREATE_CONTENT_TYPES. @@ -518,7 +518,7 @@ ENDMETHOD. endmethod. - + method CREATE_DOCPROPS_APP. @@ -741,7 +741,7 @@ ENDMETHOD. endmethod. - + method CREATE_DOCPROPS_CORE. @@ -875,7 +875,7 @@ ENDMETHOD. endmethod. - + @@ -1014,7 +1014,7 @@ ENDMETHOD. io_dxf_element->append_child( new_child = lo_sub_element ). ENDMETHOD. - + method CREATE_RELATIONSHIPS. @@ -1113,7 +1113,7 @@ ENDMETHOD. endmethod. - + method CREATE_XL_CHARTS. @@ -2018,7 +2018,7 @@ ENDMETHOD. endmethod. - + method CREATE_XL_DRAWINGS. @@ -2098,7 +2098,7 @@ ENDMETHOD. endmethod. - + method CREATE_XL_DRAWINGS_RELS. @@ -2197,7 +2197,7 @@ ENDMETHOD. endmethod. - + @@ -2511,7 +2511,7 @@ ENDMETHOD. endmethod. - + method CREATE_XL_RELATIONSHIPS. @@ -2659,7 +2659,7 @@ ENDMETHOD. endmethod. - + METHOD create_xl_sharedstrings. @@ -2781,7 +2781,7 @@ ENDMETHOD. ENDMETHOD. - + @@ -3037,7 +3037,7 @@ ENDMETHOD. write_current_row TYPE boolean, lt_values TYPE zexcel_t_autofilter_values, ls_values TYPE zexcel_s_autofilter_values, - lv_guid TYPE uuid, +* lv_guid TYPE uuid, lo_autofilters TYPE REF TO zcl_excel_autofilters, lo_autofilter TYPE REF TO zcl_excel_autofilter, l_autofilter_hidden TYPE flag, @@ -3511,9 +3511,9 @@ ENDMETHOD. " Get column count col_count = io_worksheet->get_highest_column( ). " Get autofilter - lv_guid = io_worksheet->get_guid( ) . +* lv_guid = io_worksheet->get_guid( ) . lo_autofilters = excel->get_autofilters_reference( ). - lo_autofilter = lo_autofilters->get( i_sheet_guid = lv_guid ) . + lo_autofilter = lo_autofilters->get( io_worksheet = io_worksheet ) . IF lo_autofilter IS BOUND. lt_values = lo_autofilter->get_values( ) . ls_area = lo_autofilter->get_filter_area( ) . @@ -4631,6 +4631,14 @@ ENDMETHOD. ENDIF. +* issue #377 pagebreaks + TRY. + create_xl_sheet_pagebreaks( io_document = lo_document + io_parent = lo_element_root + io_worksheet = io_worksheet ) . + CATCH zcx_excel. " Ignore Hyperlink reading errors - pass everything we were able to identify + ENDTRY. + * drawing DATA: lo_drawings TYPE REF TO zcl_excel_drawings. @@ -4691,7 +4699,92 @@ ENDMETHOD. ENDMETHOD. - + + + + + + METHOD create_xl_sheet_pagebreaks. + DATA: lo_pagebreaks TYPE REF TO zcl_excel_worksheet_pagebreaks, + lt_pagebreaks TYPE zcl_excel_worksheet_pagebreaks=>tt_pagebreak_at, + lt_rows TYPE HASHED TABLE OF int4 WITH UNIQUE KEY table_line, + lt_columns TYPE HASHED TABLE OF int4 WITH UNIQUE KEY table_line, + + lo_node_rowbreaks TYPE REF TO if_ixml_element, + lo_node_colbreaks TYPE REF TO if_ixml_element, + lo_node_break TYPE REF TO if_ixml_element, + + lv_value TYPE string. + + + FIELD-SYMBOLS: <ls_pagebreak> LIKE LINE OF lt_pagebreaks. + + lo_pagebreaks = io_worksheet->get_pagebreaks( ). + CHECK lo_pagebreaks IS BOUND. + + lt_pagebreaks = lo_pagebreaks->get_all_pagebreaks( ). + CHECK lt_pagebreaks IS NOT INITIAL. " No need to proceed if don't have any pagebreaks. + + lo_node_rowbreaks = io_document->create_simple_element( name = 'rowBreaks' + parent = io_document ). + + lo_node_colbreaks = io_document->create_simple_element( name = 'colBreaks' + parent = io_document ). + + + LOOP AT lt_pagebreaks ASSIGNING <ls_pagebreak>. + +* Count how many rows and columns need to be broken + INSERT <ls_pagebreak>-cell_row INTO TABLE lt_rows. + IF sy-subrc = 0. " New + lv_value = <ls_pagebreak>-cell_row. + CONDENSE lv_value. + + lo_node_break = io_document->create_simple_element( name = 'brk' + parent = io_document ). + lo_node_break->set_attribute( name = 'id' value = lv_value ). + lo_node_break->set_attribute( name = 'man' value = '1' ). " Manual break + lo_node_break->set_attribute( name = 'max' value = '16383' ). " Max columns + + lo_node_rowbreaks->append_child( new_child = lo_node_break ). + ENDIF. + + INSERT <ls_pagebreak>-cell_column INTO TABLE lt_columns. + IF sy-subrc = 0. " New + lv_value = <ls_pagebreak>-cell_column. + CONDENSE lv_value. + + lo_node_break = io_document->create_simple_element( name = 'brk' + parent = io_document ). + lo_node_break->set_attribute( name = 'id' value = lv_value ). + lo_node_break->set_attribute( name = 'man' value = '1' ). " Manual break + lo_node_break->set_attribute( name = 'max' value = '1048575' ). " Max rows + + lo_node_colbreaks->append_child( new_child = lo_node_break ). + ENDIF. + + + ENDLOOP. + + lv_value = lines( lt_rows ). + CONDENSE lv_value. + lo_node_rowbreaks->set_attribute( name = 'count' value = lv_value ). + lo_node_rowbreaks->set_attribute( name = 'manualBreakCount' value = lv_value ). + + lv_value = lines( lt_rows ). + CONDENSE lv_value. + lo_node_colbreaks->set_attribute( name = 'count' value = lv_value ). + lo_node_colbreaks->set_attribute( name = 'manualBreakCount' value = lv_value ). + + + + + io_parent->append_child( new_child = lo_node_rowbreaks ). + io_parent->append_child( new_child = lo_node_colbreaks ). + +ENDMETHOD. + + @@ -4862,7 +4955,7 @@ ENDMETHOD. ENDMETHOD. - + METHOD create_xl_styles. *--------------------------------------------------------------------* @@ -5842,7 +5935,7 @@ ENDMETHOD. ENDMETHOD. - + @@ -5893,7 +5986,7 @@ ENDMETHOD. io_parent->append_child( new_child = lo_sub_element ). ENDMETHOD. - + METHOD create_xl_table. @@ -6072,7 +6165,7 @@ ENDMETHOD. ENDMETHOD. - + method CREATE_XL_THEME. @@ -6161,7 +6254,7 @@ ENDMETHOD. endmethod. - + METHOD create_xl_workbook. *--------------------------------------------------------------------* @@ -6488,7 +6581,7 @@ ENDMETHOD. ENDMETHOD. - + method FLAG2BOOL. @@ -6501,7 +6594,7 @@ ENDMETHOD. ENDIF. endmethod. - + METHOD get_shared_string_index.