aboutsummaryrefslogtreecommitdiffstats
path: root/src/testcases/org/apache
diff options
context:
space:
mode:
authorYegor Kozlov <yegor@apache.org>2008-02-07 08:56:59 +0000
committerYegor Kozlov <yegor@apache.org>2008-02-07 08:56:59 +0000
commit4ab00acc7cf8a56a22153c84ec203707cd413846 (patch)
tree8c66941a9e915ba84f89505ba945c7d4ff110403 /src/testcases/org/apache
parent766dc98ce36338acc4ad9c21d931c0843994ee40 (diff)
downloadpoi-4ab00acc7cf8a56a22153c84ec203707cd413846.tar.gz
poi-4ab00acc7cf8a56a22153c84ec203707cd413846.zip
support for excel hypelrinks
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@619310 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/testcases/org/apache')
-rw-r--r--src/testcases/org/apache/poi/hssf/record/TestHyperlinkRecord.java407
-rw-r--r--src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java14
-rwxr-xr-xsrc/testcases/org/apache/poi/hssf/usermodel/TestHSSFHyperlink.java191
3 files changed, 500 insertions, 112 deletions
diff --git a/src/testcases/org/apache/poi/hssf/record/TestHyperlinkRecord.java b/src/testcases/org/apache/poi/hssf/record/TestHyperlinkRecord.java
index 70548fe95f..3d2ca406ce 100644
--- a/src/testcases/org/apache/poi/hssf/record/TestHyperlinkRecord.java
+++ b/src/testcases/org/apache/poi/hssf/record/TestHyperlinkRecord.java
@@ -18,114 +18,311 @@ package org.apache.poi.hssf.record;
import java.io.ByteArrayInputStream;
import java.net.URL;
+import java.util.Arrays;
import junit.framework.TestCase;
+/**
+ * Test HyperlinkRecord
+ *
+ * @author Nick Burch
+ * @author Yegor Kozlov
+ */
public class TestHyperlinkRecord extends TestCase {
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- private byte[] data = new byte[] {
- -72, 1, 110, 0,
- // ??, Row, col, xf
- 6, 0, 3, 0, 2, 0, 2, 0,
-
- // ??
- -48, -55, -22, 121, -7, -70, -50, 17,
- -116, -126, 0, -86, 0, 75, -87, 11,
- 2, 0, 0, 0,
-
- // URL length
- 23, 0, 0, 0,
-
- // Label length
- 4, 0, 0, 0,
-
- // Label
- 76, 0, 44, 0, 65, 0, 0, 0,
-
- // ??
- -32, -55, -22, 121, -7, -70, -50, 17,
- -116, -126, 0, -86, 0, 75, -87, 11,
- 46, 0, 0, 0,
-
- // URL
- 104, 0, 116, 0, 116, 0, 112, 0, 58, 0, 47, 0, 47, 0, 119,
- 0, 119, 0, 119, 0, 46, 0, 108, 0, 97, 0, 107, 0, 105,
- 0, 110, 0, 103, 0, 115, 0, 46, 0, 99, 0, 111, 0,
- 109, 0,
- 0, 0 };
-
- private byte[] data2 = new byte[] {
- -72, 1, -126, 0,
- // ??, Row, col, xf
- 2, 0, 2, 0, 4, 0, 4, 0,
-
- // ??
- -48, -55, -22, 121, -7, -70, -50, 17,
- -116, -126, 0, -86, 0, 75, -87, 11,
- 2, 0, 0, 0,
-
- // URL and Label lengths
- 23, 0, 0, 0,
- 15, 0, 0, 0,
-
- // Label
- 83, 0, 116, 0, 97, 0, 99, 0, 105, 0,
- 101, 0, 64, 0, 65, 0, 66, 0, 67, 0,
- 46, 0, 99, 0, 111, 0, 109, 0, 0, 0,
-
- // ??
- -32, -55, -22, 121, -7, -70, -50, 17,
- -116, -126, 0, -86, 0, 75, -87, 11,
- 44, 0, 0, 0,
-
- // URL
- 109, 0, 97, 0, 105, 0, 108, 0, 116, 0,
- 111, 0, 58, 0, 83, 0, 116, 0, 97, 0,
- 99, 0, 105, 0, 101, 0, 64, 0, 65, 0,
- 66, 0, 67, 0, 46, 0, 99, 0, 111, 0,
- 109, 0, 0, 0 };
-
- public void testRecordParsing() throws Exception {
- RecordInputStream inp = new RecordInputStream(
- new ByteArrayInputStream(data)
- );
- inp.nextRecord();
-
- HyperlinkRecord r = new HyperlinkRecord(inp);
-
- assertEquals(3, r.getRow());
- assertEquals(2, r.getColumn());
- assertEquals(2, r.getXFIndex());
-
- assertEquals("L,A", r.getLabel());
- assertEquals("http://www.lakings.com", r.getUrlString());
- assertEquals(new URL("http://www.lakings.com"), r.getUrl());
-
- // Check it serialises as expected
- assertEquals(data.length, r.getRecordSize());
- byte[] d = r.serialize();
- assertEquals(data.length, d.length);
- for(int i=0; i<data.length; i++) {
- assertEquals(data[i], d[i]);
+
+ //link to http://www.lakings.com/
+ byte[] data1 = { 0x02, 0x00, //First row of the hyperlink
+ 0x02, 0x00, //Last row of the hyperlink
+ 0x00, 0x00, //First column of the hyperlink
+ 0x00, 0x00, //Last column of the hyperlink
+
+ //16-byte GUID. Seems to be always the same. Does not depend on the hyperlink type
+ (byte)0xD0, (byte)0xC9, (byte)0xEA, 0x79, (byte)0xF9, (byte)0xBA, (byte)0xCE, 0x11,
+ (byte)0x8C, (byte)0x82, 0x00, (byte)0xAA, 0x00, 0x4B, (byte)0xA9, 0x0B,
+
+ 0x02, 0x00, 0x00, 0x00, //integer, always 2
+
+ // flags. Define the type of the hyperlink:
+ // HyperlinkRecord.HLINK_URL | HyperlinkRecord.HLINK_ABS | HyperlinkRecord.HLINK_LABEL
+ 0x17, 0x00, 0x00, 0x00,
+
+ 0x08, 0x00, 0x00, 0x00, //length of the label including the trailing '\0'
+
+ //label:
+ 0x4D, 0x00, 0x79, 0x00, 0x20, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x6B, 0x00, 0x00, 0x00,
+
+ //16-byte link moniker: HyperlinkRecord.URL_MONIKER
+ (byte)0xE0, (byte)0xC9, (byte)0xEA, 0x79, (byte)0xF9, (byte)0xBA, (byte)0xCE, 0x11,
+ (byte)0x8C, (byte)0x82, 0x00, (byte)0xAA, 0x00, 0x4B, (byte)0xA9, 0x0B,
+
+ //count of bytes in the address including the tail
+ 0x48, 0x00, 0x00, 0x00, //integer
+
+ //the actual link, terminated by '\u0000'
+ 0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3A, 0x00, 0x2F, 0x00,
+ 0x2F, 0x00, 0x77, 0x00, 0x77, 0x00, 0x77, 0x00, 0x2E, 0x00, 0x6C, 0x00,
+ 0x61, 0x00, 0x6B, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x73, 0x00,
+ 0x2E, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x2F, 0x00, 0x00, 0x00,
+
+ //standard 24-byte tail of a URL link. Seems to always be the same for all URL HLINKs
+ 0x79, 0x58, (byte)0x81, (byte)0xF4, 0x3B, 0x1D, 0x7F, 0x48, (byte)0xAF, 0x2C,
+ (byte)0x82, 0x5D, (byte)0xC4, (byte)0x85, 0x27, 0x63, 0x00, 0x00, 0x00,
+ 0x00, (byte)0xA5, (byte)0xAB, 0x00, 0x00};
+
+ //link to a file in the current directory: link1.xls
+ byte[] data2 = {0x00, 0x00,
+ 0x00, 0x00,
+ 0x00, 0x00,
+ 0x00, 0x00,
+ //16-bit GUID. Seems to be always the same. Does not depend on the hyperlink type
+ (byte)0xD0, (byte)0xC9, (byte)0xEA, 0x79, (byte)0xF9, (byte)0xBA, (byte)0xCE, 0x11,
+ (byte)0x8C, (byte)0x82, 0x00, (byte)0xAA, 0x00, 0x4B, (byte)0xA9, 0x0B,
+
+ 0x02, 0x00, 0x00, 0x00, //integer, always 2
+
+ 0x15, 0x00, 0x00, 0x00, //options: HyperlinkRecord.HLINK_URL | HyperlinkRecord.HLINK_LABEL
+
+ 0x05, 0x00, 0x00, 0x00, //length of the label
+ //label
+ 0x66, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00,
+
+ //16-byte link moniker: HyperlinkRecord.FILE_MONIKER
+ 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte)0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46,
+
+ 0x00, 0x00, //level
+ 0x0A, 0x00, 0x00, 0x00, //length of the path )
+
+ //path to the file (plain ISO-8859 bytes, NOT UTF-16LE!)
+ 0x6C, 0x69, 0x6E, 0x6B, 0x31, 0x2E, 0x78, 0x6C, 0x73, 0x00,
+
+ //standard 28-byte tail of a file link
+ (byte)0xFF, (byte)0xFF, (byte)0xAD, (byte)0xDE, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+ // mailto:ebgans@mail.ru?subject=Hello,%20Ebgans!
+ byte[] data3 = {0x01, 0x00,
+ 0x01, 0x00,
+ 0x00, 0x00,
+ 0x00, 0x00,
+
+ //16-bit GUID. Seems to be always the same. Does not depend on the hyperlink type
+ (byte)0xD0, (byte)0xC9, (byte)0xEA, 0x79, (byte)0xF9, (byte)0xBA, (byte)0xCE, 0x11,
+ (byte)0x8C, (byte)0x82, 0x00, (byte)0xAA, 0x00, 0x4B, (byte)0xA9, 0x0B,
+
+ 0x02, 0x00, 0x00, 0x00, //integer, always 2
+
+ 0x17, 0x00, 0x00, 0x00, //options: HyperlinkRecord.HLINK_URL | HyperlinkRecord.HLINK_ABS | HyperlinkRecord.HLINK_LABEL
+
+ 0x06, 0x00, 0x00, 0x00, //length of the label
+ 0x65, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x00, 0x00, //label
+
+ //16-byte link moniker: HyperlinkRecord.URL_MONIKER
+ (byte)0xE0, (byte)0xC9, (byte)0xEA, 0x79, (byte)0xF9, (byte)0xBA, (byte)0xCE, 0x11,
+ (byte)0x8C, (byte)0x82, 0x00, (byte)0xAA, 0x00, 0x4B, (byte)0xA9, 0x0B,
+
+ //length of the address including the tail.
+ 0x76, 0x00, 0x00, 0x00,
+
+ //the address is terminated by '\u0000'
+ 0x6D, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x6F, 0x00,
+ 0x3A, 0x00, 0x65, 0x00, 0x62, 0x00, 0x67, 0x00, 0x61, 0x00, 0x6E, 0x00,
+ 0x73, 0x00, 0x40, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6C, 0x00,
+ 0x2E, 0x00, 0x72, 0x00, 0x75, 0x00, 0x3F, 0x00, 0x73, 0x00, 0x75, 0x00,
+ 0x62, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x3D, 0x00,
+ 0x48, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x2C, 0x00,
+ 0x25, 0x00, 0x32, 0x00, 0x30, 0x00, 0x45, 0x00, 0x62, 0x00, 0x67, 0x00,
+ 0x61, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x21, 0x00, 0x00, 0x00,
+
+ //standard 24-byte tail of a URL link
+ 0x79, 0x58, (byte)0x81, (byte)0xF4, 0x3B, 0x1D, 0x7F, 0x48, (byte)0xAF, (byte)0x2C,
+ (byte)0x82, 0x5D, (byte)0xC4, (byte)0x85, 0x27, 0x63, 0x00, 0x00, 0x00,
+ 0x00, (byte)0xA5, (byte)0xAB, 0x00, 0x00
+ };
+
+ //link to a place in worksheet: Sheet1!A1
+ byte[] data4 = {0x03, 0x00,
+ 0x03, 0x00,
+ 0x00, 0x00,
+ 0x00, 0x00,
+
+ //16-bit GUID. Seems to be always the same. Does not depend on the hyperlink type
+ (byte)0xD0, (byte)0xC9, (byte)0xEA, 0x79, (byte)0xF9, (byte)0xBA, (byte)0xCE, 0x11,
+ (byte)0x8C, (byte)0x82, 0x00, (byte)0xAA, 0x00, 0x4B, (byte)0xA9, 0x0B,
+
+ 0x02, 0x00, 0x00, 0x00, //integer, always 2
+
+ 0x1C, 0x00, 0x00, 0x00, //flags: HyperlinkRecord.HLINK_LABEL | HyperlinkRecord.HLINK_PLACE
+
+ 0x06, 0x00, 0x00, 0x00, //length of the label
+
+ 0x70, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x00, 0x00, //label
+
+ 0x0A, 0x00, 0x00, 0x00, //length of the document link including trailing zero
+
+ //link: Sheet1!A1
+ 0x53, 0x00, 0x68, 0x00, 0x65, 0x00, 0x65, 0x00, 0x74, 0x00, 0x31, 0x00, 0x21,
+ 0x00, 0x41, 0x00, 0x31, 0x00, 0x00, 0x00};
+
+ public void testReadURLLink(){
+ RecordInputStream is = new TestcaseRecordInputStream((short)HyperlinkRecord.sid, (short)data1.length, data1);
+ HyperlinkRecord link = new HyperlinkRecord(is);
+ assertEquals(2, link.getFirstRow());
+ assertEquals(2, link.getLastRow());
+ assertEquals(0, link.getFirstColumn());
+ assertEquals(0, link.getLastColumn());
+ assertTrue(Arrays.equals(HyperlinkRecord.STD_MONIKER, link.getGuid()));
+ assertTrue(Arrays.equals(HyperlinkRecord.URL_MONIKER, link.getMoniker()));
+ assertEquals(2, link.getLabelOptions());
+ int opts = HyperlinkRecord.HLINK_URL | HyperlinkRecord.HLINK_ABS | HyperlinkRecord.HLINK_LABEL;
+ assertEquals(0x17, opts);
+ assertEquals(opts, link.getLinkOptions());
+ assertEquals(0, link.getFileOptions());
+
+ assertEquals("My Link", link.getLabel());
+ assertEquals("http://www.lakings.com/", link.getAddress());
+ }
+
+ public void testReadFileLink(){
+ RecordInputStream is = new TestcaseRecordInputStream((short)HyperlinkRecord.sid, (short)data2.length, data2);
+ HyperlinkRecord link = new HyperlinkRecord(is);
+ assertEquals(0, link.getFirstRow());
+ assertEquals(0, link.getLastRow());
+ assertEquals(0, link.getFirstColumn());
+ assertEquals(0, link.getLastColumn());
+ assertTrue(Arrays.equals(HyperlinkRecord.STD_MONIKER, link.getGuid()));
+ assertTrue(Arrays.equals(HyperlinkRecord.FILE_MONIKER, link.getMoniker()));
+ assertEquals(2, link.getLabelOptions());
+ int opts = HyperlinkRecord.HLINK_URL | HyperlinkRecord.HLINK_LABEL;
+ assertEquals(0x15, opts);
+ assertEquals(opts, link.getLinkOptions());
+
+ assertEquals("file", link.getLabel());
+ assertEquals("link1.xls", link.getAddress());
+ }
+
+ public void testReadEmailLink(){
+ RecordInputStream is = new TestcaseRecordInputStream((short)HyperlinkRecord.sid, (short)data3.length, data3);
+ HyperlinkRecord link = new HyperlinkRecord(is);
+ assertEquals(1, link.getFirstRow());
+ assertEquals(1, link.getLastRow());
+ assertEquals(0, link.getFirstColumn());
+ assertEquals(0, link.getLastColumn());
+ assertTrue(Arrays.equals(HyperlinkRecord.STD_MONIKER, link.getGuid()));
+ assertTrue(Arrays.equals(HyperlinkRecord.URL_MONIKER, link.getMoniker()));
+ assertEquals(2, link.getLabelOptions());
+ int opts = HyperlinkRecord.HLINK_URL | HyperlinkRecord.HLINK_ABS | HyperlinkRecord.HLINK_LABEL;
+ assertEquals(0x17, opts);
+ assertEquals(opts, link.getLinkOptions());
+
+ assertEquals("email", link.getLabel());
+ assertEquals("mailto:ebgans@mail.ru?subject=Hello,%20Ebgans!", link.getAddress());
+ }
+
+ public void testReadDocumentLink(){
+ RecordInputStream is = new TestcaseRecordInputStream((short)HyperlinkRecord.sid, (short)data4.length, data4);
+ HyperlinkRecord link = new HyperlinkRecord(is);
+ assertEquals(3, link.getFirstRow());
+ assertEquals(3, link.getLastRow());
+ assertEquals(0, link.getFirstColumn());
+ assertEquals(0, link.getLastColumn());
+ assertTrue(Arrays.equals(HyperlinkRecord.STD_MONIKER, link.getGuid()));
+ assertEquals(2, link.getLabelOptions());
+ int opts = HyperlinkRecord.HLINK_LABEL | HyperlinkRecord.HLINK_PLACE;
+ assertEquals(0x1C, opts);
+ assertEquals(opts, link.getLinkOptions());
+
+ assertEquals("place", link.getLabel());
+ assertEquals("Sheet1!A1", link.getAddress());
+ }
+
+ private void serialize(byte[] data){
+ RecordInputStream is = new TestcaseRecordInputStream((short)HyperlinkRecord.sid, (short)data.length, data);
+ HyperlinkRecord link = new HyperlinkRecord(is);
+ byte[] bytes1 = link.serialize();
+ is = new RecordInputStream(new ByteArrayInputStream(bytes1));
+ is.nextRecord();
+ link = new HyperlinkRecord(is);
+ byte[] bytes2 = link.serialize();
+ assertEquals(bytes1.length, bytes2.length);
+ assertTrue(Arrays.equals(bytes1, bytes2));
+ }
+
+ public void testSerialize(){
+ serialize(data1);
+ serialize(data2);
+ serialize(data3);
+ serialize(data4);
+ }
+
+ public void testCreateURLRecord() throws Exception {
+ HyperlinkRecord link = new HyperlinkRecord();
+ link.newUrlLink();
+ link.setFirstRow((short)2);
+ link.setLastRow((short)2);
+ link.setLabel("My Link");
+ link.setAddress("http://www.lakings.com/");
+
+ byte[] tmp = link.serialize();
+ byte[] ser = new byte[tmp.length-4];
+ System.arraycopy(tmp, 4, ser, 0, ser.length);
+ assertEquals(data1.length, ser.length);
+ assertTrue(Arrays.equals(data1, ser));
+ }
+
+ public void testCreateFileRecord() throws Exception {
+ HyperlinkRecord link = new HyperlinkRecord();
+ link.newFileLink();
+ link.setFirstRow((short)0);
+ link.setLastRow((short)0);
+ link.setLabel("file");
+ link.setAddress("link1.xls");
+
+ byte[] tmp = link.serialize();
+ byte[] ser = new byte[tmp.length-4];
+ System.arraycopy(tmp, 4, ser, 0, ser.length);
+ assertEquals(data2.length, ser.length);
+ assertTrue(Arrays.equals(data2, ser));
+ }
+
+ public void testCreateDocumentRecord() throws Exception {
+ HyperlinkRecord link = new HyperlinkRecord();
+ link.newDocumentLink();
+ link.setFirstRow((short)3);
+ link.setLastRow((short)3);
+ link.setLabel("place");
+ link.setAddress("Sheet1!A1");
+
+ byte[] tmp = link.serialize();
+ byte[] ser = new byte[tmp.length-4];
+ System.arraycopy(tmp, 4, ser, 0, ser.length);
+ assertEquals(data4.length, ser.length);
+ assertTrue(Arrays.equals(data4, ser));
+ }
+
+ public void testCreateEmailtRecord() throws Exception {
+ HyperlinkRecord link = new HyperlinkRecord();
+ link.newUrlLink();
+ link.setFirstRow((short)1);
+ link.setLastRow((short)1);
+ link.setLabel("email");
+ link.setAddress("mailto:ebgans@mail.ru?subject=Hello,%20Ebgans!");
+
+ byte[] tmp = link.serialize();
+ byte[] ser = new byte[tmp.length-4];
+ System.arraycopy(tmp, 4, ser, 0, ser.length);
+ assertEquals(data3.length, ser.length);
+ assertTrue(Arrays.equals(data3, ser));
+ }
+
+ public void testClone() throws Exception {
+ byte[][] data = {data1, data2, data3, data4};
+ for (int i = 0; i < data.length; i++) {
+ RecordInputStream is = new TestcaseRecordInputStream((short)HyperlinkRecord.sid, (short)data[i].length, data[i]);
+ HyperlinkRecord link = new HyperlinkRecord(is);
+ HyperlinkRecord clone = (HyperlinkRecord)link.clone();
+ assertTrue(Arrays.equals(link.serialize(), clone.serialize()));
}
- }
-
- public void testSecondRecord() throws Exception {
- RecordInputStream inp = new RecordInputStream(
- new ByteArrayInputStream(data2)
- );
- inp.nextRecord();
-
- HyperlinkRecord r = new HyperlinkRecord(inp);
-
- assertEquals(2, r.getRow());
- assertEquals(4, r.getColumn());
- assertEquals(4, r.getXFIndex());
-
- assertEquals("Stacie@ABC.com", r.getLabel());
- assertEquals("mailto:Stacie@ABC.com", r.getUrlString());
- }
+
+ }
}
diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java
index 80785ca182..6c604d1b4d 100644
--- a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java
+++ b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java
@@ -320,8 +320,8 @@ extends TestCase {
assertEquals("Foo", link.getLabel());
assertEquals("http://poi.apache.org/", link.getAddress());
- assertEquals(4, link.getRow());
- assertEquals(0, link.getColumn());
+ assertEquals(4, link.getFirstRow());
+ assertEquals(0, link.getFirstColumn());
}
/**
@@ -339,16 +339,16 @@ extends TestCase {
assertNotNull(link1);
assertEquals("Foo", link1.getLabel());
assertEquals("http://poi.apache.org/", link1.getAddress());
- assertEquals(4, link1.getRow());
- assertEquals(0, link1.getColumn());
+ assertEquals(4, link1.getFirstRow());
+ assertEquals(0, link1.getFirstColumn());
HSSFCell cell2 = sheet.getRow(8).getCell((short)1);
HSSFHyperlink link2 = cell2.getHyperlink();
assertNotNull(link2);
assertEquals("Bar", link2.getLabel());
- assertEquals("http://poi.apache.org/", link2.getAddress());
- assertEquals(8, link2.getRow());
- assertEquals(1, link2.getColumn());
+ assertEquals("http://poi.apache.org/hssf/", link2.getAddress());
+ assertEquals(8, link2.getFirstRow());
+ assertEquals(1, link2.getFirstColumn());
}
diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFHyperlink.java b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFHyperlink.java
new file mode 100755
index 0000000000..b87899c343
--- /dev/null
+++ b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFHyperlink.java
@@ -0,0 +1,191 @@
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+package org.apache.poi.hssf.usermodel;
+
+import junit.framework.TestCase;
+
+import java.io.*;
+
+/**
+ * Tests HSSFHyperlink.
+ *
+ * @author Yegor Kozlov
+ */
+public class TestHSSFHyperlink extends TestCase {
+ protected String cwd = System.getProperty("HSSF.testdata.path");
+
+ /**
+ * Test that we can read hyperlinks.
+ */
+ public void testRead() throws Exception {
+
+ FileInputStream is = new FileInputStream(new File(cwd, "HyperlinksOnManySheets.xls"));
+ HSSFWorkbook wb = new HSSFWorkbook(is);
+ is.close();
+
+ HSSFSheet sheet;
+ HSSFCell cell;
+ HSSFHyperlink link;
+
+ sheet = wb.getSheet("WebLinks");
+ cell = sheet.getRow(4).getCell((short)0);
+ link = cell.getHyperlink();
+ assertNotNull(link);
+ assertEquals("POI", link.getLabel());
+ assertEquals("POI", cell.getRichStringCellValue().getString());
+ assertEquals("http://poi.apache.org/", link.getAddress());
+
+ cell = sheet.getRow(8).getCell((short)0);
+ link = cell.getHyperlink();
+ assertNotNull(link);
+ assertEquals("HSSF", link.getLabel());
+ assertEquals("HSSF", cell.getRichStringCellValue().getString());
+ assertEquals("http://poi.apache.org/hssf/", link.getAddress());
+
+ sheet = wb.getSheet("Emails");
+ cell = sheet.getRow(4).getCell((short)0);
+ link = cell.getHyperlink();
+ assertNotNull(link);
+ assertEquals("dev", link.getLabel());
+ assertEquals("dev", cell.getRichStringCellValue().getString());
+ assertEquals("mailto:dev@poi.apache.org", link.getAddress());
+
+ sheet = wb.getSheet("Internal");
+ cell = sheet.getRow(4).getCell((short)0);
+ link = cell.getHyperlink();
+ assertNotNull(link);
+ assertEquals("Link To First Sheet", link.getLabel());
+ assertEquals("Link To First Sheet", cell.getRichStringCellValue().getString());
+ assertEquals("WebLinks!A1", link.getAddress());
+ }
+
+ public void testModify() throws Exception {
+ FileInputStream is = new FileInputStream(new File(cwd, "HyperlinksOnManySheets.xls"));
+ HSSFWorkbook wb = new HSSFWorkbook(is);
+ is.close();
+
+ HSSFSheet sheet;
+ HSSFCell cell;
+ HSSFHyperlink link;
+
+ sheet = wb.getSheet("WebLinks");
+ cell = sheet.getRow(4).getCell((short)0);
+ link = cell.getHyperlink();
+ //modify the link
+ link.setAddress("www.apache.org");
+
+ //serialize and read again
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ wb.write(out);
+
+ wb = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray()));
+ sheet = wb.getSheet("WebLinks");
+ cell = sheet.getRow(4).getCell((short)0);
+ link = cell.getHyperlink();
+ assertNotNull(link);
+ assertEquals("www.apache.org", link.getAddress());
+
+ }
+
+ public void testCreate() throws Exception {
+ HSSFWorkbook wb = new HSSFWorkbook();
+
+ HSSFCell cell;
+ HSSFSheet sheet = wb.createSheet("Hyperlinks");
+
+ //URL
+ cell = sheet.createRow(0).createCell((short)0);
+ cell.setCellValue("URL Link");
+ HSSFHyperlink link = new HSSFHyperlink(HSSFHyperlink.LINK_URL);
+ link.setAddress("http://poi.apache.org/");
+ cell.setHyperlink(link);
+
+ //link to a file in the current directory
+ cell = sheet.createRow(1).createCell((short)0);
+ cell.setCellValue("File Link");
+ link = new HSSFHyperlink(HSSFHyperlink.LINK_FILE);
+ link.setAddress("link1.xls");
+ cell.setHyperlink(link);
+
+ //e-mail link
+ cell = sheet.createRow(2).createCell((short)0);
+ cell.setCellValue("Email Link");
+ link = new HSSFHyperlink(HSSFHyperlink.LINK_EMAIL);
+ //note, if subject contains white spaces, make sure they are url-encoded
+ link.setAddress("mailto:poi@apache.org?subject=Hyperlinks");
+ cell.setHyperlink(link);
+
+ //link to a place in this workbook
+
+ //create a target sheet and cell
+ HSSFSheet sheet2 = wb.createSheet("Target Sheet");
+ sheet2.createRow(0).createCell((short)0).setCellValue("Target Cell");
+
+ cell = sheet.createRow(3).createCell((short)0);
+ cell.setCellValue("Worksheet Link");
+ link = new HSSFHyperlink(HSSFHyperlink.LINK_DOCUMENT);
+ link.setAddress("'Target Sheet'!A1");
+ cell.setHyperlink(link);
+
+ //serialize and read again
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ wb.write(out);
+
+ wb = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray()));
+ sheet = wb.getSheet("Hyperlinks");
+ cell = sheet.getRow(0).getCell((short)0);
+ link = cell.getHyperlink();
+ assertNotNull(link);
+ assertEquals("http://poi.apache.org/", link.getAddress());
+
+ cell = sheet.getRow(1).getCell((short)0);
+ link = cell.getHyperlink();
+ assertNotNull(link);
+ assertEquals("link1.xls", link.getAddress());
+
+ cell = sheet.getRow(2).getCell((short)0);
+ link = cell.getHyperlink();
+ assertNotNull(link);
+ assertEquals("mailto:poi@apache.org?subject=Hyperlinks", link.getAddress());
+
+ cell = sheet.getRow(3).getCell((short)0);
+ link = cell.getHyperlink();
+ assertNotNull(link);
+ assertEquals("'Target Sheet'!A1", link.getAddress());
+ }
+
+ public void testCloneSheet() throws Exception {
+ FileInputStream is = new FileInputStream(new File(cwd, "HyperlinksOnManySheets.xls"));
+ HSSFWorkbook wb = new HSSFWorkbook(is);
+ is.close();
+
+ HSSFCell cell;
+ HSSFHyperlink link;
+
+ HSSFSheet sheet = wb.cloneSheet(0);
+
+ cell = sheet.getRow(4).getCell((short)0);
+ link = cell.getHyperlink();
+ assertNotNull(link);
+ assertEquals("http://poi.apache.org/", link.getAddress());
+
+ cell = sheet.getRow(8).getCell((short)0);
+ link = cell.getHyperlink();
+ assertNotNull(link);
+ assertEquals("http://poi.apache.org/hssf/", link.getAddress());
+ }
+}