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>
|
<changes>
|
||||||
<release version="3.5-beta7" date="2009-??-??">
|
<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">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>
|
<action dev="POI-DEVELOPERS" type="fix">47372 - Fixed locale-sensitive unit tests to pass when running on non-US locale</action>
|
||||||
</release>
|
</release>
|
||||||
|
@ -81,6 +81,8 @@ public final class HyperlinkRecord extends StandardRecord {
|
|||||||
@Override
|
@Override
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
GUID other = (GUID) obj;
|
GUID other = (GUID) obj;
|
||||||
|
if (obj == null || !(obj instanceof GUID))
|
||||||
|
return false;
|
||||||
return _d1 == other._d1 && _d2 == other._d2
|
return _d1 == other._d1 && _d2 == other._d2
|
||||||
&& _d3 == other._d3 && _d4 == other._d4;
|
&& _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
|
* @return the address of this hyperlink
|
||||||
*/
|
*/
|
||||||
public String getAddress() {
|
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
|
* @param address the address of this hyperlink
|
||||||
*/
|
*/
|
||||||
public void setAddress(String address) {
|
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() {
|
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
|
* @return the address of this hyperlink
|
||||||
*/
|
*/
|
||||||
@ -172,12 +172,23 @@ public class HSSFHyperlink implements Hyperlink {
|
|||||||
public String getTextMark(){
|
public String getTextMark(){
|
||||||
return record.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) {
|
public void setTextMark(String textMark) {
|
||||||
record.setTextMark(textMark);
|
record.setTextMark(textMark);
|
||||||
}
|
}
|
||||||
public String getShortFilename(){
|
public String getShortFilename(){
|
||||||
return record.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) {
|
public void setShortFilename(String shortFilename) {
|
||||||
record.setShortFilename(shortFilename);
|
record.setShortFilename(shortFilename);
|
||||||
}
|
}
|
||||||
|
@ -19,15 +19,16 @@ package org.apache.poi.xssf.usermodel;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import org.apache.poi.ss.usermodel.*;
|
||||||
|
|
||||||
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.xssf.XSSFTestDataSamples;
|
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
|
@Override
|
||||||
protected void setUp() {
|
protected void setUp() {
|
||||||
// Use system out logger
|
// Use system out logger
|
||||||
|
@ -281,7 +281,7 @@ public final class TestHyperlinkRecord extends TestCase {
|
|||||||
|
|
||||||
assertEquals("file", link.getLabel());
|
assertEquals("file", link.getLabel());
|
||||||
assertEquals("link1.xls", link.getShortFilename());
|
assertEquals("link1.xls", link.getShortFilename());
|
||||||
assertEquals(null, link.getAddress());
|
assertEquals("link1.xls", link.getAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testReadEmailLink(){
|
public void testReadEmailLink(){
|
||||||
@ -317,7 +317,7 @@ public final class TestHyperlinkRecord extends TestCase {
|
|||||||
|
|
||||||
assertEquals("place", link.getLabel());
|
assertEquals("place", link.getLabel());
|
||||||
assertEquals("Sheet1!A1", link.getTextMark());
|
assertEquals("Sheet1!A1", link.getTextMark());
|
||||||
assertEquals(null, link.getAddress());
|
assertEquals("Sheet1!A1", link.getAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void serialize(byte[] data){
|
private void serialize(byte[] data){
|
||||||
|
@ -17,25 +17,27 @@
|
|||||||
|
|
||||||
package org.apache.poi.hssf.usermodel;
|
package org.apache.poi.hssf.usermodel;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
|
||||||
|
|
||||||
import java.io.*;
|
|
||||||
|
|
||||||
import org.apache.poi.hssf.HSSFTestDataSamples;
|
import org.apache.poi.hssf.HSSFTestDataSamples;
|
||||||
|
import org.apache.poi.hssf.HSSFITestDataProvider;
|
||||||
|
import org.apache.poi.ss.usermodel.BaseTestHyperlink;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests HSSFHyperlink.
|
* Tests HSSFHyperlink.
|
||||||
*
|
*
|
||||||
* @author Yegor Kozlov
|
* @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.
|
* Test that we can read hyperlinks.
|
||||||
*/
|
*/
|
||||||
public void testRead() {
|
public void testRead() {
|
||||||
|
|
||||||
HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("HyperlinksOnManySheets.xls");
|
HSSFWorkbook wb = getTestDataProvider().openSampleWorkbook("HyperlinksOnManySheets.xls");
|
||||||
|
|
||||||
HSSFSheet sheet;
|
HSSFSheet sheet;
|
||||||
HSSFCell cell;
|
HSSFCell cell;
|
||||||
@ -71,10 +73,11 @@ public final class TestHSSFHyperlink extends TestCase {
|
|||||||
assertEquals("Link To First Sheet", link.getLabel());
|
assertEquals("Link To First Sheet", link.getLabel());
|
||||||
assertEquals("Link To First Sheet", cell.getRichStringCellValue().getString());
|
assertEquals("Link To First Sheet", cell.getRichStringCellValue().getString());
|
||||||
assertEquals("WebLinks!A1", link.getTextMark());
|
assertEquals("WebLinks!A1", link.getTextMark());
|
||||||
|
assertEquals("WebLinks!A1", link.getAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testModify() throws Exception {
|
public void testModify() throws Exception {
|
||||||
HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("HyperlinksOnManySheets.xls");
|
HSSFWorkbook wb = getTestDataProvider().openSampleWorkbook("HyperlinksOnManySheets.xls");
|
||||||
|
|
||||||
HSSFSheet sheet;
|
HSSFSheet sheet;
|
||||||
HSSFCell cell;
|
HSSFCell cell;
|
||||||
@ -86,11 +89,7 @@ public final class TestHSSFHyperlink extends TestCase {
|
|||||||
//modify the link
|
//modify the link
|
||||||
link.setAddress("www.apache.org");
|
link.setAddress("www.apache.org");
|
||||||
|
|
||||||
//serialize and read again
|
wb = getTestDataProvider().writeOutAndReadBack(wb);
|
||||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
|
||||||
wb.write(out);
|
|
||||||
|
|
||||||
wb = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray()));
|
|
||||||
sheet = wb.getSheet("WebLinks");
|
sheet = wb.getSheet("WebLinks");
|
||||||
cell = sheet.getRow(4).getCell(0);
|
cell = sheet.getRow(4).getCell(0);
|
||||||
link = cell.getHyperlink();
|
link = cell.getHyperlink();
|
||||||
@ -99,71 +98,53 @@ public final class TestHSSFHyperlink extends TestCase {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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:
|
||||||
HSSFCell cell;
|
* link.setTextMark("'Target Sheet-1'!A1"); //HSSF-specific
|
||||||
HSSFSheet sheet = wb.createSheet("Hyperlinks");
|
* or
|
||||||
|
* link.setAddress("'Target Sheet-1'!A1"); //common between XSSF and HSSF
|
||||||
//URL
|
*/
|
||||||
cell = sheet.createRow(0).createCell(0);
|
public void testCreateDocumentLink() throws Exception {
|
||||||
cell.setCellValue("URL Link");
|
HSSFWorkbook wb = getTestDataProvider().createWorkbook();
|
||||||
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
|
//link to a place in this workbook
|
||||||
|
HSSFHyperlink link;
|
||||||
|
HSSFCell cell;
|
||||||
|
HSSFSheet sheet = wb.createSheet("Hyperlinks");
|
||||||
|
|
||||||
//create a target sheet and cell
|
//create a target sheet and cell
|
||||||
HSSFSheet sheet2 = wb.createSheet("Target Sheet");
|
HSSFSheet sheet2 = wb.createSheet("Target Sheet");
|
||||||
sheet2.createRow(0).createCell(0).setCellValue("Target Cell");
|
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");
|
cell.setCellValue("Worksheet Link");
|
||||||
link = new HSSFHyperlink(HSSFHyperlink.LINK_DOCUMENT);
|
link = new HSSFHyperlink(HSSFHyperlink.LINK_DOCUMENT);
|
||||||
link.setTextMark("'Target Sheet'!A1");
|
link.setTextMark("'Target Sheet'!A1");
|
||||||
cell.setHyperlink(link);
|
cell.setHyperlink(link);
|
||||||
|
|
||||||
//serialize and read again
|
//cell B1 has a link to cell A1 on the same sheet
|
||||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
cell = sheet.createRow(1).createCell(0);
|
||||||
wb.write(out);
|
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");
|
sheet = wb.getSheet("Hyperlinks");
|
||||||
|
|
||||||
cell = sheet.getRow(0).getCell(0);
|
cell = sheet.getRow(0).getCell(0);
|
||||||
link = cell.getHyperlink();
|
link = cell.getHyperlink();
|
||||||
assertNotNull(link);
|
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);
|
cell = sheet.getRow(1).getCell(0);
|
||||||
link = cell.getHyperlink();
|
link = cell.getHyperlink();
|
||||||
assertNotNull(link);
|
assertNotNull(link);
|
||||||
assertEquals("link1.xls", link.getAddress());
|
assertEquals("'Hyperlinks'!A1", link.getTextMark());
|
||||||
|
assertEquals("'Hyperlinks'!A1", 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());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testCloneSheet() {
|
public void testCloneSheet() {
|
||||||
@ -190,7 +171,7 @@ public final class TestHSSFHyperlink extends TestCase {
|
|||||||
* see bugs #46445 and #29957
|
* see bugs #46445 and #29957
|
||||||
*/
|
*/
|
||||||
public void testShiftRows(){
|
public void testShiftRows(){
|
||||||
HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("46445.xls");
|
HSSFWorkbook wb = getTestDataProvider().openSampleWorkbook("46445.xls");
|
||||||
|
|
||||||
|
|
||||||
HSSFSheet sheet = wb.getSheetAt(0);
|
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