diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java b/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java index c66cdd3d13..e5de299a04 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java @@ -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 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}, diff --git a/src/java/org/apache/poi/ss/usermodel/Cell.java b/src/java/org/apache/poi/ss/usermodel/Cell.java index 528fa2730c..daf289f485 100644 --- a/src/java/org/apache/poi/ss/usermodel/Cell.java +++ b/src/java/org/apache/poi/ss/usermodel/Cell.java @@ -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 * diff --git a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java index 125dfac254..f590cc01a2 100644 --- a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java +++ b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java @@ -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 * diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java index e12e3e1b75..04a91b6240 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java @@ -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 diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java index e625d83963..ac72c76803 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java @@ -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 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. A1. * diff --git a/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFCell.java b/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFCell.java index a73e952c8f..754f7e2a85 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFCell.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFCell.java @@ -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); + } } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java index 6d91fcd889..967214380f 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java @@ -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); + } } diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java index 078042970f..31a1d972a4 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java @@ -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.