fixed a regression issue where HSSFHyperlink failed to set inter-sheet and file links, see Bugzilla #47375
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@786442 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
66b67b1e1d
commit
e1ff96d77d
@ -33,6 +33,7 @@
|
||||
|
||||
<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>
|
||||
|
@ -81,6 +81,8 @@ public final class HyperlinkRecord extends StandardRecord {
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
GUID other = (GUID) obj;
|
||||
if (obj == null || !(obj instanceof GUID))
|
||||
return false;
|
||||
return _d1 == other._d1 && _d2 == other._d2
|
||||
&& _d3 == other._d3 && _d4 == other._d4;
|
||||
}
|
||||
@ -360,21 +362,31 @@ public final class HyperlinkRecord extends StandardRecord {
|
||||
}
|
||||
|
||||
/**
|
||||
* 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() {
|
||||
|
@ -162,7 +162,7 @@ public class HSSFHyperlink implements Hyperlink {
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
@ -172,12 +172,23 @@ public class HSSFHyperlink implements 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);
|
||||
}
|
||||
|
@ -19,15 +19,16 @@ package org.apache.poi.xssf.usermodel;
|
||||
|
||||
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
|
||||
|
@ -281,7 +281,7 @@ public final class TestHyperlinkRecord extends TestCase {
|
||||
|
||||
assertEquals("file", link.getLabel());
|
||||
assertEquals("link1.xls", link.getShortFilename());
|
||||
assertEquals(null, link.getAddress());
|
||||
assertEquals("link1.xls", link.getAddress());
|
||||
}
|
||||
|
||||
public void testReadEmailLink(){
|
||||
@ -317,7 +317,7 @@ public final class TestHyperlinkRecord extends TestCase {
|
||||
|
||||
assertEquals("place", link.getLabel());
|
||||
assertEquals("Sheet1!A1", link.getTextMark());
|
||||
assertEquals(null, link.getAddress());
|
||||
assertEquals("Sheet1!A1", link.getAddress());
|
||||
}
|
||||
|
||||
private void serialize(byte[] data){
|
||||
|
@ -17,25 +17,27 @@
|
||||
|
||||
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;
|
||||
@ -71,10 +73,11 @@ public final class TestHSSFHyperlink extends TestCase {
|
||||
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;
|
||||
@ -86,11 +89,7 @@ public final class TestHSSFHyperlink extends TestCase {
|
||||
//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();
|
||||
@ -99,71 +98,53 @@ public final class TestHSSFHyperlink extends TestCase {
|
||||
|
||||
}
|
||||
|
||||
public void testCreate() throws Exception {
|
||||
HSSFWorkbook wb = new HSSFWorkbook();
|
||||
|
||||
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);
|
||||
/**
|
||||
* 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");
|
||||
|
||||
//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() {
|
||||
@ -190,7 +171,7 @@ public final class TestHSSFHyperlink extends TestCase {
|
||||
* 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);
|
||||
|
88
src/testcases/org/apache/poi/ss/usermodel/BaseTestHyperlink.java
Executable file
88
src/testcases/org/apache/poi/ss/usermodel/BaseTestHyperlink.java
Executable file
@ -0,0 +1,88 @@
|
||||
/* ====================================================================
|
||||
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());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user