]> source.dussan.org Git - poi.git/commitdiff
Apply some changes inspired by bug # 45373, which improve the performance of HSSFShee...
authorNick Burch <nick@apache.org>
Thu, 10 Jul 2008 17:52:33 +0000 (17:52 +0000)
committerNick Burch <nick@apache.org>
Thu, 10 Jul 2008 17:52:33 +0000 (17:52 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@675661 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/changes.xml
src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/hssf/usermodel/HSSFRow.java
src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java

index 6756dcc360ace1c11eb516b7a0b0637644da8055..16a82aa3aeb6b6923614782850a9651803aef23d 100644 (file)
@@ -37,6 +37,7 @@
 
                <!-- Don't forget to update status.xml too! -->
         <release version="3.1.1-alpha1" date="2008-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">45373 - Improve the performance of HSSFSheet.shiftRows</action>
            <action dev="POI-DEVELOPERS" type="fix">45367 - Fixed bug when last row removed from sheet is row zero</action>
            <action dev="POI-DEVELOPERS" type="fix">45348 - Tweaks to RVA formula logic</action>
            <action dev="POI-DEVELOPERS" type="fix">45354 - Fixed recognition of named ranges within formulas</action>
index bbf536e73cc60975c3d1021e10efddd455b69e6e..7143b98d78c22e8f6c2897c4f0371e9fb3a314dd 100644 (file)
@@ -34,6 +34,7 @@
        <!-- Don't forget to update changes.xml too! -->
     <changes>
         <release version="3.1.1-alpha1" date="2008-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">45373 - Improve the performance of HSSFSheet.shiftRows</action>
            <action dev="POI-DEVELOPERS" type="fix">45367 - Fixed bug when last row removed from sheet is row zero</action>
            <action dev="POI-DEVELOPERS" type="fix">45348 - Tweaks to RVA formula logic</action>
            <action dev="POI-DEVELOPERS" type="fix">45354 - Fixed recognition of named ranges within formulas</action>
index 0a2d6ecbbeaadc03f3064ca6b42efe3e89098984..e7de1df5d647e317482c9e1d6edc95c7cfaf2c4b 100644 (file)
@@ -168,6 +168,19 @@ public final class HSSFRow implements Comparable {
             row.setFirstCol(findFirstCell(row.getFirstCol()));
         }
     }
+    
+    /**
+     * Removes all the cells from the row, and their
+     *  records too.
+     */
+    protected void removeAllCells() {
+       for(int i=0; i<cells.length; i++) {
+               if(cells[i] != null) {
+                       removeCell(cells[i], true);
+               }
+       }
+       cells=new HSSFCell[INITIAL_CAPACITY];
+    }
 
     /**
      * create a high level HSSFCell object from an existing low level record.  Should
index ea2b8132d05619a5e92261c0413ac309b1610c8f..e2e25c1035b379436454a11cea651aab02f24271 100644 (file)
@@ -1207,6 +1207,28 @@ public final class HSSFSheet {
      * @param resetOriginalRowHeight whether to set the original row's height to the default
      */
     public void shiftRows( int startRow, int endRow, int n, boolean copyRowHeight, boolean resetOriginalRowHeight)
+    {
+       shiftRows(startRow, endRow, n, copyRowHeight, resetOriginalRowHeight, true);
+    }
+    
+    /**
+     * Shifts rows between startRow and endRow n number of rows.
+     * If you use a negative number, it will shift rows up.
+     * Code ensures that rows don't wrap around
+     *
+     * <p>
+     * Additionally shifts merged regions that are completely defined in these
+     * rows (ie. merged 2 cells on a row to be shifted).
+     * <p>
+     * TODO Might want to add bounds checking here
+     * @param startRow the row to start shifting
+     * @param endRow the row to end shifting
+     * @param n the number of rows to shift
+     * @param copyRowHeight whether to copy the row height during the shift
+     * @param resetOriginalRowHeight whether to set the original row's height to the default
+     * @param moveComments whether to move comments at the same time as the cells they are attached to
+     */
+    public void shiftRows( int startRow, int endRow, int n, boolean copyRowHeight, boolean resetOriginalRowHeight, boolean moveComments)
     {
         int s, e, inc;
         if ( n < 0 )
@@ -1233,44 +1255,55 @@ public final class HSSFSheet {
                 row2Replace = createRow( rowNum + n );
 
             HSSFCell cell;
-
-
-
-
-        // Removes the cells before over writting them.
-            for ( short col = row2Replace.getFirstCellNum(); col <= row2Replace.getLastCellNum(); col++ )
-            {
-                cell = row2Replace.getCell( col );
-                if ( cell != null )
-                    row2Replace.removeCell( cell );
+            
+            // Remove all the old cells from the row we'll
+            //  be writing too, before we start overwriting 
+            //  any cells. This avoids issues with cells 
+            //  changing type, and records not being correctly
+            //  overwritten
+            row2Replace.removeAllCells();
+
+            // If this row doesn't exist, nothing needs to
+            //  be done for the now empty destination row
+            if (row == null) continue; // Nothing to do for this row
+
+            // Fetch the first and last columns of the
+            //  row now, so we still have them to hand
+            //  once we start removing cells
+               short firstCol = row.getFirstCellNum();
+               short lastCol = row.getLastCellNum();
+
+            // Fix up row heights if required
+            if (copyRowHeight) {
+                row2Replace.setHeight(row.getHeight());
+            }
+            if (resetOriginalRowHeight) {
+                row.setHeight((short)0xff);
             }
-        if (row == null) continue; // Nothing to do for this row
-        else {
-        if (copyRowHeight) {
-            row2Replace.setHeight(row.getHeight());
-        }
-
-        if (resetOriginalRowHeight) {
-            row.setHeight((short)0xff);
-        }
-        }
-            for ( short col = row.getFirstCellNum(); col <= row.getLastCellNum(); col++ )
-            {
-                cell = row.getCell( col );
-                if ( cell != null )
-                {
-                    row.removeCell( cell );
-                    CellValueRecordInterface cellRecord = cell.getCellValueRecord();
-                    cellRecord.setRow( rowNum + n );
-                    row2Replace.createCellFromRecord( cellRecord );
-                    sheet.addValueRecord( rowNum + n, cellRecord );
-                }
 
-                // move comments if exist (can exist even if cell is null)
-                HSSFComment comment = getCellComment(rowNum, col);
-                if (comment != null) {
-                   comment.setRow(rowNum + n);
-                }
+            // Copy each cell from the source row to
+            //  the destination row
+            for(Iterator cells = row.cellIterator(); cells.hasNext(); ) {
+               cell = (HSSFCell)cells.next();
+                row.removeCell( cell );
+                CellValueRecordInterface cellRecord = cell.getCellValueRecord();
+                cellRecord.setRow( rowNum + n );
+                row2Replace.createCellFromRecord( cellRecord );
+                sheet.addValueRecord( rowNum + n, cellRecord );
+            }
+            // Now zap all the cells in the source row
+            row.removeAllCells();
+            
+            // Move comments from the source row to the
+            //  destination row. Note that comments can
+            //  exist for cells which are null
+            if(moveComments) {
+                   for( short col = firstCol; col <= lastCol; col++ ) {
+                       HSSFComment comment = getCellComment(rowNum, col);
+                       if (comment != null) {
+                          comment.setRow(rowNum + n);
+                       }
+                   }
             }
         }
         if ( endRow == lastrow || endRow + n > lastrow ) lastrow = Math.min( endRow + n, 65535 );