]> source.dussan.org Git - poi.git/commitdiff
Fix bug #50416 - Correct shifting of the first or last row in a sheet by multiple...
authorNick Burch <nick@apache.org>
Tue, 14 Dec 2010 06:41:08 +0000 (06:41 +0000)
committerNick Burch <nick@apache.org>
Tue, 14 Dec 2010 06:41:08 +0000 (06:41 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1048951 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java

index 05d4d10bd1939ea4d8475c25774ff5c1a12f4de2..5eb09cae6a68e305b0e6c1fce3cc866a8f618e5a 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.8-beta1" date="2010-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">50416 - Correct shifting of the first or last row in a sheet by multiple rows</action>
            <action dev="POI-DEVELOPERS" type="fix">50440 - Support evaluating formulas with newlines in them, which XSSF may have (but HSSF may not)</action>
            <action dev="POI-DEVELOPERS" type="add">Added inline string support to XSSF EventModel</action>
            <action dev="POI-DEVELOPERS" type="fix">50246 - Properly position GutsRecord when reading HSSF workbooks</action>
index 9a772e15dd5d01efefeb4c8f7e19e68cb71f52a3..679bfdd8dbab00e415e54135df83a42fb5056e5a 100644 (file)
@@ -1221,10 +1221,14 @@ public final class HSSFSheet implements org.apache.poi.ss.usermodel.Sheet {
         if (n < 0) {
             s = startRow;
             inc = 1;
-        } else {
+        } else if (n > 0) {
             s = endRow;
             inc = -1;
+        } else {
+           // Nothing to do
+           return;
         }
+        
         NoteRecord[] noteRecs;
         if (moveComments) {
             noteRecs = _sheet.getNoteRecords();
@@ -1302,8 +1306,39 @@ public final class HSSFSheet implements org.apache.poi.ss.usermodel.Sheet {
                 }
             }
         }
-        if ( endRow == _lastrow || endRow + n > _lastrow ) _lastrow = Math.min( endRow + n, SpreadsheetVersion.EXCEL97.getLastRowIndex() );
-        if ( startRow == _firstrow || startRow + n < _firstrow ) _firstrow = Math.max( startRow + n, 0 );
+        
+        // Re-compute the first and last rows of the sheet as needed
+        if(n > 0) {
+           // Rows are moving down
+           if ( startRow == _firstrow ) {
+              // Need to walk forward to find the first non-blank row
+              _firstrow = Math.max( startRow + n, 0 );
+              for( int i=startRow+1; i < startRow+n; i++ ) {
+                 if (getRow(i) != null) {
+                    _firstrow = i;
+                    break;
+                 }
+              }
+           }
+           if ( endRow + n > _lastrow ) {
+              _lastrow = Math.min( endRow + n, SpreadsheetVersion.EXCEL97.getLastRowIndex() );
+           }
+        } else {
+           // Rows are moving up
+           if ( startRow + n < _firstrow ) {
+              _firstrow = Math.max( startRow + n, 0 );
+           }
+           if ( endRow == _lastrow  ) {
+              // Need to walk backward to find the last non-blank row
+              _lastrow = Math.min( endRow + n, SpreadsheetVersion.EXCEL97.getLastRowIndex() );
+              for (int i=endRow-1; i > endRow+n; i++) {
+                 if (getRow(i) != null) {
+                    _lastrow = i;
+                    break;
+                 }
+              }
+           }
+        }
 
         // Update any formulas on this sheet that point to
         //  rows which have been moved
index cb7cdbd1f693bd658e7277772fd73e0f6df7831d..09ff05c0cbd29ff4e1abeaa275386ee6def17f61 100644 (file)
@@ -1899,4 +1899,58 @@ if(1==2) {
        HSSFWorkbook wb = openSample("50426.xls");
        writeOutAndReadBack(wb);
     }
+    
+    /**
+     * Last row number when shifting rows
+     */
+    public void test50416LastRowNumber() {
+       // Create the workbook with 1 sheet which contains 3 rows
+       HSSFWorkbook workbook = new HSSFWorkbook();
+       Sheet sheet = workbook.createSheet("Bug50416");
+       Row row1 = sheet.createRow(0);
+       Cell cellA_1 = row1.createCell(0,Cell.CELL_TYPE_STRING);
+       cellA_1.setCellValue("Cell A,1");
+       Row row2 = sheet.createRow(1);
+       Cell cellA_2 = row2.createCell(0,Cell.CELL_TYPE_STRING);
+       cellA_2.setCellValue("Cell A,2");
+       Row row3 = sheet.createRow(2);
+       Cell cellA_3 = row3.createCell(0,Cell.CELL_TYPE_STRING);
+       cellA_3.setCellValue("Cell A,3");
+       
+       // Test the last Row number it currently correct
+       assertEquals(2, sheet.getLastRowNum());
+       
+       // Shift the first row to the end
+       sheet.shiftRows(0, 0, 3);
+       assertEquals(3, sheet.getLastRowNum());
+       assertEquals(-1,         sheet.getRow(0).getLastCellNum());
+       assertEquals("Cell A,2", sheet.getRow(1).getCell(0).getStringCellValue());
+       assertEquals("Cell A,3", sheet.getRow(2).getCell(0).getStringCellValue());
+       assertEquals("Cell A,1", sheet.getRow(3).getCell(0).getStringCellValue());
+       
+       // Shift the 2nd row up to the first one
+       sheet.shiftRows(1, 1, -1);
+       assertEquals(3, sheet.getLastRowNum());
+       assertEquals("Cell A,2", sheet.getRow(0).getCell(0).getStringCellValue());
+       assertEquals(-1,         sheet.getRow(1).getLastCellNum());
+       assertEquals("Cell A,3", sheet.getRow(2).getCell(0).getStringCellValue());
+       assertEquals("Cell A,1", sheet.getRow(3).getCell(0).getStringCellValue());
+
+       // Shift the 4th row up into the gap in the 3rd row
+       sheet.shiftRows(3, 3, -2);
+       assertEquals(2, sheet.getLastRowNum());
+       assertEquals("Cell A,2", sheet.getRow(0).getCell(0).getStringCellValue());
+       assertEquals("Cell A,1", sheet.getRow(1).getCell(0).getStringCellValue());
+       assertEquals("Cell A,3", sheet.getRow(2).getCell(0).getStringCellValue());
+       assertEquals(-1,         sheet.getRow(3).getLastCellNum());
+       
+       // Now zap the empty 4th row - won't do anything
+       sheet.removeRow(sheet.getRow(3));
+       
+       // Test again the last row number which should be 2
+       assertEquals(2, sheet.getLastRowNum());
+       assertEquals("Cell A,2", sheet.getRow(0).getCell(0).getStringCellValue());
+       assertEquals("Cell A,1", sheet.getRow(1).getCell(0).getStringCellValue());
+       assertEquals("Cell A,3", sheet.getRow(2).getCell(0).getStringCellValue());
+    }
 }