diff --git a/EPPlus/CellStore.cs b/EPPlus/CellStore.cs
index 623ab56..0f8a600 100644
--- a/EPPlus/CellStore.cs
+++ b/EPPlus/CellStore.cs
@@ -68,7 +68,7 @@
         {
             var page = (short)(Row >> CellStore<int>.pageBits);
             _searchIx.Index = page;
-            var res = (page>=0 && page<_pages.Length && _pages[page].Index == page) ? page : Array.BinarySearch(_pages, 0, PageCount, _searchIx);
+            var res = (_pages!=null && page>=0 && page<_pages.Length && _pages[page]!=null && _pages[page].Index == page) ? page : Array.BinarySearch(_pages, 0, PageCount, _searchIx);
             if (res >= 0)
             {
                 GetPage(Row, ref res);
@@ -263,7 +263,7 @@
         internal int GetPosition(int offset)
         {
             _searchIx.Index = (short)offset;
-            return (offset>0 && offset-1<Rows.Length && Rows[offset-1].Index == offset) ? offset-1 : Array.BinarySearch(Rows, 0, RowCount, _searchIx);
+            return (Rows!=null && offset>0 && offset-1<Rows.Length && Rows[offset-1]!=null && Rows[offset-1].Index == offset) ? offset-1 : Array.BinarySearch(Rows, 0, RowCount, _searchIx);
         }
         internal int GetNextRow(int row)
         {
@@ -355,7 +355,7 @@
         internal int GetPosition(int Column)
         {
             _searchIx.Index = (short)Column;
-            return (Column>0 && Column-1<_columnIndex.Length && _columnIndex[Column-1].Index == Column) ? Column-1 : Array.BinarySearch(_columnIndex, 0, ColumnCount, _searchIx);
+            return (_columnIndex!=null && Column>0 && Column-1<_columnIndex.Length && _columnIndex[Column-1]!=null && _columnIndex[Column-1].Index == Column) ? Column-1 : Array.BinarySearch(_columnIndex, 0, ColumnCount, _searchIx);
         }
         internal CellStore<T> Clone()
         {
@@ -568,7 +568,7 @@
                     }
                     short ix = (short)(Row - pageItem.IndexOffset);
                     _searchIx.Index = ix;
-                    var cellPos = (ix>0 && ix-1<pageItem.Rows.Length && pageItem.Rows[ix-1].Index == ix) ? ix-1 : Array.BinarySearch(pageItem.Rows, 0, pageItem.RowCount, _searchIx);
+                    var cellPos = (pageItem.Rows!=null && ix>0 && ix-1<pageItem.Rows.Length && pageItem.Rows[ix-1]!=null && pageItem.Rows[ix-1].Index == ix) ? ix-1 : Array.BinarySearch(pageItem.Rows, 0, pageItem.RowCount, _searchIx);
                     if (cellPos >= 0)
                     {
                         return pageItem.Rows[cellPos].IndexPointer;
@@ -609,7 +609,7 @@
         {
             lock (_columnIndex)
             {
-                var col = (Column>0 && Column-1 < _columnIndex.Length && _columnIndex[Column-1].Index == Column) ? Column-1 : Array.BinarySearch(_columnIndex, 0, ColumnCount, new IndexBase() { Index = (short)(Column) });
+                var col = (_columnIndex!=null && Column>0 && Column-1 < _columnIndex.Length && _columnIndex[Column-1]!=null && _columnIndex[Column-1].Index == Column) ? Column-1 : Array.BinarySearch(_columnIndex, 0, ColumnCount, new IndexBase() { Index = (short)(Column) });
                 var page = (short)(Row >> pageBits);
                 if (col >= 0)
                 {
@@ -645,7 +645,7 @@
 
                     short ix = (short)(Row - ((pageItem.Index << pageBits) + pageItem.Offset));
                     _searchIx.Index = ix;
-                    var cellPos = (ix>=0 && ix<pageItem.Rows.Length && pageItem.Rows[ix].Index == ix) ? ix : Array.BinarySearch(pageItem.Rows, 0, pageItem.RowCount, _searchIx);
+                    var cellPos = (pageItem.Rows!=null && ix>=0 && ix<pageItem.Rows.Length && pageItem.Rows[ix]!=null && pageItem.Rows[ix].Index == ix) ? ix : Array.BinarySearch(pageItem.Rows, 0, pageItem.RowCount, _searchIx);
                     if (cellPos < 0)
                     {
                         cellPos = ~cellPos;
