Author: fanningpj
Date: Tue Mar 22 17:54:37 2022
New Revision: 1899137

URL: http://svn.apache.org/viewvc?rev=1899137&view=rev
Log:
[bug-65973] partial fix for removing hyperlinks that span multiple cells

Modified:
    
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
    
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFSheet.java

Modified: 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java?rev=1899137&r1=1899136&r2=1899137&view=diff
==============================================================================
--- 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java 
(original)
+++ 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java 
Tue Mar 22 17:54:37 2022
@@ -3083,7 +3083,7 @@ public class XSSFSheet extends POIXMLDoc
 
         // also remove any hyperlinks associated with this row
         if (hyperlinks != null) {
-            for (XSSFHyperlink link : getHyperlinkList()) {
+            for (XSSFHyperlink link : new ArrayList<>(hyperlinks)) {
                 CellRangeAddress range = 
CellRangeAddress.valueOf(link.getCellRef());
                 //TODO handle case where hyperlink ref spans many rows 
(https://bz.apache.org/bugzilla/show_bug.cgi?id=65973)
                 //but where only some rows are being removed and others are 
not (range will need to be modified)

Modified: 
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFSheet.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFSheet.java?rev=1899137&r1=1899136&r2=1899137&view=diff
==============================================================================
--- 
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFSheet.java
 (original)
+++ 
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFSheet.java
 Tue Mar 22 17:54:37 2022
@@ -47,6 +47,7 @@ import java.util.stream.Collectors;
 import java.util.stream.StreamSupport;
 
 import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
+import org.apache.poi.common.usermodel.HyperlinkType;
 import org.apache.poi.hssf.HSSFTestDataSamples;
 import org.apache.poi.ooxml.POIXMLException;
 import org.apache.poi.poifs.crypt.CryptoFunctions;
@@ -2285,4 +2286,53 @@ public final class TestXSSFSheet extends
             assertEquals(CellRangeAddress.valueOf("A1"), sheet.getDimension());
         }
     }
+
+    @Test
+    void testRowShiftWithHyperlink() throws IOException {
+        try (XSSFWorkbook wb = createWorkbookForRowShiftWithHyperlink1(true)) {
+            XSSFSheet sheet = wb.getSheetAt(0);
+            List<XSSFHyperlink> hyperlinks = sheet.getHyperlinkList();
+            assertEquals(1, hyperlinks.size());
+            assertEquals("B1:C1", hyperlinks.get(0).getCellRef());
+            assertEquals(3, sheet.getLastRowNum());
+
+            sheet.shiftRows(2, 3, -2);
+            assertEquals(1, sheet.getLastRowNum());
+            XSSFRow row0 = sheet.getRow(0);
+            XSSFRow row1 = sheet.getRow(1);
+            assertEquals("row2", row0.getCell(0).getStringCellValue());
+            assertEquals("row3", row1.getCell(0).getStringCellValue());
+            assertEquals(0, sheet.getHyperlinkList().size());
+        }
+    }
+
+    private XSSFWorkbook createWorkbookForRowShiftWithHyperlink1(boolean 
hyperlinkOneRow) {
+        XSSFWorkbook wb = new XSSFWorkbook();
+        XSSFSheet sheet = wb.createSheet("Sheet1");
+        XSSFRow row0 = sheet.createRow(0);
+        XSSFRow row1 = sheet.createRow(1);
+        XSSFRow row2 = sheet.createRow(2);
+        XSSFRow row3 = sheet.createRow(3);
+        row0.createCell(0).setCellValue("row0");
+        row1.createCell(0).setCellValue("row1");
+        row2.createCell(0).setCellValue("row2");
+        row3.createCell(0).setCellValue("row3");
+        row0.createCell(1).setCellValue("https://www.example.com";);
+        if (hyperlinkOneRow) {
+            row0.createCell(2).setCellValue("https://www.example.com";);
+        } else {
+            row1.createCell(1).setCellValue("https://www.example.com";);
+        }
+        XSSFHyperlink hyperlink = new XSSFHyperlink(HyperlinkType.URL);
+        hyperlink.setAddress("https://www.example.com";);
+        hyperlink.setFirstRow(0);
+        hyperlink.setFirstColumn(1);
+        if (hyperlinkOneRow) {
+            hyperlink.setLastColumn(2);
+        } else {
+            hyperlink.setLastRow(1);
+        }
+        sheet.addHyperlink(hyperlink);
+        return wb;
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to