diff --git a/src/zcl_excel_rows.clas.abap b/src/zcl_excel_rows.clas.abap
index c1cf0f1..5ef7600 100644
--- a/src/zcl_excel_rows.clas.abap
+++ b/src/zcl_excel_rows.clas.abap
@@ -3,45 +3,51 @@
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
-class ZCL_EXCEL_ROWS definition
- public
- final
- create public .
+CLASS ZCL_EXCEL_ROWS DEFINITION
+ PUBLIC
+ FINAL
+ CREATE PUBLIC .
+
*"* public components of class ZCL_EXCEL_ROWS
*"* do not include other source files here!!!
*"* protected components of class ZABAP_EXCEL_WORKSHEETS
*"* do not include other source files here!!!
-public section.
+ PUBLIC SECTION.
+ TYPES:
+ BEGIN OF T_ROWS, " performance improvement #527
+ ROW_INDEX TYPE INT4,
+ ROW TYPE REF TO ZCL_EXCEL_ROW,
+ END OF T_ROWS.
- methods ADD
- importing
- !IO_ROW type ref to ZCL_EXCEL_ROW .
- methods CLEAR .
- methods CONSTRUCTOR .
- methods GET
- importing
- !IP_INDEX type I
- returning
- value(EO_ROW) type ref to ZCL_EXCEL_ROW .
- methods GET_ITERATOR
- returning
- value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR .
- methods IS_EMPTY
- returning
- value(IS_EMPTY) type FLAG .
- methods REMOVE
- importing
- !IO_ROW type ref to ZCL_EXCEL_ROW .
- methods SIZE
- returning
- value(EP_SIZE) type I .
+ DATA:
+ DT_ROWS TYPE HASHED TABLE OF T_ROWS WITH UNIQUE KEY ROW_INDEX READ-ONLY.
+
+ METHODS ADD
+ IMPORTING
+ !IO_ROW TYPE REF TO ZCL_EXCEL_ROW .
+ METHODS CLEAR .
+ METHODS CONSTRUCTOR .
+ METHODS GET
+ IMPORTING
+ !IP_INDEX TYPE I
+ RETURNING
+ VALUE(EO_ROW) TYPE REF TO ZCL_EXCEL_ROW .
+ METHODS IS_EMPTY
+ RETURNING
+ VALUE(IS_EMPTY) TYPE FLAG .
+ METHODS REMOVE
+ IMPORTING
+ !IO_ROW TYPE REF TO ZCL_EXCEL_ROW .
+ METHODS SIZE
+ RETURNING
+ VALUE(EP_SIZE) TYPE I .
PROTECTED SECTION.
*"* private components of class ZABAP_EXCEL_RANGES
*"* do not include other source files here!!!
PRIVATE SECTION.
- DATA rows TYPE REF TO cl_object_collection .
+ DATA ROWS TYPE REF TO CL_OBJECT_COLLECTION .
ENDCLASS.
@@ -49,44 +55,89 @@ ENDCLASS.
CLASS ZCL_EXCEL_ROWS IMPLEMENTATION.
- METHOD add.
- rows->add( io_row ).
+* ---------------------------------------------------------------------------------------+
+* | Instance Public Method ZCL_EXCEL_ROWS->ADD
+* +-------------------------------------------------------------------------------------------------+
+* | [--->] IO_ROW TYPE REF TO ZCL_EXCEL_ROW
+* +--------------------------------------------------------------------------------------
+ METHOD ADD.
+
+ DATA:
+ LS_ROW TYPE T_ROWS.
+ LS_ROW-ROW_INDEX = IO_ROW->GET_ROW_INDEX( ).
+ LS_ROW-ROW = IO_ROW.
+ INSERT LS_ROW INTO TABLE DT_ROWS.
+
ENDMETHOD. "ADD
- METHOD clear.
- rows->clear( ).
+* ---------------------------------------------------------------------------------------+
+* | Instance Public Method ZCL_EXCEL_ROWS->CLEAR
+* +-------------------------------------------------------------------------------------------------+
+* +--------------------------------------------------------------------------------------
+ METHOD CLEAR.
+ CLEAR DT_ROWS[].
+
ENDMETHOD. "CLEAR
- METHOD constructor.
+* ---------------------------------------------------------------------------------------+
+* | Instance Public Method ZCL_EXCEL_ROWS->CONSTRUCTOR
+* +-------------------------------------------------------------------------------------------------+
+* +--------------------------------------------------------------------------------------
+ METHOD CONSTRUCTOR.
- CREATE OBJECT rows.
+ CREATE OBJECT ROWS.
ENDMETHOD. "CONSTRUCTOR
- METHOD get.
- eo_row ?= rows->if_object_collection~get( ip_index ).
+* ---------------------------------------------------------------------------------------+
+* | Instance Public Method ZCL_EXCEL_ROWS->GET
+* +-------------------------------------------------------------------------------------------------+
+* | [--->] IP_INDEX TYPE I
+* | [<-()] EO_ROW TYPE REF TO ZCL_EXCEL_ROW
+* +--------------------------------------------------------------------------------------
+ METHOD GET.
+ READ TABLE DT_ROWS ASSIGNING FIELD-SYMBOL() WITH TABLE KEY ROW_INDEX = IP_INDEX.
+ IF SY-SUBRC = 0.
+ EO_ROW ?= -ROW.
+ ENDIF.
ENDMETHOD. "GET
- METHOD get_iterator.
- eo_iterator ?= rows->if_object_collection~get_iterator( ).
- ENDMETHOD. "GET_ITERATOR
+* ---------------------------------------------------------------------------------------+
+* | Instance Public Method ZCL_EXCEL_ROWS->IS_EMPTY
+* +-------------------------------------------------------------------------------------------------+
+* | [<-()] IS_EMPTY TYPE FLAG
+* +--------------------------------------------------------------------------------------
+ METHOD IS_EMPTY.
+ DATA(LV_LINES) = LINES( DT_ROWS ).
-
- METHOD is_empty.
- is_empty = rows->if_object_collection~is_empty( ).
+ IF LV_LINES = 0.
+ IS_EMPTY = abap_true.
+ ELSE.
+ IS_EMPTY = abap_false.
+ ENDIF.
ENDMETHOD. "IS_EMPTY
- METHOD remove.
- rows->remove( io_row ).
+* ---------------------------------------------------------------------------------------+
+* | Instance Public Method ZCL_EXCEL_ROWS->REMOVE
+* +-------------------------------------------------------------------------------------------------+
+* | [--->] IO_ROW TYPE REF TO ZCL_EXCEL_ROW
+* +--------------------------------------------------------------------------------------
+ METHOD REMOVE.
+ DELETE DT_ROWS WHERE ROW_INDEX = IO_ROW->GET_ROW_INDEX( ).
ENDMETHOD. "REMOVE
- METHOD size.
- ep_size = rows->if_object_collection~size( ).
+* ---------------------------------------------------------------------------------------+
+* | Instance Public Method ZCL_EXCEL_ROWS->SIZE
+* +-------------------------------------------------------------------------------------------------+
+* | [<-()] EP_SIZE TYPE I
+* +--------------------------------------------------------------------------------------
+ METHOD SIZE.
+ EP_SIZE = LINES( DT_ROWS )..
ENDMETHOD. "SIZE
ENDCLASS.
diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap
index 8a57774..21b6173 100644
--- a/src/zcl_excel_worksheet.clas.abap
+++ b/src/zcl_excel_worksheet.clas.abap
@@ -4098,20 +4098,14 @@ method GET_RANGES_ITERATOR.
METHOD get_row.
- DATA: lo_row_iterator TYPE REF TO cl_object_collection_iterator,
- lo_row TYPE REF TO zcl_excel_row.
+* performance improvement for issue #527
+ READ TABLE ROWS->DT_ROWS ASSIGNING FIELD-SYMBOL() WITH TABLE KEY ROW_INDEX = IP_ROW.
+ IF SY-SUBRC = 0.
+ EO_ROW = -ROW.
+ ENDIF.
- lo_row_iterator = me->get_rows_iterator( ).
- WHILE lo_row_iterator->has_next( ) = abap_true.
- lo_row ?= lo_row_iterator->get_next( ).
- IF lo_row->get_row_index( ) = ip_row.
- eo_row = lo_row.
- EXIT.
- ENDIF.
- ENDWHILE.
-
- IF eo_row IS NOT BOUND.
- eo_row = me->add_new_row( ip_row ).
+ IF EO_ROW IS NOT BOUND.
+ EO_ROW = ME->ADD_NEW_ROW( IP_ROW ).
ENDIF.
ENDMETHOD.