From e4906d956218f823efd72ffc52d7f0f4215d3c3d Mon Sep 17 00:00:00 2001 From: StefanSchmoecker Date: Thu, 26 Mar 2015 21:16:19 +0100 Subject: [PATCH] Issue #365 + some new methods to access/delete sheets ZCL_EXCEL->GET_WORKSHEET_BY_INDEX ( new ) ZCL_EXCEL->SET_ACTIVE_SHEET_INDEX ( Test if worksheet is existing --> raise on error ) ZCL_EXCEL->DELETE_WORKSHEET ( new ) ZCL_EXCEL->DELETE_WORKSHEET_BY_NAME ( new ) ZCL_EXCEL->DELETE_WORKSHEET_BY_INDEX ( new ) ZCL_EXCEL_WRITER_2007->CREATE_XL_WORKBOOK ( Set active sheet to 1 if illegal active sheet is passed ) --- ZA2X/CLAS/ZCL_EXCEL.slnk | 169 +++++++++++++++++++++------ ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk | 126 ++++++++++---------- 2 files changed, 198 insertions(+), 97 deletions(-) diff --git a/ZA2X/CLAS/ZCL_EXCEL.slnk b/ZA2X/CLAS/ZCL_EXCEL.slnk index aa008b9..b81d22b 100644 --- a/ZA2X/CLAS/ZCL_EXCEL.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL.slnk @@ -1,5 +1,5 @@ - + @@ -111,6 +111,12 @@ CLASS zcl_tc_excel IMPLEMENTATION. ENDCLASS. "zcl_Tc_Excel + + + + + + @@ -290,13 +296,73 @@ ENDMETHOD. endmethod. - + + + + METHOD delete_worksheet. + + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + l_size TYPE i, + lv_errormessage TYPE string. + + l_size = get_worksheets_size( ). + IF l_size = 1. " Only 1 worksheet left --> check whether this is the worksheet to be deleted + lo_worksheet = me->get_worksheet_by_index( 1 ). + IF lo_worksheet = io_worksheet. + lv_errormessage = 'Deleting last remaining worksheet is not allowed'(002). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + ENDIF. + + me->worksheets->remove( io_worksheet ). + +ENDMETHOD. + + + + METHOD delete_worksheet_by_index. + + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + lv_errormessage TYPE string. + + lo_worksheet = me->get_worksheet_by_index( iv_index ). + IF lo_worksheet IS NOT BOUND. + lv_errormessage = 'Worksheet not existing'(001). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + me->delete_worksheet( lo_worksheet ). + +ENDMETHOD. + + + + METHOD delete_worksheet_by_name. + + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + lv_errormessage TYPE string. + + lo_worksheet = me->get_worksheet_by_name( iv_title ). + IF lo_worksheet IS NOT BOUND. + lv_errormessage = 'Worksheet not existing'(001). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + me->delete_worksheet( lo_worksheet ). + +ENDMETHOD. + + method GET_ACTIVE_SHEET_INDEX. r_active_worksheet = me->worksheets->active_worksheet. endmethod. - + method GET_ACTIVE_WORKSHEET. @@ -304,7 +370,7 @@ ENDMETHOD. endmethod. - + method GET_AUTOFILTERS_REFERENCE. @@ -312,13 +378,13 @@ ENDMETHOD. endmethod. - + method GET_DEFAULT_STYLE. ep_style = me->default_style. endmethod. - + method GET_DRAWINGS_ITERATOR. @@ -333,7 +399,7 @@ ENDMETHOD. endmethod. - + method GET_NEXT_TABLE_ID. DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, @@ -353,7 +419,7 @@ ENDMETHOD. endmethod. - + method GET_RANGES_ITERATOR. @@ -361,7 +427,7 @@ ENDMETHOD. endmethod. - + @@ -387,7 +453,7 @@ ENDMETHOD. ep_guid = style-guid. endmethod. - + method GET_STYLES_ITERATOR. @@ -395,7 +461,7 @@ ENDMETHOD. endmethod. - + @@ -426,7 +492,7 @@ ENDMETHOD. ENDIF. endmethod. - + @@ -449,7 +515,7 @@ ENDMETHOD. endmethod. - + method GET_WORKSHEETS_ITERATOR. @@ -457,7 +523,7 @@ ENDMETHOD. endmethod. - + method GET_WORKSHEETS_NAME. @@ -465,21 +531,34 @@ ENDMETHOD. endmethod. - + - method GET_WORKSHEETS_SIZE. + METHOD get_worksheets_size. ep_size = me->worksheets->size( ). - endmethod. +ENDMETHOD. - + + + + METHOD get_worksheet_by_index. + + + DATA: lv_index TYPE zexcel_active_worksheet. + + lv_index = iv_index. + eo_worksheet = me->worksheets->get( lv_index ). + +ENDMETHOD. + + - method GET_WORKSHEET_BY_NAME. + METHOD get_worksheet_by_name. - DATA: lv_index TYPE zexcel_active_worksheet, - l_size TYPE i. + DATA: lv_index TYPE zexcel_active_worksheet, + l_size TYPE i. l_size = get_worksheets_size( ). @@ -493,22 +572,38 @@ ENDMETHOD. CLEAR eo_worksheet. - endmethod. +ENDMETHOD. - + - method SET_ACTIVE_SHEET_INDEX. - me->worksheets->active_worksheet = i_active_worksheet. - endmethod. - - - - method SET_ACTIVE_SHEET_INDEX_BY_NAME. + + METHOD set_active_sheet_index. + DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet, + lv_errormessage TYPE string. - DATA: ws_it TYPE REF TO cl_object_collection_iterator, - ws TYPE REF TO zcl_excel_worksheet, - lv_title TYPE ZEXCEL_SHEET_TITLE, - count TYPE i VALUE 1. +*--------------------------------------------------------------------* +* Check whether worksheet exists +*--------------------------------------------------------------------* + lo_worksheet = me->get_worksheet_by_index( i_active_worksheet ). + IF lo_worksheet IS NOT BOUND. + lv_errormessage = 'Worksheet not existing'(001). + RAISE EXCEPTION TYPE zcx_excel + EXPORTING + error = lv_errormessage. + ENDIF. + + me->worksheets->active_worksheet = i_active_worksheet. + +ENDMETHOD. + + + + METHOD set_active_sheet_index_by_name. + + DATA: ws_it TYPE REF TO cl_object_collection_iterator, + ws TYPE REF TO zcl_excel_worksheet, + lv_title TYPE zexcel_sheet_title, + count TYPE i VALUE 1. ws_it = me->worksheets->get_iterator( ). @@ -522,16 +617,16 @@ ENDMETHOD. count = count + 1. ENDWHILE. - endmethod. +ENDMETHOD. - + method SET_DEFAULT_STYLE. me->default_style = ip_style. endmethod. - + method STYLEMAPPING_DYNAMIC_STYLE. diff --git a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk index 825543a..70f533b 100644 --- a/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk +++ b/ZA2X/CLAS/ZCL_EXCEL_WRITER_2007.slnk @@ -6052,7 +6052,7 @@ ENDMETHOD. - method CREATE_XL_WORKBOOK. + METHOD create_xl_workbook. *--------------------------------------------------------------------* * issue #230 - Pimp my Code * - Stefan Schmöcker, (done) 2012-11-07 @@ -6066,69 +6066,69 @@ ENDMETHOD. *--------------------------------------------------------------------* ** Constant node name - DATA: lc_xml_node_workbook TYPE string VALUE 'workbook', - lc_xml_node_fileversion TYPE string VALUE 'fileVersion', - lc_xml_node_workbookpr TYPE string VALUE 'workbookPr', - lc_xml_node_bookviews TYPE string VALUE 'bookViews', - lc_xml_node_workbookview TYPE string VALUE 'workbookView', - lc_xml_node_sheets TYPE string VALUE 'sheets', - lc_xml_node_sheet TYPE string VALUE 'sheet', - lc_xml_node_calcpr TYPE string VALUE 'calcPr', - lc_xml_node_workbookprotection TYPE string VALUE 'workbookProtection', - lc_xml_node_definednames TYPE string VALUE 'definedNames', - lc_xml_node_definedname TYPE string VALUE 'definedName', + DATA: lc_xml_node_workbook TYPE string VALUE 'workbook', + lc_xml_node_fileversion TYPE string VALUE 'fileVersion', + lc_xml_node_workbookpr TYPE string VALUE 'workbookPr', + lc_xml_node_bookviews TYPE string VALUE 'bookViews', + lc_xml_node_workbookview TYPE string VALUE 'workbookView', + lc_xml_node_sheets TYPE string VALUE 'sheets', + lc_xml_node_sheet TYPE string VALUE 'sheet', + lc_xml_node_calcpr TYPE string VALUE 'calcPr', + lc_xml_node_workbookprotection TYPE string VALUE 'workbookProtection', + lc_xml_node_definednames TYPE string VALUE 'definedNames', + lc_xml_node_definedname TYPE string VALUE 'definedName', " Node attributes - lc_xml_attr_appname TYPE string VALUE 'appName', - lc_xml_attr_lastedited TYPE string VALUE 'lastEdited', - lc_xml_attr_lowestedited TYPE string VALUE 'lowestEdited', - lc_xml_attr_rupbuild TYPE string VALUE 'rupBuild', - lc_xml_attr_themeversion TYPE string VALUE 'defaultThemeVersion', - lc_xml_attr_xwindow TYPE string VALUE 'xWindow', - lc_xml_attr_ywindow TYPE string VALUE 'yWindow', - lc_xml_attr_windowwidth TYPE string VALUE 'windowWidth', - lc_xml_attr_windowheight TYPE string VALUE 'windowHeight', - lc_xml_attr_activetab TYPE string VALUE 'activeTab', - lc_xml_attr_name TYPE string VALUE 'name', - lc_xml_attr_sheetid TYPE string VALUE 'sheetId', - lc_xml_attr_state TYPE string VALUE 'state', - lc_xml_attr_id TYPE string VALUE 'id', - lc_xml_attr_calcid TYPE string VALUE 'calcId', - lc_xml_attr_lockrevision TYPE string VALUE 'lockRevision', - lc_xml_attr_lockstructure TYPE string VALUE 'lockStructure', - lc_xml_attr_lockwindows TYPE string VALUE 'lockWindows', - lc_xml_attr_revisionspassword TYPE string VALUE 'revisionsPassword', - lc_xml_attr_workbookpassword TYPE string VALUE 'workbookPassword', - lc_xml_attr_hidden TYPE string VALUE 'hidden', - lc_xml_attr_localsheetid TYPE string VALUE 'localSheetId', + lc_xml_attr_appname TYPE string VALUE 'appName', + lc_xml_attr_lastedited TYPE string VALUE 'lastEdited', + lc_xml_attr_lowestedited TYPE string VALUE 'lowestEdited', + lc_xml_attr_rupbuild TYPE string VALUE 'rupBuild', + lc_xml_attr_themeversion TYPE string VALUE 'defaultThemeVersion', + lc_xml_attr_xwindow TYPE string VALUE 'xWindow', + lc_xml_attr_ywindow TYPE string VALUE 'yWindow', + lc_xml_attr_windowwidth TYPE string VALUE 'windowWidth', + lc_xml_attr_windowheight TYPE string VALUE 'windowHeight', + lc_xml_attr_activetab TYPE string VALUE 'activeTab', + lc_xml_attr_name TYPE string VALUE 'name', + lc_xml_attr_sheetid TYPE string VALUE 'sheetId', + lc_xml_attr_state TYPE string VALUE 'state', + lc_xml_attr_id TYPE string VALUE 'id', + lc_xml_attr_calcid TYPE string VALUE 'calcId', + lc_xml_attr_lockrevision TYPE string VALUE 'lockRevision', + lc_xml_attr_lockstructure TYPE string VALUE 'lockStructure', + lc_xml_attr_lockwindows TYPE string VALUE 'lockWindows', + lc_xml_attr_revisionspassword TYPE string VALUE 'revisionsPassword', + lc_xml_attr_workbookpassword TYPE string VALUE 'workbookPassword', + lc_xml_attr_hidden TYPE string VALUE 'hidden', + lc_xml_attr_localsheetid TYPE string VALUE 'localSheetId', " Node namespace - lc_r_ns TYPE string VALUE 'r', - lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', - lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', + lc_r_ns TYPE string VALUE 'r', + lc_xml_node_ns TYPE string VALUE 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', + lc_xml_node_r_ns TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', " Node id - lc_xml_node_ridx_id TYPE string VALUE 'rId#'. + lc_xml_node_ridx_id TYPE string VALUE 'rId#'. - DATA: lo_ixml TYPE REF TO if_ixml, - lo_document TYPE REF TO if_ixml_document, - lo_element_root TYPE REF TO if_ixml_element, - lo_element TYPE REF TO if_ixml_element, - lo_element_range TYPE REF TO if_ixml_element, - lo_sub_element TYPE REF TO if_ixml_element, - lo_encoding TYPE REF TO if_ixml_encoding, - lo_streamfactory TYPE REF TO if_ixml_stream_factory, - lo_ostream TYPE REF TO if_ixml_ostream, - lo_renderer TYPE REF TO if_ixml_renderer, - lo_iterator TYPE REF TO cl_object_collection_iterator, - lo_iterator_range TYPE REF TO cl_object_collection_iterator, - lo_worksheet TYPE REF TO zcl_excel_worksheet, - lo_range TYPE REF TO zcl_excel_range, - lo_autofilters TYPE REF TO zcl_excel_autofilters, - lo_autofilter TYPE REF TO zcl_excel_autofilter. + DATA: lo_ixml TYPE REF TO if_ixml, + lo_document TYPE REF TO if_ixml_document, + lo_element_root TYPE REF TO if_ixml_element, + lo_element TYPE REF TO if_ixml_element, + lo_element_range TYPE REF TO if_ixml_element, + lo_sub_element TYPE REF TO if_ixml_element, + lo_encoding TYPE REF TO if_ixml_encoding, + lo_streamfactory TYPE REF TO if_ixml_stream_factory, + lo_ostream TYPE REF TO if_ixml_ostream, + lo_renderer TYPE REF TO if_ixml_renderer, + lo_iterator TYPE REF TO cl_object_collection_iterator, + lo_iterator_range TYPE REF TO cl_object_collection_iterator, + lo_worksheet TYPE REF TO zcl_excel_worksheet, + lo_range TYPE REF TO zcl_excel_range, + lo_autofilters TYPE REF TO zcl_excel_autofilters, + lo_autofilter TYPE REF TO zcl_excel_autofilter. - DATA: lv_xml_node_ridx_id TYPE string, - lv_value TYPE string, - lv_syindex TYPE string, - l_guid TYPE uuid, - lv_active_sheet TYPE zexcel_active_worksheet. + DATA: lv_xml_node_ridx_id TYPE string, + lv_value TYPE string, + lv_syindex TYPE string, + l_guid TYPE uuid, + lv_active_sheet TYPE zexcel_active_worksheet. ********************************************************************** * STEP 1: Create [Content_Types].xml into the root of the ZIP @@ -6218,6 +6218,12 @@ ENDMETHOD. value = '8445' ). " Set Active Sheet lv_active_sheet = excel->get_active_sheet_index( ). +* issue #365 - test if sheet exists - otherwise set active worksheet to 1 + lo_worksheet = excel->get_worksheet_by_index( lv_active_sheet ). + IF lo_worksheet IS NOT BOUND. + lv_active_sheet = 1. + excel->SET_ACTIVE_SHEET_INDEX( lv_active_sheet ). + ENDIF. IF lv_active_sheet > 1. lv_active_sheet = lv_active_sheet - 1. lv_value = lv_active_sheet. @@ -6369,7 +6375,7 @@ ENDMETHOD. lo_renderer = lo_ixml->create_renderer( ostream = lo_ostream document = lo_document ). lo_renderer->render( ). - endmethod. +ENDMETHOD.