]> source.dussan.org Git - poi.git/commitdiff
[github-206] Improve perfomance of SXSSF cell evaluation. Thanks to This closes #206
authorPJ Fanning <fanningpj@apache.org>
Thu, 10 Dec 2020 18:18:51 +0000 (18:18 +0000)
committerPJ Fanning <fanningpj@apache.org>
Thu, 10 Dec 2020 18:18:51 +0000 (18:18 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1884288 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFRow.java
src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java

index 9f0379493b2dffa045d7421e79ab07ca54cd7bf1..8d6e903d9d3c2b3796c15e81da200b2a83732c97 100644 (file)
@@ -49,6 +49,7 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
     // use Boolean to have a tri-state for on/off/undefined
     private Boolean _hidden = UNDEFINED;
     private Boolean _collapsed = UNDEFINED;
+    private int _rowNum;
 
     public SXSSFRow(SXSSFSheet sheet)
     {
@@ -59,6 +60,7 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
     {
         return new CellIterator();
     }
+
     public boolean hasCustomHeight()
     {
         return _height!=-1;
@@ -195,7 +197,8 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
     @Override
     public void setRowNum(int rowNum)
     {
-        _sheet.changeRowNum(this,rowNum);
+        this._rowNum = rowNum;
+        _sheet.changeRowNum(this, rowNum);
     }
 
     /**
@@ -206,7 +209,7 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
     @Override
     public int getRowNum()
     {
-        return _sheet.getRowNum(this);
+        return _rowNum;
     }
 
     /**
@@ -393,15 +396,15 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
      */
     @Override
     public CellStyle getRowStyle() {
-       if(!isFormatted()) {
-        return null;
-    }
+        if(!isFormatted()) {
+            return null;
+        }
 
-       return getSheet().getWorkbook().getCellStyleAt(_style);
+        return getSheet().getWorkbook().getCellStyleAt(_style);
     }
 
     @Internal
-    /*package*/ int getRowStyleIndex() {
+        /*package*/ int getRowStyleIndex() {
         return _style;
     }
 
@@ -411,11 +414,11 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
      */
     @Override
     public void setRowStyle(CellStyle style) {
-       if(style == null) {
-          _style = -1;
-       } else {
-          _style = style.getIndex();
-       }
+        if(style == null) {
+            _style = -1;
+        } else {
+            _style = style.getIndex();
+        }
     }
 
     /**
@@ -437,8 +440,13 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
     {
         return _sheet;
     }
+
 //end of interface implementation
 
+    void setRowNumWithoutUpdatingSheet(int rowNum)
+    {
+        this._rowNum = rowNum;
+    }
 
     /**
      * Create an iterator over the cells from [0, getLastCellNum()).
@@ -543,7 +551,7 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
         SXSSFRow other = (SXSSFRow) obj;
 
         return (this.getRowNum() == other.getRowNum()) &&
-               (this.getSheet() == other.getSheet());
+                (this.getSheet() == other.getSheet());
     }
 
     @Override
@@ -563,4 +571,3 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow>
     }
 
 }
-
index 9c67e9f49eb05bbf47e85ed02ba79deb4e35754c..04e0c0e735c3c884607c3392d6fcf7c0997406b4 100644 (file)
@@ -146,6 +146,7 @@ public class SXSSFSheet implements Sheet
         }
 
         SXSSFRow newRow = new SXSSFRow(this);
+        newRow.setRowNumWithoutUpdatingSheet(rownum);
         _rows.put(rownum, newRow);
         allFlushed = false;
         if(_randomAccessWindowSize >= 0 && _rows.size() > _randomAccessWindowSize) {
@@ -1293,8 +1294,8 @@ public class SXSSFSheet implements Sheet
      *
      * <p>
      *    groupRows requires all rows in the group to be in the current window.
-     *    This is not always practical.  Instead use setRowOutlineLevel to 
-     *    explicitly set the group level.  Level 1 is the top level group, 
+     *    This is not always practical.  Instead use setRowOutlineLevel to
+     *    explicitly set the group level.  Level 1 is the top level group,
      *    followed by 2, etc.  It is up to the user to ensure that level 2
      *    groups are correctly nested under level 1, etc.
      * </p>
@@ -1588,7 +1589,7 @@ public class SXSSFSheet implements Sheet
         // to recalculate the best-fit width for the flushed rows. This is an
         // inherent limitation of SXSSF. If having correct auto-sizing is
         // critical, the flushed rows would need to be re-read by the read-only
-        // XSSF eventmodel (SAX) or the memory-heavy XSSF usermodel (DOM). 
+        // XSSF eventmodel (SAX) or the memory-heavy XSSF usermodel (DOM).
         final int flushedWidth;
         try {
             // get the best fit width of rows already flushed to disk
@@ -1885,22 +1886,17 @@ public class SXSSFSheet implements Sheet
             lastFlushedRowNumber = rowIndex;
         }
     }
+
     public void changeRowNum(SXSSFRow row, int newRowNum)
     {
-
         removeRow(row);
-        _rows.put(newRowNum,row);
+        row.setRowNumWithoutUpdatingSheet(newRowNum);
+        _rows.put(newRowNum, row);
     }
 
     public int getRowNum(SXSSFRow row)
     {
-        for (Map.Entry<Integer, SXSSFRow> entry : _rows.entrySet()) {
-            if (entry.getValue() == row) {
-                return entry.getKey().intValue();
-            }
-        }
-
-        return -1;
+        return row.getRowNum();
     }
 
     /**