mirror of https://github.com/apache/poi.git
Finish off XSSFHyperlink support
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@645446 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
d1bff4be2f
commit
559508b7e0
|
@ -151,8 +151,8 @@ under the License.
|
||||||
<property name="ooxml.jar5.dir" location="${ooxml.lib}/jsr173_1.0_api.jar"/>
|
<property name="ooxml.jar5.dir" location="${ooxml.lib}/jsr173_1.0_api.jar"/>
|
||||||
<property name="ooxml.jar5.url" value="${repository}/xmlbeans/jars/jsr173_1.0_api.jar"/>
|
<property name="ooxml.jar5.url" value="${repository}/xmlbeans/jars/jsr173_1.0_api.jar"/>
|
||||||
<!-- No official release of openxml4j yet -->
|
<!-- No official release of openxml4j yet -->
|
||||||
<property name="ooxml.jar6.dir" location="${ooxml.lib}/openxml4j-bin-alpha-080403.jar"/>
|
<property name="ooxml.jar6.dir" location="${ooxml.lib}/openxml4j-bin-alpha-080407.jar"/>
|
||||||
<property name="ooxml.jar6.url" value="http://people.apache.org/~nick/openxml4j-bin-alpha-080403.jar"/>
|
<property name="ooxml.jar6.url" value="http://people.apache.org/~nick/openxml4j-bin-alpha-080407.jar"/>
|
||||||
|
|
||||||
<!-- See http://www.ecma-international.org/publications/standards/Ecma-376.htm -->
|
<!-- See http://www.ecma-international.org/publications/standards/Ecma-376.htm -->
|
||||||
<!-- "Copy these file(s), free of charge" -->
|
<!-- "Copy these file(s), free of charge" -->
|
||||||
|
|
|
@ -431,6 +431,12 @@ public final class XSSFCell implements Cell {
|
||||||
return row.getSheet().getHyperlink(row.getRowNum(), cellNum);
|
return row.getSheet().getHyperlink(row.getRowNum(), cellNum);
|
||||||
}
|
}
|
||||||
public void setHyperlink(Hyperlink hyperlink) {
|
public void setHyperlink(Hyperlink hyperlink) {
|
||||||
row.getSheet().setCellHyperlink((XSSFHyperlink)hyperlink);
|
XSSFHyperlink link = (XSSFHyperlink)hyperlink;
|
||||||
|
|
||||||
|
// Assign to us
|
||||||
|
link.setCellReference( new CellReference(row.getRowNum(), cellNum).formatAsString() );
|
||||||
|
|
||||||
|
// Add to the lists
|
||||||
|
row.getSheet().setCellHyperlink(link);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,6 @@ import org.apache.poi.ss.usermodel.Hyperlink;
|
||||||
import org.apache.poi.ss.util.CellReference;
|
import org.apache.poi.ss.util.CellReference;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTHyperlink;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTHyperlink;
|
||||||
|
|
||||||
import org.openxml4j.opc.Package;
|
|
||||||
import org.openxml4j.opc.PackagePart;
|
import org.openxml4j.opc.PackagePart;
|
||||||
import org.openxml4j.opc.PackageRelationship;
|
import org.openxml4j.opc.PackageRelationship;
|
||||||
|
|
||||||
|
@ -46,7 +45,7 @@ public class XSSFHyperlink implements Hyperlink {
|
||||||
this.ctHyperlink = ctHyperlink;
|
this.ctHyperlink = ctHyperlink;
|
||||||
this.externalRel = hyperlinkRel;
|
this.externalRel = hyperlinkRel;
|
||||||
|
|
||||||
// Figure out the Hyperlink type
|
// Figure out the Hyperlink type and distination
|
||||||
|
|
||||||
// If it has a location, it's internal
|
// If it has a location, it's internal
|
||||||
if(ctHyperlink.getLocation() != null) {
|
if(ctHyperlink.getLocation() != null) {
|
||||||
|
@ -62,10 +61,19 @@ public class XSSFHyperlink implements Hyperlink {
|
||||||
throw new IllegalStateException("A sheet hyperlink must either have a location, or a relationship. Found:\n" + ctHyperlink);
|
throw new IllegalStateException("A sheet hyperlink must either have a location, or a relationship. Found:\n" + ctHyperlink);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// TODO
|
|
||||||
|
|
||||||
//URI target = externalRel.getTargetURI();
|
URI target = externalRel.getTargetURI();
|
||||||
//location = target.toString();
|
location = target.toString();
|
||||||
|
|
||||||
|
// Try to figure out the type
|
||||||
|
if(location.startsWith("http://") || location.startsWith("https://")
|
||||||
|
|| location.startsWith("ftp://")) {
|
||||||
|
type = Hyperlink.LINK_URL;
|
||||||
|
} else if(location.startsWith("mailto:")) {
|
||||||
|
type = Hyperlink.LINK_EMAIL;
|
||||||
|
} else {
|
||||||
|
type = Hyperlink.LINK_FILE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,7 +97,12 @@ public class XSSFHyperlink implements Hyperlink {
|
||||||
*/
|
*/
|
||||||
protected void generateRelationIfNeeded(PackagePart sheetPart) {
|
protected void generateRelationIfNeeded(PackagePart sheetPart) {
|
||||||
if(needsRelationToo()) {
|
if(needsRelationToo()) {
|
||||||
// TODO
|
// Generate the relation
|
||||||
|
PackageRelationship rel =
|
||||||
|
sheetPart.addExternalRelationship(location, XSSFWorkbook.SHEET_HYPERLINKS.getRelation());
|
||||||
|
|
||||||
|
// Update the r:id
|
||||||
|
ctHyperlink.setId(rel.getId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,6 +132,13 @@ public class XSSFHyperlink implements Hyperlink {
|
||||||
location = address;
|
location = address;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assigns this hyperlink to the given cell reference
|
||||||
|
*/
|
||||||
|
protected void setCellReference(String ref) {
|
||||||
|
ctHyperlink.setRef(ref);
|
||||||
|
}
|
||||||
|
|
||||||
private CellReference buildCellReference() {
|
private CellReference buildCellReference() {
|
||||||
return new CellReference(ctHyperlink.getRef());
|
return new CellReference(ctHyperlink.getRef());
|
||||||
}
|
}
|
||||||
|
|
|
@ -180,10 +180,9 @@ public class XSSFSheet implements Sheet {
|
||||||
hyperRel = hyperRels.getRelationshipByID(hyperlink.getId());
|
hyperRel = hyperRels.getRelationshipByID(hyperlink.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: fix openxml4j
|
hyperlinks.add(
|
||||||
// hyperlinks.add(
|
new XSSFHyperlink(hyperlink, hyperRel)
|
||||||
// new XSSFHyperlink(hyperlink, hyperRel)
|
);
|
||||||
// );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,10 @@ import java.io.File;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
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.openxml4j.opc.Package;
|
import org.openxml4j.opc.Package;
|
||||||
|
|
||||||
public class TestXSSFHyperlink extends TestCase {
|
public class TestXSSFHyperlink extends TestCase {
|
||||||
|
@ -52,8 +56,9 @@ public class TestXSSFHyperlink extends TestCase {
|
||||||
|
|
||||||
XSSFSheet sheet = (XSSFSheet)workbook.getSheetAt(0);
|
XSSFSheet sheet = (XSSFSheet)workbook.getSheetAt(0);
|
||||||
|
|
||||||
// TODO - check hyperlinks
|
// Check the hyperlinks
|
||||||
//assertEquals(4, sheet.getNumHyperlinks());
|
assertEquals(4, sheet.getNumHyperlinks());
|
||||||
|
doTestHyperlinkContents(sheet);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testLoadSave() throws Exception {
|
public void testLoadSave() throws Exception {
|
||||||
|
@ -64,9 +69,14 @@ public class TestXSSFHyperlink extends TestCase {
|
||||||
assertTrue(xml.exists());
|
assertTrue(xml.exists());
|
||||||
|
|
||||||
XSSFWorkbook workbook = new XSSFWorkbook(xml.toString());
|
XSSFWorkbook workbook = new XSSFWorkbook(xml.toString());
|
||||||
|
CreationHelper createHelper = workbook.getCreationHelper();
|
||||||
assertEquals(3, workbook.getNumberOfSheets());
|
assertEquals(3, workbook.getNumberOfSheets());
|
||||||
|
XSSFSheet sheet = (XSSFSheet)workbook.getSheetAt(0);
|
||||||
|
|
||||||
|
// Check hyperlinks
|
||||||
|
assertEquals(4, sheet.getNumHyperlinks());
|
||||||
|
doTestHyperlinkContents(sheet);
|
||||||
|
|
||||||
// TODO - check hyperlinks
|
|
||||||
|
|
||||||
// Write out, and check
|
// Write out, and check
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
@ -80,7 +90,98 @@ public class TestXSSFHyperlink extends TestCase {
|
||||||
assertNotNull(wb2.getSheetAt(1));
|
assertNotNull(wb2.getSheetAt(1));
|
||||||
assertNotNull(wb2.getSheetAt(2));
|
assertNotNull(wb2.getSheetAt(2));
|
||||||
|
|
||||||
// TODO
|
sheet = (XSSFSheet)wb2.getSheetAt(0);
|
||||||
|
|
||||||
|
|
||||||
|
// Check hyperlinks again
|
||||||
|
assertEquals(4, sheet.getNumHyperlinks());
|
||||||
|
doTestHyperlinkContents(sheet);
|
||||||
|
|
||||||
|
|
||||||
|
// Add one more, and re-check
|
||||||
|
Row r17 = sheet.createRow(17);
|
||||||
|
Cell r17c = r17.createCell(2);
|
||||||
|
|
||||||
|
Hyperlink hyperlink = createHelper.createHyperlink(Hyperlink.LINK_URL);
|
||||||
|
hyperlink.setAddress("http://poi.apache.org/spreadsheet/");
|
||||||
|
hyperlink.setLabel("POI SS Link");
|
||||||
|
r17c.setHyperlink(hyperlink);
|
||||||
|
|
||||||
|
assertEquals(5, sheet.getNumHyperlinks());
|
||||||
|
doTestHyperlinkContents(sheet);
|
||||||
|
|
||||||
|
assertEquals(Hyperlink.LINK_URL,
|
||||||
|
sheet.getRow(17).getCell(2).getHyperlink().getType());
|
||||||
|
assertEquals("POI SS Link",
|
||||||
|
sheet.getRow(17).getCell(2).getHyperlink().getLabel());
|
||||||
|
assertEquals("http://poi.apache.org/spreadsheet/",
|
||||||
|
sheet.getRow(17).getCell(2).getHyperlink().getAddress());
|
||||||
|
|
||||||
|
|
||||||
|
// Save and re-load once more
|
||||||
|
baos = new ByteArrayOutputStream();
|
||||||
|
wb2.write(baos);
|
||||||
|
bais = new ByteArrayInputStream(baos.toByteArray());
|
||||||
|
|
||||||
|
|
||||||
|
XSSFWorkbook wb3 = new XSSFWorkbook(Package.open(bais));
|
||||||
|
assertEquals(3, wb3.getNumberOfSheets());
|
||||||
|
assertNotNull(wb3.getSheetAt(0));
|
||||||
|
assertNotNull(wb3.getSheetAt(1));
|
||||||
|
assertNotNull(wb3.getSheetAt(2));
|
||||||
|
|
||||||
|
sheet = (XSSFSheet)wb3.getSheetAt(0);
|
||||||
|
|
||||||
|
assertEquals(5, sheet.getNumHyperlinks());
|
||||||
|
doTestHyperlinkContents(sheet);
|
||||||
|
|
||||||
|
assertEquals(Hyperlink.LINK_URL,
|
||||||
|
sheet.getRow(17).getCell(2).getHyperlink().getType());
|
||||||
|
assertEquals("POI SS Link",
|
||||||
|
sheet.getRow(17).getCell(2).getHyperlink().getLabel());
|
||||||
|
assertEquals("http://poi.apache.org/spreadsheet/",
|
||||||
|
sheet.getRow(17).getCell(2).getHyperlink().getAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Only for WithMoreVariousData.xlsx !
|
||||||
|
*/
|
||||||
|
private void doTestHyperlinkContents(XSSFSheet sheet) {
|
||||||
|
assertNotNull(sheet.getRow(3).getCell(2).getHyperlink());
|
||||||
|
assertNotNull(sheet.getRow(14).getCell(2).getHyperlink());
|
||||||
|
assertNotNull(sheet.getRow(15).getCell(2).getHyperlink());
|
||||||
|
assertNotNull(sheet.getRow(16).getCell(2).getHyperlink());
|
||||||
|
|
||||||
|
// First is a link to poi
|
||||||
|
assertEquals(Hyperlink.LINK_URL,
|
||||||
|
sheet.getRow(3).getCell(2).getHyperlink().getType());
|
||||||
|
assertEquals(null,
|
||||||
|
sheet.getRow(3).getCell(2).getHyperlink().getLabel());
|
||||||
|
assertEquals("http://poi.apache.org/",
|
||||||
|
sheet.getRow(3).getCell(2).getHyperlink().getAddress());
|
||||||
|
|
||||||
|
// Next is an internal doc link
|
||||||
|
assertEquals(Hyperlink.LINK_DOCUMENT,
|
||||||
|
sheet.getRow(14).getCell(2).getHyperlink().getType());
|
||||||
|
assertEquals("Internal hyperlink to A2",
|
||||||
|
sheet.getRow(14).getCell(2).getHyperlink().getLabel());
|
||||||
|
assertEquals("Sheet1!A2",
|
||||||
|
sheet.getRow(14).getCell(2).getHyperlink().getAddress());
|
||||||
|
|
||||||
|
// Next is a file
|
||||||
|
assertEquals(Hyperlink.LINK_FILE,
|
||||||
|
sheet.getRow(15).getCell(2).getHyperlink().getType());
|
||||||
|
assertEquals(null,
|
||||||
|
sheet.getRow(15).getCell(2).getHyperlink().getLabel());
|
||||||
|
assertEquals("WithVariousData.xlsx",
|
||||||
|
sheet.getRow(15).getCell(2).getHyperlink().getAddress());
|
||||||
|
|
||||||
|
// Last is a mailto
|
||||||
|
assertEquals(Hyperlink.LINK_EMAIL,
|
||||||
|
sheet.getRow(16).getCell(2).getHyperlink().getType());
|
||||||
|
assertEquals(null,
|
||||||
|
sheet.getRow(16).getCell(2).getHyperlink().getLabel());
|
||||||
|
assertEquals("mailto:dev@poi.apache.org?subject=XSSF%20Hyperlinks",
|
||||||
|
sheet.getRow(16).getCell(2).getHyperlink().getAddress());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue