]> source.dussan.org Git - poi.git/commitdiff
Patch from hishidama to add Cell.removeHyperlink(). This closes #13 from github
authorNick Burch <nick@apache.org>
Sat, 8 Nov 2014 13:46:30 +0000 (13:46 +0000)
committerNick Burch <nick@apache.org>
Sat, 8 Nov 2014 13:46:30 +0000 (13:46 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1637562 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/usermodel/HSSFCell.java
src/java/org/apache/poi/ss/usermodel/Cell.java
src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFCell.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java
src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java

index c66cdd3d13a24670c79f84a968ba9ec77600d2af..e5de299a04314abb4c51c97a96baf8f12c222674 100644 (file)
@@ -1062,11 +1062,17 @@ public class HSSFCell implements Cell {
     }
 
     /**
-     * Assign a hyperlink to this cell
+     * Assign a hyperlink to this cell. If the supplied hyperlink is null, the
+     * hyperlink for this cell will be removed.
      *
      * @param hyperlink hyperlink associated with this cell
      */
     public void setHyperlink(Hyperlink hyperlink){
+        if (hyperlink == null) {
+            removeHyperlink();
+            return;
+        }
+
         HSSFHyperlink link = (HSSFHyperlink)hyperlink;
 
         link.setFirstRow(_record.getRow());
@@ -1091,6 +1097,23 @@ public class HSSFCell implements Cell {
         int eofLoc = records.size() - 1;
         records.add( eofLoc, link.record );
     }
+
+    /**
+     * Removes the hyperlink for this cell, if there is one.
+     */
+    public void removeHyperlink() {
+        for (Iterator<RecordBase> it = _sheet.getSheet().getRecords().iterator(); it.hasNext();) {
+            RecordBase rec = it.next();
+            if (rec instanceof HyperlinkRecord) {
+                HyperlinkRecord link = (HyperlinkRecord) rec;
+                if (link.getFirstColumn() == _record.getColumn() && link.getFirstRow() == _record.getRow()) {
+                    it.remove();
+                    return;
+                }
+            }
+        }
+    }
+
     /**
      * Only valid for formula cells
      * @return one of ({@link #CELL_TYPE_NUMERIC}, {@link #CELL_TYPE_STRING},
index 528fa2730cb263ef8c7a68a23170b40782823f83..daf289f485439ef806914ec5c4ed29b1f6aff726 100644 (file)
@@ -380,6 +380,11 @@ public interface Cell {
      */
     void setHyperlink(Hyperlink link);
 
+    /**
+     * Removes the hyperlink for this cell, if there is one.
+     */
+    void removeHyperlink();
+
     /**
      * Only valid for array formula cells
      *
index 125dfac254574d360c230e2780e1166839acd0ef..f590cc01a2214c92c4c8e8f44ecf512831b37a32 100644 (file)
@@ -572,12 +572,18 @@ public class SXSSFCell implements Cell
     }
 
     /**
-     * Assign a hyperlink to this cell
+     * Assign a hyperlink to this cell. If the supplied hyperlink is null, the
+     * hyperlink for this cell will be removed.
      *
      * @param link hyperlink associated with this cell
      */
     public void setHyperlink(Hyperlink link)
     {
+        if (link == null) {
+            removeHyperlink();
+            return;
+        }
+
         setProperty(Property.HYPERLINK,link);
 
         XSSFHyperlink xssfobj = (XSSFHyperlink)link;
@@ -590,6 +596,16 @@ public class SXSSFCell implements Cell
 
     }
 
+    /**
+     * Removes the hyperlink for this cell, if there is one.
+     */
+    public void removeHyperlink()
+    {
+        removeProperty(Property.HYPERLINK);
+
+        ((SXSSFSheet) getSheet())._sh.removeHyperlink(getRowIndex(), getColumnIndex());
+    }
+
     /**
      * Only valid for array formula cells
      *
index e12e3e1b752218abfa0de752cbb6867ae3ab1de6..04a91b6240c34cf686d8bb8ae6c85a084fc9d5cc 100644 (file)
@@ -947,12 +947,18 @@ public final class XSSFCell implements Cell {
     }
 
     /**
-     * Assign a hyperlink to this cell
+     * Assign a hyperlink to this cell. If the supplied hyperlink is null, the
+     * hyperlink for this cell will be removed.
      *
      * @param hyperlink the hyperlink to associate with this cell
      */
     @Override
     public void setHyperlink(Hyperlink hyperlink) {
+        if (hyperlink == null) {
+            removeHyperlink();
+            return;
+        }
+
         XSSFHyperlink link = (XSSFHyperlink)hyperlink;
 
         // Assign to us
@@ -962,6 +968,14 @@ public final class XSSFCell implements Cell {
         getSheet().addHyperlink(link);
     }
 
+    /**
+     * Removes the hyperlink for this cell, if there is one.
+     */
+    @Override
+    public void removeHyperlink() {
+        getSheet().removeHyperlink(_row.getRowNum(), _cellNum);
+    }
+
     /**
      * Returns the xml bean containing information about the cell's location (reference), value,
      * data type, formatting, and formula
index e625d83963d1524913e8c2dc6d347d44bc60d582..ac72c768032f4d81c7b7d9ac3684b45a5864e3f9 100644 (file)
@@ -2742,6 +2742,24 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
         hyperlinks.add(hyperlink);
     }
 
+    /**
+     * Removes a hyperlink in the collection of hyperlinks on this sheet
+     *
+     * @param row row index
+     * @param column column index
+     */
+    @Internal
+    public void removeHyperlink(int row, int column) {
+        String ref = new CellReference(row, column).formatAsString();
+        for (Iterator<XSSFHyperlink> it = hyperlinks.iterator(); it.hasNext();) {
+            XSSFHyperlink hyperlink = it.next();
+            if (hyperlink.getCellRef().equals(ref)) {
+                it.remove();
+                return;
+            }
+        }
+    }
+
     /**
      * Return location of the active cell, e.g. <code>A1</code>.
      *
index a73e952c8fa61a803123519482d64189a19dee8f..754f7e2a85c01c2a6a502a227652d58e4d2a935c 100644 (file)
@@ -25,6 +25,8 @@ import javax.xml.namespace.QName;
 
 import org.apache.poi.ss.usermodel.BaseTestCell;
 import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CreationHelper;
+import org.apache.poi.ss.usermodel.Hyperlink;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
@@ -168,4 +170,27 @@ public class TestSXSSFCell extends BaseTestCell {
         assertEquals("some", wb.getSheetAt(0).getRow(0).getCell(0).getStringCellValue());
         assertEquals("24", wb.getSheetAt(0).getRow(0).getCell(1).getStringCellValue());
     }
+
+    public void testRemoveHyperlink(){
+        Workbook wb = _testDataProvider.createWorkbook();
+        Sheet sh = wb.createSheet("test");
+        Row row = sh.createRow(0);
+        CreationHelper helper = wb.getCreationHelper();
+
+        Cell cell1 = row.createCell(1);
+        Hyperlink link1 = helper.createHyperlink(Hyperlink.LINK_URL);
+        cell1.setHyperlink(link1);
+        assertNotNull(cell1.getHyperlink());
+        cell1.removeHyperlink();
+        assertNull(cell1.getHyperlink());
+
+        Cell cell2 = row.createCell(0);
+        Hyperlink link2 = helper.createHyperlink(Hyperlink.LINK_URL);
+        cell2.setHyperlink(link2);
+        assertNotNull(cell2.getHyperlink());
+        cell2.setHyperlink(null);
+        assertNull(cell2.getHyperlink());
+
+        _testDataProvider.writeOutAndReadBack(wb);
+    }
 }
index 6d91fcd889a31d0c25bc366f3e9585b80aa64595..967214380f25680e3124182d00fd8780e1264bf8 100644 (file)
@@ -22,6 +22,7 @@ import java.io.IOException;
 import org.apache.poi.ss.usermodel.BaseTestCell;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.DataFormatter;
+import org.apache.poi.ss.usermodel.Hyperlink;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
@@ -371,5 +372,26 @@ public final class TestXSSFCell extends BaseTestCell {
             cell.toString();
         }
     }    
-    
+
+    public void testRemoveHyperlink() {
+        final Workbook wb = new XSSFWorkbook();
+        final Sheet sheet = wb.createSheet();
+        Row row = sheet.createRow(0);
+
+        Cell cell1 = row.createCell(1);
+        Hyperlink link1 = new XSSFHyperlink(Hyperlink.LINK_URL);
+        cell1.setHyperlink(link1);
+        assertNotNull(cell1.getHyperlink());
+        cell1.removeHyperlink();
+        assertNull(cell1.getHyperlink());
+
+        Cell cell2 = row.createCell(0);
+        Hyperlink link2 = new XSSFHyperlink(Hyperlink.LINK_URL);
+        cell2.setHyperlink(link2);
+        assertNotNull(cell2.getHyperlink());
+        cell2.setHyperlink(null);
+        assertNull(cell2.getHyperlink());
+
+        XSSFTestDataSamples.writeOutAndReadBack(wb);
+    }
 }
index 078042970f8361dcb4b53e7c212b1041df985faa..31a1d972a40bb5a0ba5940b1c25c818ee131631f 100644 (file)
@@ -34,6 +34,7 @@ import org.apache.poi.ss.SpreadsheetVersion;
 import org.apache.poi.ss.usermodel.BaseTestCell;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.ErrorConstants;
+import org.apache.poi.ss.usermodel.Hyperlink;
 import org.apache.poi.ss.usermodel.RichTextString;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
@@ -253,6 +254,26 @@ public final class TestHSSFCell extends BaseTestCell {
                assertEquals(1, link2.getFirstColumn());
        }
 
+    public void testRemoveHyperlink() {
+        HSSFWorkbook wb = new HSSFWorkbook();
+        HSSFSheet sheet = wb.createSheet();
+        HSSFRow row = sheet.createRow(0);
+
+        HSSFCell cell1 = row.createCell(1);
+        HSSFHyperlink link1 = new HSSFHyperlink(Hyperlink.LINK_URL);
+        assertNotNull(link1);
+        cell1.removeHyperlink();
+        assertNull(cell1.getHyperlink());
+
+        HSSFCell cell2 = row.createCell(0);
+        HSSFHyperlink link2 = new HSSFHyperlink(Hyperlink.LINK_URL);
+        assertNotNull(link2);
+        cell2.setHyperlink(null);
+        assertNull(cell2.getHyperlink());
+
+        HSSFTestDataSamples.writeOutAndReadBack(wb);
+    }
+
        /**
         * Test to ensure we can only assign cell styles that belong
         *  to our workbook, and not those from other workbooks.