git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1711923 13f79535-47bb-0310-9956-ffa450edef68tags/REL_3_14_BETA1
@@ -1045,17 +1045,9 @@ public class HSSFCell implements Cell { | |||
/** | |||
* @return hyperlink associated with this cell or <code>null</code> if not found | |||
*/ | |||
@Override | |||
public HSSFHyperlink getHyperlink(){ | |||
for (Iterator<RecordBase> it = _sheet.getSheet().getRecords().iterator(); it.hasNext(); ) { | |||
RecordBase rec = it.next(); | |||
if (rec instanceof HyperlinkRecord){ | |||
HyperlinkRecord link = (HyperlinkRecord)rec; | |||
if(link.getFirstColumn() == _record.getColumn() && link.getFirstRow() == _record.getRow()){ | |||
return new HSSFHyperlink(link); | |||
} | |||
} | |||
} | |||
return null; | |||
return _sheet.getHyperlink(_record.getRow(), _record.getColumn()); | |||
} | |||
/** | |||
@@ -1064,6 +1056,7 @@ public class HSSFCell implements Cell { | |||
* | |||
* @param hyperlink hyperlink associated with this cell | |||
*/ | |||
@Override | |||
public void setHyperlink(Hyperlink hyperlink){ | |||
if (hyperlink == null) { | |||
removeHyperlink(); |
@@ -47,12 +47,12 @@ public class HSSFHyperlink implements Hyperlink { | |||
/** | |||
* Low-level record object that stores the actual hyperlink data | |||
*/ | |||
protected HyperlinkRecord record = null; | |||
final protected HyperlinkRecord record; | |||
/** | |||
* If we create a new hyperlink remember its type | |||
*/ | |||
protected int link_type; | |||
final protected int link_type; | |||
/** | |||
* Construct a new hyperlink | |||
@@ -100,6 +100,19 @@ public class HSSFHyperlink implements Hyperlink { | |||
} | |||
} | |||
} | |||
@Override | |||
public HSSFHyperlink clone() { | |||
return new HSSFHyperlink(record.clone()); | |||
/*final HSSFHyperlink link = new HSSFHyperlink(link_type); | |||
link.setLabel(getLabel()); | |||
link.setAddress(getAddress()); | |||
link.setFirstColumn(getFirstColumn()); | |||
link.setFirstRow(getFirstRow()); | |||
link.setLastColumn(getLastColumn()); | |||
link.setLastRow(getLastRow()); | |||
return link;*/ | |||
} | |||
/** | |||
* Return the row of the first cell that contains the hyperlink | |||
@@ -240,4 +253,20 @@ public class HSSFHyperlink implements Hyperlink { | |||
public int getType(){ | |||
return link_type; | |||
} | |||
/** | |||
* @return whether the objects have the same HyperlinkRecord | |||
*/ | |||
@Override | |||
public boolean equals(Object other) { | |||
if (this == other) return true; | |||
if (!(other instanceof HSSFHyperlink)) return false; | |||
HSSFHyperlink otherLink = (HSSFHyperlink) other; | |||
return record == otherLink.record; | |||
} | |||
@Override | |||
public int hashCode() { | |||
return record.hashCode(); | |||
} | |||
} |
@@ -35,8 +35,10 @@ import org.apache.poi.hssf.record.DimensionsRecord; | |||
import org.apache.poi.hssf.record.DrawingRecord; | |||
import org.apache.poi.hssf.record.EscherAggregate; | |||
import org.apache.poi.hssf.record.ExtendedFormatRecord; | |||
import org.apache.poi.hssf.record.HyperlinkRecord; | |||
import org.apache.poi.hssf.record.NameRecord; | |||
import org.apache.poi.hssf.record.Record; | |||
import org.apache.poi.hssf.record.RecordBase; | |||
import org.apache.poi.hssf.record.RowRecord; | |||
import org.apache.poi.hssf.record.SCLRecord; | |||
import org.apache.poi.hssf.record.WSBoolRecord; | |||
@@ -2046,6 +2048,45 @@ public final class HSSFSheet implements org.apache.poi.ss.usermodel.Sheet { | |||
public HSSFComment getCellComment(int row, int column) { | |||
return findCellComment(row, column); | |||
} | |||
/** | |||
* Get a Hyperlink in this sheet anchored at row, column | |||
* | |||
* @param row | |||
* @param column | |||
* @return hyperlink if there is a hyperlink anchored at row, column; otherwise returns null | |||
*/ | |||
@Override | |||
public HSSFHyperlink getHyperlink(int row, int column) { | |||
for (Iterator<RecordBase> it = _sheet.getRecords().iterator(); it.hasNext(); ) { | |||
RecordBase rec = it.next(); | |||
if (rec instanceof HyperlinkRecord){ | |||
HyperlinkRecord link = (HyperlinkRecord)rec; | |||
if (link.getFirstColumn() == column && link.getFirstRow() == row) { | |||
return new HSSFHyperlink(link); | |||
} | |||
} | |||
} | |||
return null; | |||
} | |||
/** | |||
* Get a list of Hyperlinks in this sheet | |||
* | |||
* @return Hyperlinks for the sheet | |||
*/ | |||
@Override | |||
public List<HSSFHyperlink> getHyperlinkList() { | |||
final List<HSSFHyperlink> hyperlinkList = new ArrayList<HSSFHyperlink>(); | |||
for (Iterator<RecordBase> it = _sheet.getRecords().iterator(); it.hasNext(); ) { | |||
RecordBase rec = it.next(); | |||
if (rec instanceof HyperlinkRecord){ | |||
HyperlinkRecord link = (HyperlinkRecord)rec; | |||
hyperlinkList.add(new HSSFHyperlink(link)); | |||
} | |||
} | |||
return hyperlinkList; | |||
} | |||
public HSSFSheetConditionalFormatting getSheetConditionalFormatting() { | |||
return new HSSFSheetConditionalFormatting(this); |
@@ -19,7 +19,7 @@ package org.apache.poi.ss.usermodel; | |||
/** | |||
* Represents an Excel hyperlink. | |||
*/ | |||
public interface Hyperlink extends org.apache.poi.common.usermodel.Hyperlink { | |||
public interface Hyperlink extends org.apache.poi.common.usermodel.Hyperlink, Cloneable { | |||
/** | |||
* Return the row of the first cell that contains the hyperlink | |||
* | |||
@@ -75,4 +75,11 @@ public interface Hyperlink extends org.apache.poi.common.usermodel.Hyperlink { | |||
* @param col the 0-based column of the last cell that contains the hyperlink | |||
*/ | |||
public void setLastColumn(int col); | |||
/** | |||
* Create a clone of this hyperlink | |||
* | |||
* @return clone of this Hyperlink | |||
*/ | |||
public Hyperlink clone(); | |||
} |
@@ -1067,4 +1067,20 @@ public interface Sheet extends Iterable<Row> { | |||
* you take it out of them. | |||
*/ | |||
int getColumnOutlineLevel(int columnIndex); | |||
/** | |||
* Get a Hyperlink in this sheet anchored at row, column | |||
* | |||
* @param row | |||
* @param column | |||
* @return hyperlink if there is a hyperlink anchored at row, column; otherwise returns null | |||
*/ | |||
public Hyperlink getHyperlink(int row, int column); | |||
/** | |||
* Get a list of Hyperlinks in this sheet | |||
* | |||
* @return Hyperlinks for the sheet | |||
*/ | |||
public List<? extends Hyperlink> getHyperlinkList(); | |||
} |
@@ -579,6 +579,7 @@ public class SXSSFCell implements Cell { | |||
/** | |||
* @return hyperlink associated with this cell or <code>null</code> if not found | |||
*/ | |||
@Override | |||
public Hyperlink getHyperlink() | |||
{ | |||
return (Hyperlink)getPropertyValue(Property.HYPERLINK); | |||
@@ -590,6 +591,7 @@ public class SXSSFCell implements Cell { | |||
* | |||
* @param link hyperlink associated with this cell | |||
*/ | |||
@Override | |||
public void setHyperlink(Hyperlink link) | |||
{ | |||
if (link == null) { |
@@ -44,6 +44,7 @@ import org.apache.poi.ss.usermodel.Workbook; | |||
import org.apache.poi.ss.util.CellRangeAddress; | |||
import org.apache.poi.ss.util.SheetUtil; | |||
import org.apache.poi.xssf.usermodel.XSSFDataValidation; | |||
import org.apache.poi.xssf.usermodel.XSSFHyperlink; | |||
import org.apache.poi.xssf.usermodel.XSSFSheet; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetFormatPr; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet; | |||
@@ -1326,6 +1327,28 @@ public class SXSSFSheet implements Sheet, Cloneable | |||
{ | |||
return _sh.getCellComment(row, column); | |||
} | |||
/** | |||
* Get a Hyperlink in this sheet anchored at row, column | |||
* | |||
* @param row | |||
* @param column | |||
* @return hyperlink if there is a hyperlink anchored at row, column; otherwise returns null | |||
*/ | |||
@Override | |||
public XSSFHyperlink getHyperlink(int row, int column) { | |||
return _sh.getHyperlink(row, column); | |||
} | |||
/** | |||
* Get a list of Hyperlinks in this sheet | |||
* | |||
* @return Hyperlinks for the sheet | |||
*/ | |||
@Override | |||
public List<XSSFHyperlink> getHyperlinkList() { | |||
return _sh.getHyperlinkList(); | |||
} | |||
/** | |||
* Creates the top-level drawing patriarch. |
@@ -32,9 +32,9 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTHyperlink; | |||
* are largely stored as relations of the sheet | |||
*/ | |||
public class XSSFHyperlink implements Hyperlink { | |||
private int _type; | |||
private PackageRelationship _externalRel; | |||
private CTHyperlink _ctHyperlink; //contains a reference to the cell where the hyperlink is anchored, getRef() | |||
final private int _type; | |||
final private PackageRelationship _externalRel; | |||
final private CTHyperlink _ctHyperlink; //contains a reference to the cell where the hyperlink is anchored, getRef() | |||
private String _location; //what the hyperlink refers to | |||
/** | |||
@@ -45,10 +45,11 @@ public class XSSFHyperlink implements Hyperlink { | |||
protected XSSFHyperlink(int type) { | |||
_type = type; | |||
_ctHyperlink = CTHyperlink.Factory.newInstance(); | |||
_externalRel = null; | |||
} | |||
/** | |||
* Create a XSSFHyperlink amd initialize it from the supplied CTHyperlink bean and package relationship | |||
* Create a XSSFHyperlink and initialize it from the supplied CTHyperlink bean and package relationship | |||
* | |||
* @param ctHyperlink the xml bean containing xml properties | |||
* @param hyperlinkRel the relationship in the underlying OPC package which stores the actual link's address | |||
@@ -91,6 +92,13 @@ public class XSSFHyperlink implements Hyperlink { | |||
} | |||
} | |||
@Override | |||
public Hyperlink clone() { | |||
final XSSFHyperlink clone = new XSSFHyperlink((CTHyperlink) _ctHyperlink.copy(), _externalRel); | |||
clone.setLocation(_location); | |||
return clone; | |||
} | |||
/** | |||
* @return the underlying CTHyperlink object |
@@ -703,6 +703,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { | |||
* @param column | |||
* @return hyperlink if there is a hyperlink anchored at row, column; otherwise returns null | |||
*/ | |||
@Override | |||
public XSSFHyperlink getHyperlink(int row, int column) { | |||
String ref = new CellReference(row, column).formatAsString(); | |||
for(XSSFHyperlink hyperlink : hyperlinks) { | |||
@@ -718,6 +719,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { | |||
* | |||
* @return Hyperlinks for the sheet | |||
*/ | |||
@Override | |||
public List<XSSFHyperlink> getHyperlinkList() { | |||
return Collections.unmodifiableList(hyperlinks); | |||
} |
@@ -18,6 +18,11 @@ | |||
package org.apache.poi.ss.usermodel; | |||
import static org.junit.Assert.assertEquals; | |||
import static org.junit.Assert.assertNotEquals; | |||
import static org.junit.Assert.assertNotSame; | |||
import java.util.List; | |||
import org.junit.Test; | |||
import org.apache.poi.ss.ITestDataProvider; | |||
@@ -91,4 +96,45 @@ public abstract class BaseTestHyperlink { | |||
link = sheet.getRow(3).getCell(0).getHyperlink(); | |||
assertEquals("'Target Sheet'!A1", link.getAddress()); | |||
} | |||
@Test | |||
public void testClone() { | |||
System.out.println("testClone"); | |||
final Workbook wb = _testDataProvider.createWorkbook(); | |||
final CreationHelper createHelper = wb.getCreationHelper(); | |||
final Sheet sheet = wb.createSheet("Hyperlinks"); | |||
final Row row = sheet.createRow(0); | |||
final Cell cell1, cell2; | |||
final Hyperlink link1, link2; | |||
//URL | |||
cell1 = row.createCell(0); | |||
cell2 = row.createCell(1); | |||
cell1.setCellValue("URL Link"); | |||
link1 = createHelper.createHyperlink(Hyperlink.LINK_URL); | |||
link1.setAddress("http://poi.apache.org/"); | |||
cell1.setHyperlink(link1); | |||
link2 = link1.clone(); | |||
// Change address (type is not changeable) | |||
link2.setAddress("http://apache.org/"); | |||
cell2.setHyperlink(link2); | |||
// Make sure hyperlinks were deep-copied, and modifying one does not modify the other. | |||
assertNotSame(link1, link2); | |||
assertNotEquals(link1, link2); | |||
assertEquals("http://poi.apache.org/", link1.getAddress()); | |||
assertEquals("http://apache.org/", link2.getAddress()); | |||
assertEquals(link1, cell1.getHyperlink()); | |||
assertEquals(link2, cell2.getHyperlink()); | |||
// Make sure both hyperlinks were added to the sheet | |||
@SuppressWarnings("unchecked") | |||
final List<Hyperlink> actualHyperlinks = (List<Hyperlink>) sheet.getHyperlinkList(); | |||
assertEquals(2, actualHyperlinks.size()); | |||
assertEquals(link1, actualHyperlinks.get(0)); | |||
assertEquals(link2, actualHyperlinks.get(1)); | |||
} | |||
} |