diff options
author | Nick Burch <nick@apache.org> | 2014-11-08 13:46:30 +0000 |
---|---|---|
committer | Nick Burch <nick@apache.org> | 2014-11-08 13:46:30 +0000 |
commit | 9b9b4b8cf47ee1af88c37250a9905fa8b70502a4 (patch) | |
tree | 21fd62d57a442c0c245b1b72e9224a12c6643ea6 /src | |
parent | efb42dc897d53e1e93cc5d15dbc853ebaf603f6c (diff) | |
download | poi-9b9b4b8cf47ee1af88c37250a9905fa8b70502a4.tar.gz poi-9b9b4b8cf47ee1af88c37250a9905fa8b70502a4.zip |
Patch from hishidama to add Cell.removeHyperlink(). This closes #13 from github
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1637562 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src')
8 files changed, 148 insertions, 4 deletions
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<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}, 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 @@ -381,6 +381,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 * * @return range of the array formula group that the cell belongs to. 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; @@ -591,6 +597,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 * * @return range of the array formula group that the cell belongs to. 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 @@ -963,6 +969,14 @@ public final class XSSFCell implements Cell { } /** + * 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 @@ -2743,6 +2743,24 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { } /** + * 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>. * * @return the location of the active cell. 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. |