poi-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From n...@apache.org
Subject svn commit: r675661 - in /poi/trunk/src: documentation/content/xdocs/changes.xml documentation/content/xdocs/status.xml java/org/apache/poi/hssf/usermodel/HSSFRow.java java/org/apache/poi/hssf/usermodel/HSSFSheet.java
Date Thu, 10 Jul 2008 17:52:34 GMT
Author: nick
Date: Thu Jul 10 10:52:33 2008
New Revision: 675661

URL: http://svn.apache.org/viewvc?rev=675661&view=rev
Log:
Apply some changes inspired by bug # 45373, which improve the performance of HSSFSheet.shiftRows

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

Modified: poi/trunk/src/documentation/content/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/changes.xml?rev=675661&r1=675660&r2=675661&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/changes.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/changes.xml Thu Jul 10 10:52:33 2008
@@ -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>

Modified: poi/trunk/src/documentation/content/xdocs/status.xml
URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/status.xml?rev=675661&r1=675660&r2=675661&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/status.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/status.xml Thu Jul 10 10:52:33 2008
@@ -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>

Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java?rev=675661&r1=675660&r2=675661&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java Thu Jul 10 10:52:33 2008
@@ -168,6 +168,19 @@
             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

Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java?rev=675661&r1=675660&r2=675661&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java Thu Jul 10 10:52:33 2008
@@ -1208,6 +1208,28 @@
      */
     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 @@
                 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 );



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org


Mime
View raw message