<changes>
<release version="3.5-beta7" date="2009-??-??">
+ <action dev="POI-DEVELOPERS" type="fix">47375 - Fixed HSSFHyperlink to correctly set inter-sheet and file links</action>
<action dev="POI-DEVELOPERS" type="fix">47384 - Fixed ExternalNameRecord to handle unicode names</action>
<action dev="POI-DEVELOPERS" type="fix">47372 - Fixed locale-sensitive unit tests to pass when running on non-US locale</action>
</release>
@Override
public boolean equals(Object obj) {
GUID other = (GUID) obj;
- return _d1 == other._d1 && _d2 == other._d2
+ if (obj == null || !(obj instanceof GUID))
+ return false;
+ return _d1 == other._d1 && _d2 == other._d2
&& _d3 == other._d3 && _d4 == other._d4;
}
}
/**
- * Hyperlink address. Depending on the hyperlink type it can be URL, e-mail, patrh to a file, etc.
+ * Hyperlink address. Depending on the hyperlink type it can be URL, e-mail, path to a file, etc.
*
* @return the address of this hyperlink
*/
public String getAddress() {
- return cleanString(_address);
+ if ((_linkOpts & HLINK_URL) != 0 && FILE_MONIKER.equals(_moniker))
+ return cleanString(_address != null ? _address : _shortFilename);
+ else if((_linkOpts & HLINK_PLACE) != 0)
+ return cleanString(_textMark);
+ else
+ return cleanString(_address);
}
/**
- * Hyperlink address. Depending on the hyperlink type it can be URL, e-mail, patrh to a file, etc.
+ * Hyperlink address. Depending on the hyperlink type it can be URL, e-mail, path to a file, etc.
*
* @param address the address of this hyperlink
*/
public void setAddress(String address) {
- _address = appendNullTerm(address);
+ if ((_linkOpts & HLINK_URL) != 0 && FILE_MONIKER.equals(_moniker))
+ _shortFilename = appendNullTerm(address);
+ else if((_linkOpts & HLINK_PLACE) != 0)
+ _textMark = appendNullTerm(address);
+ else
+ _address = appendNullTerm(address);
}
public String getShortFilename() {
}
/**
- * Hypelink address. Depending on the hyperlink type it can be URL, e-mail, patrh to a file, etc.
+ * Hypelink address. Depending on the hyperlink type it can be URL, e-mail, path to a file, etc.
*
* @return the address of this hyperlink
*/
public String getTextMark(){
return record.getTextMark();
}
+
+ /**
+ * Convenience method equivalent to {@link #setAddress(String)}
+ *
+ * @param textMark the place in worksheet this hypelrink referes to, e.g. 'Target Sheet'!A1'
+ */
public void setTextMark(String textMark) {
record.setTextMark(textMark);
}
public String getShortFilename(){
return record.getShortFilename();
}
+ /**
+ * Convenience method equivalent to {@link #setAddress(String)}
+ *
+ * @param shortFilename the path to a file this hypelrink points to, e.g. 'readme.txt'
+ */
public void setShortFilename(String shortFilename) {
record.setShortFilename(shortFilename);
}
import java.io.File;
-import junit.framework.TestCase;
-
-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.*;
import org.apache.poi.xssf.XSSFTestDataSamples;
+import org.apache.poi.xssf.XSSFITestDataProvider;
+
+public final class TestXSSFHyperlink extends BaseTestHyperlink {
+ @Override
+ protected XSSFITestDataProvider getTestDataProvider() {
+ return XSSFITestDataProvider.getInstance();
+ }
-public final class TestXSSFHyperlink extends TestCase {
@Override
protected void setUp() {
// Use system out logger
assertEquals("file", link.getLabel());
assertEquals("link1.xls", link.getShortFilename());
- assertEquals(null, link.getAddress());
+ assertEquals("link1.xls", link.getAddress());
}
public void testReadEmailLink(){
assertEquals("place", link.getLabel());
assertEquals("Sheet1!A1", link.getTextMark());
- assertEquals(null, link.getAddress());
+ assertEquals("Sheet1!A1", link.getAddress());
}
private void serialize(byte[] data){
package org.apache.poi.hssf.usermodel;
-import junit.framework.TestCase;
-
-import java.io.*;
-
import org.apache.poi.hssf.HSSFTestDataSamples;
+import org.apache.poi.hssf.HSSFITestDataProvider;
+import org.apache.poi.ss.usermodel.BaseTestHyperlink;
/**
* Tests HSSFHyperlink.
*
* @author Yegor Kozlov
*/
-public final class TestHSSFHyperlink extends TestCase {
+public final class TestHSSFHyperlink extends BaseTestHyperlink {
+ @Override
+ protected HSSFITestDataProvider getTestDataProvider(){
+ return HSSFITestDataProvider.getInstance();
+ }
/**
* Test that we can read hyperlinks.
*/
public void testRead() {
- HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("HyperlinksOnManySheets.xls");
+ HSSFWorkbook wb = getTestDataProvider().openSampleWorkbook("HyperlinksOnManySheets.xls");
HSSFSheet sheet;
HSSFCell cell;
assertEquals("Link To First Sheet", link.getLabel());
assertEquals("Link To First Sheet", cell.getRichStringCellValue().getString());
assertEquals("WebLinks!A1", link.getTextMark());
+ assertEquals("WebLinks!A1", link.getAddress());
}
public void testModify() throws Exception {
- HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("HyperlinksOnManySheets.xls");
+ HSSFWorkbook wb = getTestDataProvider().openSampleWorkbook("HyperlinksOnManySheets.xls");
HSSFSheet sheet;
HSSFCell cell;
//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()));
+ wb = getTestDataProvider().writeOutAndReadBack(wb);
sheet = wb.getSheet("WebLinks");
cell = sheet.getRow(4).getCell(0);
link = cell.getHyperlink();
}
- public void testCreate() throws Exception {
- HSSFWorkbook wb = new HSSFWorkbook();
+ /**
+ * HSSF-specific ways of creating links to a place in workbook.
+ * You can set the target in two ways:
+ * link.setTextMark("'Target Sheet-1'!A1"); //HSSF-specific
+ * or
+ * link.setAddress("'Target Sheet-1'!A1"); //common between XSSF and HSSF
+ */
+ public void testCreateDocumentLink() throws Exception {
+ HSSFWorkbook wb = getTestDataProvider().createWorkbook();
+ //link to a place in this workbook
+ HSSFHyperlink link;
HSSFCell cell;
HSSFSheet sheet = wb.createSheet("Hyperlinks");
- //URL
- cell = sheet.createRow(0).createCell(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(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(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(0).setCellValue("Target Cell");
- cell = sheet.createRow(3).createCell(0);
+ //cell A1 has a link to 'Target Sheet-1'!A1
+ cell = sheet.createRow(0).createCell(0);
cell.setCellValue("Worksheet Link");
link = new HSSFHyperlink(HSSFHyperlink.LINK_DOCUMENT);
link.setTextMark("'Target Sheet'!A1");
cell.setHyperlink(link);
- //serialize and read again
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- wb.write(out);
+ //cell B1 has a link to cell A1 on the same sheet
+ cell = sheet.createRow(1).createCell(0);
+ cell.setCellValue("Worksheet Link");
+ link = new HSSFHyperlink(HSSFHyperlink.LINK_DOCUMENT);
+ link.setAddress("'Hyperlinks'!A1");
+ cell.setHyperlink(link);
- wb = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray()));
+ wb = getTestDataProvider().writeOutAndReadBack(wb);
sheet = wb.getSheet("Hyperlinks");
+
cell = sheet.getRow(0).getCell(0);
link = cell.getHyperlink();
assertNotNull(link);
- assertEquals("http://poi.apache.org/", link.getAddress());
+ assertEquals("'Target Sheet'!A1", link.getTextMark());
+ assertEquals("'Target Sheet'!A1", link.getAddress());
cell = sheet.getRow(1).getCell(0);
link = cell.getHyperlink();
assertNotNull(link);
- assertEquals("link1.xls", link.getAddress());
-
- cell = sheet.getRow(2).getCell(0);
- link = cell.getHyperlink();
- assertNotNull(link);
- assertEquals("mailto:poi@apache.org?subject=Hyperlinks", link.getAddress());
-
- cell = sheet.getRow(3).getCell(0);
- link = cell.getHyperlink();
- assertNotNull(link);
- assertEquals("'Target Sheet'!A1", link.getTextMark());
+ assertEquals("'Hyperlinks'!A1", link.getTextMark());
+ assertEquals("'Hyperlinks'!A1", link.getAddress());
}
public void testCloneSheet() {
* see bugs #46445 and #29957
*/
public void testShiftRows(){
- HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("46445.xls");
+ HSSFWorkbook wb = getTestDataProvider().openSampleWorkbook("46445.xls");
HSSFSheet sheet = wb.getSheetAt(0);
--- /dev/null
+/* ====================================================================
+ 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.ss.usermodel;
+
+import junit.framework.TestCase;
+
+import org.apache.poi.ss.ITestDataProvider;
+
+/**
+ * Test diffrent types of Excel hyperlinks
+ *
+ * @author Yegor Kozlov
+ */
+public abstract class BaseTestHyperlink extends TestCase {
+
+ protected abstract ITestDataProvider getTestDataProvider();
+
+ public void testBasicTypes(){
+ Workbook wb = getTestDataProvider().createWorkbook();
+ CreationHelper createHelper = wb.getCreationHelper();
+
+ Cell cell;
+ Hyperlink link;
+ Sheet sheet = wb.createSheet("Hyperlinks");
+
+ //URL
+ cell = sheet.createRow(0).createCell((short) 0);
+ cell.setCellValue("URL Link");
+ link = createHelper.createHyperlink(Hyperlink.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 = createHelper.createHyperlink(Hyperlink.LINK_FILE);
+ link.setAddress("hyperinks-beta4-dump.txt");
+ cell.setHyperlink(link);
+
+ //e-mail link
+ cell = sheet.createRow(2).createCell((short) 0);
+ cell.setCellValue("Email Link");
+ link = createHelper.createHyperlink(Hyperlink.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
+ Sheet 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 = createHelper.createHyperlink(Hyperlink.LINK_DOCUMENT);
+ link.setAddress("'Target Sheet'!A1");
+ cell.setHyperlink(link);
+
+ wb = getTestDataProvider().writeOutAndReadBack(wb);
+
+ sheet = wb.getSheetAt(0);
+ link = sheet.getRow(0).getCell(0).getHyperlink();
+
+ assertEquals("http://poi.apache.org/", link.getAddress());
+ link = sheet.getRow(1).getCell(0).getHyperlink();
+ assertEquals("hyperinks-beta4-dump.txt", link.getAddress());
+ link = sheet.getRow(2).getCell(0).getHyperlink();
+ assertEquals("mailto:poi@apache.org?subject=Hyperlinks", link.getAddress());
+ link = sheet.getRow(3).getCell(0).getHyperlink();
+ assertEquals("'Target Sheet'!A1", link.getAddress());
+ }
+}
\ No newline at end of file