diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index d2367da52..d2d7aebf8 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 52716 - tolerate hyperlinks that have neither location nor relation 52599 - avoid duplicate text when rendering slides in HSLF 52598 - respect slide background when rendering slides in HSLF 51731 - fixed painting shape outlines in HSLF diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFHyperlink.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFHyperlink.java index 2fd47d9d4..84a9ea51d 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFHyperlink.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFHyperlink.java @@ -68,23 +68,27 @@ public class XSSFHyperlink implements Hyperlink { // the relation to see how if (_externalRel == null) { if (ctHyperlink.getId() != null) { - throw new IllegalStateException("The hyperlink for cell " + ctHyperlink.getRef() + " references relation " + ctHyperlink.getId() + ", but that didn't exist!"); + throw new IllegalStateException("The hyperlink for cell " + ctHyperlink.getRef() + + " references relation " + ctHyperlink.getId() + ", but that didn't exist!"); } - throw new IllegalStateException("A sheet hyperlink must either have a location, or a relationship. Found:\n" + ctHyperlink); - } - - URI target = _externalRel.getTargetURI(); - _location = target.toString(); - - // Try to figure out the type - if (_location.startsWith("http://") || _location.startsWith("https://") - || _location.startsWith("ftp://")) { - _type = Hyperlink.LINK_URL; - } else if (_location.startsWith("mailto:")) { - _type = Hyperlink.LINK_EMAIL; + // hyperlink is internal and is not related to other parts + _type = Hyperlink.LINK_DOCUMENT; } else { - _type = Hyperlink.LINK_FILE; + URI target = _externalRel.getTargetURI(); + _location = target.toString(); + + // Try to figure out the type + if (_location.startsWith("http://") || _location.startsWith("https://") + || _location.startsWith("ftp://")) { + _type = Hyperlink.LINK_URL; + } else if (_location.startsWith("mailto:")) { + _type = Hyperlink.LINK_EMAIL; + } else { + _type = Hyperlink.LINK_FILE; + } } + + } } @@ -306,4 +310,18 @@ public class XSSFHyperlink implements Hyperlink { public void setLastRow(int row) { setFirstRow(row); } + + /** + * @return additional text to help the user understand more about the hyperlink + */ + public String getTooltip() { + return _ctHyperlink.getTooltip(); + } + + /** + * @param text additional text to help the user understand more about the hyperlink + */ + public void setTooltip(String text) { + _ctHyperlink.setTooltip(text); + } } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHyperlink.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHyperlink.java index 49f79365f..0358133a2 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHyperlink.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHyperlink.java @@ -189,4 +189,24 @@ public final class TestXSSFHyperlink extends BaseTestHyperlink { assertEquals("mailto:dev@poi.apache.org?subject=XSSF%20Hyperlinks", sheet.getRow(16).getCell(2).getHyperlink().getAddress()); } + + public void test52716() { + XSSFWorkbook wb1 = XSSFTestDataSamples.openSampleWorkbook("52716.xlsx"); + XSSFSheet sh1 = wb1.getSheetAt(0); + + XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(wb1); + XSSFSheet sh2 = wb2.getSheetAt(0); + + assertEquals(sh1.getNumberOfComments(), sh2.getNumberOfComments()); + XSSFHyperlink l1 = sh1.getHyperlink(0, 1); + assertEquals(XSSFHyperlink.LINK_DOCUMENT, l1.getType()); + assertEquals("B1", l1.getCellRef()); + assertEquals("Sort on Titel", l1.getTooltip()); + + XSSFHyperlink l2 = sh2.getHyperlink(0, 1); + assertEquals(l1.getTooltip(), l2.getTooltip()); + assertEquals(XSSFHyperlink.LINK_DOCUMENT, l2.getType()); + assertEquals("B1", l2.getCellRef()); + } + } diff --git a/test-data/spreadsheet/52716.xlsx b/test-data/spreadsheet/52716.xlsx new file mode 100644 index 000000000..ba4f120c7 Binary files /dev/null and b/test-data/spreadsheet/52716.xlsx differ