diff options
author | Yegor Kozlov <yegor@apache.org> | 2008-02-07 08:56:59 +0000 |
---|---|---|
committer | Yegor Kozlov <yegor@apache.org> | 2008-02-07 08:56:59 +0000 |
commit | 4ab00acc7cf8a56a22153c84ec203707cd413846 (patch) | |
tree | 8c66941a9e915ba84f89505ba945c7d4ff110403 /src/testcases/org/apache | |
parent | 766dc98ce36338acc4ad9c21d931c0843994ee40 (diff) | |
download | poi-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')
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());
+ }
+}
|