diff options
author | Dominik Stadler <centic@apache.org> | 2025-01-11 09:23:23 +0000 |
---|---|---|
committer | Dominik Stadler <centic@apache.org> | 2025-01-11 09:23:23 +0000 |
commit | 4f21f5280a8cefd0e04440498dc813a850f6669f (patch) | |
tree | 5d24183cd601fd0023b096409feeb677f3247a87 | |
parent | 3aad12021af40a6c46f5c2773ed2ab5c2f386e07 (diff) | |
download | poi-4f21f5280a8cefd0e04440498dc813a850f6669f.tar.gz poi-4f21f5280a8cefd0e04440498dc813a850f6669f.zip |
Bug 69265: Add test which verifies that Hyperlink Type "Email" is not supported for HSSF
Also update JavaDoc slightly to describe
the special handling of HyperlinkType.EMAIL
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1923050 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | poi/src/main/java/org/apache/poi/common/usermodel/HyperlinkType.java | 15 | ||||
-rw-r--r-- | poi/src/test/java/org/apache/poi/ss/usermodel/BaseTestHyperlink.java | 117 |
2 files changed, 126 insertions, 6 deletions
diff --git a/poi/src/main/java/org/apache/poi/common/usermodel/HyperlinkType.java b/poi/src/main/java/org/apache/poi/common/usermodel/HyperlinkType.java index 6152a85e45..d38fa16c88 100644 --- a/poi/src/main/java/org/apache/poi/common/usermodel/HyperlinkType.java +++ b/poi/src/main/java/org/apache/poi/common/usermodel/HyperlinkType.java @@ -25,7 +25,7 @@ public enum HyperlinkType { /** Not a hyperlink */ @Internal NONE(-1), - + /** * Link to an existing file or web page */ @@ -37,7 +37,10 @@ public enum HyperlinkType { DOCUMENT(2), /** - * Link to an E-mail address + * Link to an E-mail address. + * + * Please note that this currently only works if the address in the hyperlink + * uses the prefix "mailto:" as the binary formats do not persis this type. */ EMAIL(3), @@ -45,13 +48,13 @@ public enum HyperlinkType { * Link to a file */ FILE(4); - - + + /** @deprecated POI 3.15 beta 3 */ @Internal(since="3.15 beta 3") @Deprecated private final int code; - + /** * The codes don't have any real meaning. * They are bytes that are read in and written out from HSSF, HSLF, XSSF, and XSLF are different @@ -66,7 +69,7 @@ public enum HyperlinkType { HyperlinkType(int code) { this.code = code; } - + /** * @deprecated POI 3.15 beta 3 * diff --git a/poi/src/test/java/org/apache/poi/ss/usermodel/BaseTestHyperlink.java b/poi/src/test/java/org/apache/poi/ss/usermodel/BaseTestHyperlink.java index e5ef5312d9..76f11890c0 100644 --- a/poi/src/test/java/org/apache/poi/ss/usermodel/BaseTestHyperlink.java +++ b/poi/src/test/java/org/apache/poi/ss/usermodel/BaseTestHyperlink.java @@ -21,11 +21,14 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotSame; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; import org.apache.poi.common.usermodel.HyperlinkType; import org.apache.poi.ss.ITestDataProvider; +import org.apache.poi.ss.SpreadsheetVersion; import org.junit.jupiter.api.Test; /** @@ -142,5 +145,119 @@ public abstract class BaseTestHyperlink { wb.close(); } + @Test + void testHyperlinkEmailType69265_https() throws IOException { + boolean isHSSF = _testDataProvider.getSpreadsheetVersion() == SpreadsheetVersion.EXCEL97; + + try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { + try (Workbook workbook = _testDataProvider.createWorkbook()) { + Sheet sheet = workbook.createSheet("Hyperlink Example"); + + Row row = sheet.createRow(0); + Cell cell = row.createCell(0); + + // Create a hyperlink + CreationHelper createHelper = workbook.getCreationHelper(); + Hyperlink hyperlink = createHelper.createHyperlink(HyperlinkType.EMAIL); + hyperlink.setLabel("mylabel"); + hyperlink.setAddress("https://www.example.com"); + + // Set the label and the hyperlink + cell.setCellValue("Click here"); + cell.setHyperlink(hyperlink); + + // Get the cell value and hyperlink address + assertEquals("Click here", cell.getStringCellValue()); + Hyperlink cellHyperlink = cell.getHyperlink(); + assertEquals("https://www.example.com", cellHyperlink.getAddress()); + + // HSSF does not support Email, thus falls back to URL, HSSF also uses a hardcoded "label" + assertEquals( + isHSSF ? HyperlinkType.URL : HyperlinkType.EMAIL, + cellHyperlink.getType()); + assertEquals( + isHSSF ? "url" : "mylabel", + cellHyperlink.getLabel()); + + workbook.write(out); + } + + out.flush(); + + try (Workbook wbBack = WorkbookFactory.create(new ByteArrayInputStream(out.toByteArray()))) { + Sheet sheet = wbBack.getSheet("Hyperlink Example"); + Row row = sheet.getRow(0); + Cell cell = row.getCell(0); + + Hyperlink hyperlink = cell.getHyperlink(); + + // when not using "mailto:", it is reverted back to URL currently + assertEquals( + HyperlinkType.URL, + hyperlink.getType()); + assertEquals( + isHSSF ? "url" : "mylabel", + hyperlink.getLabel()); + } + } + } + + @Test + void testHyperlinkEmailType69265_mailto() throws IOException { + boolean isHSSF = _testDataProvider.getSpreadsheetVersion() == SpreadsheetVersion.EXCEL97; + + try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { + try (Workbook workbook = _testDataProvider.createWorkbook()) { + Sheet sheet = workbook.createSheet("Hyperlink Example"); + + Row row = sheet.createRow(0); + Cell cell = row.createCell(0); + + // Create a hyperlink + CreationHelper createHelper = workbook.getCreationHelper(); + Hyperlink hyperlink = createHelper.createHyperlink(HyperlinkType.EMAIL); + hyperlink.setLabel("mylabel"); + hyperlink.setAddress("mailto://www.example.com"); + + // Set the label and the hyperlink + cell.setCellValue("Click here"); + cell.setHyperlink(hyperlink); + + // Get the cell value and hyperlink address + assertEquals("Click here", cell.getStringCellValue()); + Hyperlink cellHyperlink = cell.getHyperlink(); + assertEquals("mailto://www.example.com", cellHyperlink.getAddress()); + + // "mailto:" is converted to type "EMAIL" + assertEquals( + HyperlinkType.EMAIL, + cellHyperlink.getType()); + assertEquals( + isHSSF ? "url" : "mylabel", + cellHyperlink.getLabel()); + + workbook.write(out); + } + + out.flush(); + + try (Workbook wbBack = WorkbookFactory.create(new ByteArrayInputStream(out.toByteArray()))) { + Sheet sheet = wbBack.getSheet("Hyperlink Example"); + Row row = sheet.getRow(0); + Cell cell = row.getCell(0); + + Hyperlink hyperlink = cell.getHyperlink(); + + // "mailto:" is converted to type "EMAIL" + assertEquals( + HyperlinkType.EMAIL, + hyperlink.getType()); + assertEquals( + isHSSF ? "url" : "mylabel", + hyperlink.getLabel()); + } + } + } + public abstract Hyperlink copyHyperlink(Hyperlink link); } |