]> source.dussan.org Git - poi.git/commitdiff
Fix for bug 46445 - move hyperlinks when shifting rows
authorYegor Kozlov <yegor@apache.org>
Tue, 30 Dec 2008 09:24:15 +0000 (09:24 +0000)
committerYegor Kozlov <yegor@apache.org>
Tue, 30 Dec 2008 09:24:15 +0000 (09:24 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@730076 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
src/testcases/org/apache/poi/hssf/data/46445.xls [new file with mode: 0755]
src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java
src/testcases/org/apache/poi/hssf/usermodel/TestHSSFHyperlink.java

index ac8405946728ab14abe2d0f1666d47b870df1d8a..9ed29e00f5a72acbf8c594f4d3d0766c534ac6c8 100644 (file)
@@ -1187,6 +1187,12 @@ public final class HSSFSheet implements org.apache.poi.ss.usermodel.Sheet {
                 cellRecord.setRow( rowNum + n );
                 row2Replace.createCellFromRecord( cellRecord );
                 sheet.addValueRecord( rowNum + n, cellRecord );
+
+                HSSFHyperlink link = cell.getHyperlink();
+                if(link != null){
+                    link.setFirstRow(link.getFirstRow() + n);
+                    link.setLastRow(link.getLastRow() + n);
+                }
             }
             // Now zap all the cells in the source row
             row.removeAllCells();
diff --git a/src/testcases/org/apache/poi/hssf/data/46445.xls b/src/testcases/org/apache/poi/hssf/data/46445.xls
new file mode 100755 (executable)
index 0000000..30aaf34
Binary files /dev/null and b/src/testcases/org/apache/poi/hssf/data/46445.xls differ
index 040d3cfae86543e44fd501f237b750915dce0b36..76c61dd35d8cb7e74daaa9a2b95f3cbd4c75c033 100644 (file)
@@ -1642,4 +1642,28 @@ public final class TestBugs extends TestCase {
         assertEquals("\u0161\u017E\u010D\u0148\u0159", sheet.getRow(1).getCell(0).getStringCellValue());
     }
 
+    /**
+     * Multiple calls of HSSFWorkbook.write result in corrupted xls
+     */
+    public void test32191() throws IOException {
+        HSSFWorkbook wb = openSample("27394.xls");
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        wb.write(out);
+        out.close();
+        int size1 = out.size();
+        
+        out = new ByteArrayOutputStream();
+        wb.write(out);
+        out.close();
+        int size2 = out.size();
+
+        assertEquals(size1, size2);
+        out = new ByteArrayOutputStream();
+        wb.write(out);
+        out.close();
+        int size3 = out.size();
+        assertEquals(size2, size3);
+
+    }
 }
index e741166b003fb6ac247eb88a310eb6b1ab5cdec7..09443427a382d600855f1d25f28879c7e8ed0944 100755 (executable)
@@ -184,4 +184,49 @@ public final class TestHSSFHyperlink extends TestCase {
         assertNotNull(link);\r
         assertEquals("http://poi.apache.org/hssf/", link.getAddress());\r
     }\r
+\r
+    /**\r
+     * Test that HSSFSheet#shiftRows moves hyperlinks,\r
+     * see bugs #46445 and #29957\r
+     */\r
+    public void testShiftRows(){\r
+        HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("46445.xls");\r
+\r
+\r
+        HSSFSheet sheet = wb.getSheetAt(0);\r
+\r
+        //verify existing hyperlink in A3\r
+        HSSFCell cell1 = sheet.getRow(2).getCell(0);\r
+        HSSFHyperlink link1 = cell1.getHyperlink();\r
+        assertNotNull(link1);\r
+        assertEquals(2, link1.getFirstRow());\r
+        assertEquals(2, link1.getLastRow());\r
+\r
+        //assign a hyperlink to A4\r
+        HSSFHyperlink link2 = new HSSFHyperlink(HSSFHyperlink.LINK_DOCUMENT);\r
+        link2.setAddress("Sheet2!A2");\r
+        HSSFCell cell2 = sheet.getRow(3).getCell(0);\r
+        cell2.setHyperlink(link2);\r
+        assertEquals(3, link2.getFirstRow());\r
+        assertEquals(3, link2.getLastRow());\r
+\r
+        //move the 3rd row two rows down\r
+        sheet.shiftRows(sheet.getFirstRowNum(), sheet.getLastRowNum(), 2);\r
+\r
+        //cells A3 and A4 don't contain hyperlinks anymore\r
+        assertNull(sheet.getRow(2).getCell(0).getHyperlink());\r
+        assertNull(sheet.getRow(3).getCell(0).getHyperlink());\r
+\r
+        //the first hypelink now belongs to A5\r
+        HSSFHyperlink link1_shifted = sheet.getRow(2+2).getCell(0).getHyperlink();\r
+        assertNotNull(link1_shifted);\r
+        assertEquals(4, link1_shifted.getFirstRow());\r
+        assertEquals(4, link1_shifted.getLastRow());\r
+\r
+        //the second hypelink now belongs to A6\r
+        HSSFHyperlink link2_shifted = sheet.getRow(3+2).getCell(0).getHyperlink();\r
+        assertNotNull(link2_shifted);\r
+        assertEquals(5, link2_shifted.getFirstRow());\r
+        assertEquals(5, link2_shifted.getLastRow());\r
+    }\r
 }\r