From 9b4aaf829fbe6b2dc9e53884870e75344bb0f10c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schm=C3=B6cker?= Date: Sun, 9 Dec 2012 11:06:01 +0000 Subject: [PATCH] #235 Extended Readerclass to support templating of repeatable rows/columns, minor fix in zcl_excel_common-method for range-area-breakup git-svn-id: https://subversion.assembla.com/svn/abap2xlsx/trunk@400 b7d68dce-7c3c-4a99-8ce0-9ea847f5d049 --- ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk | 7 ++ ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk | 104 ++++++++++++++++++++++----- 2 files changed, 93 insertions(+), 18 deletions(-) diff --git a/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk b/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk index a509356..058d0a2 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_COMMON.slnk @@ -1243,6 +1243,13 @@ endmethod. * - c) sheetname existing - does not start with ' example Sheet1!$B$6:$D$13 * - d) no sheetname - just area example $B$6:$D$13 *--------------------------------------------------------------------* +* Initialize output parameters + CLEAR: e_column_start, + e_column_end, + e_row_start, + e_row_end, + e_sheet. + IF i_range IS INITIAL. " a) input empty --> nothing to do EXIT. diff --git a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk index 3755ad2..f794ddd 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_READER_2007.slnk @@ -1,6 +1,6 @@ - - - - - - - - - - - - - - - class ZCL_EXCEL_READER_2007 definition @@ -414,7 +414,7 @@ endmethod. * issue#234 - error reading xlsx written by libre office * - Stefan Schmöcker, 2012-11-07 * changes: passing new optional input parameter to private attribute -*--------------------------------------------------------------------**--------------------------------------------------------------------* +*--------------------------------------------------------------------* CONSTANTS: lcv_load_from_frontend TYPE char1 VALUE 'F', lcv_load_from_backend TYPE char1 VALUE 'B'. @@ -1835,7 +1835,12 @@ endmethod. lo_autofilter TYPE REF TO zcl_excel_autofilter, ls_area TYPE zexcel_s_autofilter_area, lv_col_start_alpha TYPE zexcel_cell_column_alpha, - lv_col_end_alpha TYPE zexcel_cell_column_alpha. + lv_col_end_alpha TYPE zexcel_cell_column_alpha, + lv_row_start TYPE zexcel_cell_row, + lv_row_end TYPE zexcel_cell_row , + lv_regex TYPE string, + lv_range_value_1 TYPE zexcel_range_value, + lv_range_value_2 TYPE zexcel_range_value. *--------------------------------------------------------------------* * #229: Set active worksheet - end data declarations *--------------------------------------------------------------------* @@ -2014,6 +2019,7 @@ endmethod. ADD 1 TO lv_workbook_index. ENDWHILE. + SORT lt_worksheets BY sheetid. " needed for localSheetid -referencing *--------------------------------------------------------------------* * #229: Set active worksheet - begin coding * §3.2 Active worksheet @@ -2063,6 +2069,9 @@ endmethod. IF sy-subrc = 0. CASE ls_range-name. +*--------------------------------------------------------------------* +* insert autofilters +*--------------------------------------------------------------------* WHEN zcl_excel_autofilters=>c_autofilter. lo_autofilter = io_excel->add_new_autofilter( io_sheet = <worksheet>-worksheet ) . zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = lv_range_value @@ -2073,8 +2082,67 @@ endmethod. ls_area-col_end = zcl_excel_common=>convert_column2int( lv_col_end_alpha ). lo_autofilter->set_filter_area( is_area = ls_area ). - WHEN OTHERS. +*--------------------------------------------------------------------* +* repeat print rows/columns +*--------------------------------------------------------------------* + WHEN zif_excel_sheet_printsettings=>gcv_print_title_name. lo_range = <worksheet>-worksheet->add_new_range( ). +*--------------------------------------------------------------------* +* This might be a temporary solution. Maybe ranges get be reworked +* to support areas consisting of multiple rectangles +* But for now just split the range into row and columnpart +*--------------------------------------------------------------------* + CLEAR:lv_range_value_1, + lv_range_value_2. + IF lv_range_value IS INITIAL. +* Empty --> nothing to do + ELSE. + IF lv_range_value(1) = `'`. " Escaped + lv_regex = `^('[^']*')+![^,]*,`. + ELSE. + lv_regex = `^[^!]*![^,]*,`. + ENDIF. +* Split into two ranges if necessary + FIND REGEX lv_regex IN lv_range_value MATCH LENGTH sy-fdpos. + IF sy-subrc = 0 AND sy-fdpos > 0. + lv_range_value_2 = lv_range_value+sy-fdpos. + SUBTRACT 1 FROM sy-fdpos. + lv_range_value_1 = lv_range_value(sy-fdpos). + ELSE. + lv_range_value_1 = lv_range_value. + ENDIF. + ENDIF. +* 1st range + zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = lv_range_value_1 + IMPORTING e_column_start = lv_col_start_alpha + e_column_end = lv_col_end_alpha + e_row_start = lv_row_start + e_row_end = lv_row_end ). + IF lv_col_start_alpha IS NOT INITIAL. + <worksheet>-worksheet->zif_excel_sheet_printsettings~set_print_repeat_columns( iv_columns_from = lv_col_start_alpha + iv_columns_to = lv_col_end_alpha ). + ENDIF. + IF lv_row_start IS NOT INITIAL. + <worksheet>-worksheet->zif_excel_sheet_printsettings~set_print_repeat_rows( iv_rows_from = lv_row_start + iv_rows_to = lv_row_end ). + ENDIF. + +* 2nd range + zcl_excel_common=>convert_range2column_a_row( EXPORTING i_range = lv_range_value_2 + IMPORTING e_column_start = lv_col_start_alpha + e_column_end = lv_col_end_alpha + e_row_start = lv_row_start + e_row_end = lv_row_end ). + IF lv_col_start_alpha IS NOT INITIAL. + <worksheet>-worksheet->zif_excel_sheet_printsettings~set_print_repeat_columns( iv_columns_from = lv_col_start_alpha + iv_columns_to = lv_col_end_alpha ). + ENDIF. + IF lv_row_start IS NOT INITIAL. + <worksheet>-worksheet->zif_excel_sheet_printsettings~set_print_repeat_rows( iv_rows_from = lv_row_start + iv_rows_to = lv_row_end ). + ENDIF. + + WHEN OTHERS. ENDCASE. ENDIF.