case FileSharingRecord.sid:
retval = new FileSharingRecord( in );
break;
+ case HyperlinkRecord.sid:
+ retval = new HyperlinkRecord( in );
+ break;
default:
retval = new UnknownRecord( in );
}
field_5_unknown = new byte[16];
try {
in.read(field_5_unknown);
- } catch(IOException e) { throw new IllegalStateException(e); }
+ } catch(IOException e) { throw new IllegalStateException(e.getMessage()); }
// Some sort of opts
field_6_label_opts = in.readInt();
field_10_unknown = new byte[16];
try {
in.read(field_10_unknown);
- } catch(IOException e) { throw new IllegalStateException(e); }
+ } catch(IOException e) { throw new IllegalStateException(e.getMessage()); }
// Might need to nudge the length by one byte
// This is an empirical hack!
}
// Finally it's the URL
- field_12_url = in.readUnicodeLEString(field_7_url_len);
+ int strlen = field_7_url_len > (in.remaining()/2) ? (in.remaining()/2) : field_7_url_len;
+ field_12_url = in.readUnicodeLEString(strlen);
}
/* (non-Javadoc)
this.field_12_url = url + '\u0000';
this.field_7_url_len = field_12_url.length();
}
+
+ public int getOptions(){
+ return field_11_url_opts;
+ }
}
import org.apache.poi.hssf.model.FormulaParser;
import org.apache.poi.hssf.model.Sheet;
import org.apache.poi.hssf.model.Workbook;
-import org.apache.poi.hssf.record.BlankRecord;
-import org.apache.poi.hssf.record.BoolErrRecord;
-import org.apache.poi.hssf.record.CellValueRecordInterface;
-import org.apache.poi.hssf.record.CommonObjectDataSubRecord;
-import org.apache.poi.hssf.record.ExtendedFormatRecord;
-import org.apache.poi.hssf.record.FormulaRecord;
-import org.apache.poi.hssf.record.LabelSSTRecord;
-import org.apache.poi.hssf.record.NoteRecord;
-import org.apache.poi.hssf.record.NumberRecord;
-import org.apache.poi.hssf.record.ObjRecord;
-import org.apache.poi.hssf.record.Record;
-import org.apache.poi.hssf.record.SubRecord;
-import org.apache.poi.hssf.record.TextObjectRecord;
-import org.apache.poi.hssf.record.UnicodeString;
+import org.apache.poi.hssf.record.*;
import org.apache.poi.hssf.record.aggregates.FormulaRecordAggregate;
import org.apache.poi.hssf.record.formula.Ptg;
}
return comment;
}
+
+ /**
+ * Returns hyperlink associated with this cell
+ *
+ * @return hyperlink associated with this cell or null if not found
+ */
+ public HSSFHyperlink getHyperlink(){
+ for (Iterator it = sheet.getRecords().iterator(); it.hasNext(); ) {
+ Record rec = ( Record ) it.next();
+ if (rec instanceof HyperlinkRecord){
+ HyperlinkRecord link = (HyperlinkRecord)rec;
+ if(link.getColumn() == record.getColumn() && link.getRow() == record.getRow()){
+ return new HSSFHyperlink(link);
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Assign a hypelrink to this cell
+ *
+ * @param link hypelrink associated with this cell
+ */
+ public void setHyperlink(HSSFHyperlink link){
+
+ }
}
--- /dev/null
+/* ====================================================================\r
+ Licensed to the Apache Software Foundation (ASF) under one or more\r
+ contributor license agreements. See the NOTICE file distributed with\r
+ this work for additional information regarding copyright ownership.\r
+ The ASF licenses this file to You under the Apache License, Version 2.0\r
+ (the "License"); you may not use this file except in compliance with\r
+ the License. You may obtain a copy of the License at\r
+\r
+ http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+ Unless required by applicable law or agreed to in writing, software\r
+ distributed under the License is distributed on an "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ See the License for the specific language governing permissions and\r
+ limitations under the License.\r
+==================================================================== */\r
+package org.apache.poi.hssf.usermodel;\r
+\r
+import org.apache.poi.hssf.record.EscherAggregate;\r
+import org.apache.poi.hssf.record.NoteRecord;\r
+import org.apache.poi.hssf.record.TextObjectRecord;\r
+import org.apache.poi.hssf.record.HyperlinkRecord;\r
+import org.apache.poi.ddf.*;\r
+\r
+import java.util.Map;\r
+import java.util.List;\r
+import java.util.Iterator;\r
+\r
+/**\r
+ * Represents a hyperlink.\r
+ *\r
+ * @author Yegor Kozlov\r
+ */\r
+public class HSSFHyperlink {\r
+\r
+ /**\r
+ * Link to a existing file or web page\r
+ */\r
+ public static final int LINK_URL = 1;\r
+\r
+ /**\r
+ * Link to a place in this document\r
+ */\r
+ public static final int LINK_DOCUMENT = 2;\r
+\r
+ /**\r
+ * Link to an E-mail address\r
+ */\r
+ public static final int LINK_EMAIL = 3;\r
+\r
+ /**\r
+ * Unknown type\r
+ */\r
+ public static final int LINK_UNKNOWN = 4;\r
+\r
+ /**\r
+ * Low-level record object that stores the actual hyperlink data\r
+ */\r
+ private HyperlinkRecord record = null;\r
+\r
+ protected HSSFHyperlink( HyperlinkRecord record )\r
+ {\r
+ this.record = record;\r
+ }\r
+\r
+ /**\r
+ * Return the row of the cell that contains the hyperlink\r
+ *\r
+ * @return the 0-based row of the cell that contains the hyperlink\r
+ */\r
+ public int getRow(){\r
+ return record.getRow();\r
+ }\r
+\r
+ /**\r
+ * Set the row of the cell that contains the hyperlink\r
+ *\r
+ * @param row the 0-based row of the cell that contains the hyperlink\r
+ */\r
+ public void setRow(int row){\r
+ record.setRow(row);\r
+ }\r
+\r
+ /**\r
+ * Return the column of the cell that contains the hyperlink\r
+ *\r
+ * @return the 0-based column of the cell that contains the hyperlink\r
+ */\r
+ public short getColumn(){\r
+ return record.getColumn();\r
+ }\r
+\r
+ /**\r
+ * Set the column of the cell that contains the hyperlink\r
+ *\r
+ * @param col the 0-based column of the cell that contains the hyperlink\r
+ */\r
+ public void setColumn(short col){\r
+ record.setColumn(col);\r
+ }\r
+\r
+ /**\r
+ * Hypelink address. Depending on the hyperlink type it can be URL, e-mail, etc.\r
+ *\r
+ * @return the address of this hyperlink\r
+ */\r
+ public String getAddress(){\r
+ return record.getUrlString();\r
+ }\r
+\r
+ /**\r
+ * Return text to display for this hyperlink\r
+ *\r
+ * @return text to display\r
+ */\r
+ public String getLabel(){\r
+ return record.getLabel();\r
+ }\r
+\r
+ /**\r
+ * Return the type of this hyperlink\r
+ *\r
+ * @return the type of this hyperlink\r
+ */\r
+ public int getType(){\r
+ throw new RuntimeException("Not implemented");\r
+ }\r
+}\r
assertTrue("Bottom Border", (cs.getBorderBottom() == (short)1));
in.close();
- }
-
- public void BROKENtestWithHyperlink() throws Exception {
+ }
+
+ /**
+ * Test reading hyperlinks
+ */
+ public void testWithHyperlink() throws Exception {
String dir = System.getProperty("HSSF.testdata.path");
File f = new File(dir, "WithHyperlink.xls");
HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(f));
-
- assertEquals(3, wb.getNumberOfSheets());
-
- // Find our hyperlink record, and check they're
- // as we'd expect
- List records = wb.getWorkbook().getHyperlinks();
- assertEquals(1, records.size());
-
- HyperlinkRecord link = (HyperlinkRecord)
- records.get(0);
- assertNotNull(link);
-
- // Is in A5
- assertEquals("Foo", link.getLabel());
- assertEquals("http://poi.apache.org/", link.getUrlString());
- assertEquals(4, link.getRow());
- assertEquals(0, link.getColumn());
-
- // Now check at the HSSFCell level
- assertEquals(3, wb.getNumberOfSheets());
-
- HSSFSheet s = wb.getSheetAt(1);
- HSSFRow r = s.getRow(4);
- assertNotNull(r);
- HSSFCell c = r.getCell((short)0);
+
+ HSSFSheet sheet = wb.getSheetAt(0);
+ HSSFCell cell = sheet.getRow(4).getCell((short)0);
+ HSSFHyperlink link = cell.getHyperlink();
+ assertNotNull(link);
+
+ assertEquals("Foo", link.getLabel());
+ assertEquals("http://poi.apache.org/", link.getAddress());
+ assertEquals(4, link.getRow());
+ assertEquals(0, link.getColumn());
}
- public void BROKENtestWithTwoHyperlinks() throws Exception {
+ /**
+ * Test reading hyperlinks
+ */
+ public void testWithTwoHyperlinks() throws Exception {
String dir = System.getProperty("HSSF.testdata.path");
File f = new File(dir, "WithTwoHyperLinks.xls");
HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(f));
- assertEquals(3, wb.getNumberOfSheets());
-
- // Find our hyperlink record, and check they're
- // as we'd expect
- List records = wb.getWorkbook().getHyperlinks();
- assertEquals(2, records.size());
-
- HyperlinkRecord linkA = (HyperlinkRecord)
- records.get(0);
- HyperlinkRecord linkB = (HyperlinkRecord)
- records.get(1);
- assertNotNull(linkA);
- assertNotNull(linkB);
-
- // Is in A5
- assertEquals("Foo", linkA.getLabel());
- assertEquals("http://poi.apache.org/", linkA.getUrlString());
- assertEquals(4, linkA.getRow());
- assertEquals(0, linkA.getColumn());
-
- // Is in B9
- assertEquals("Bar", linkB.getLabel());
- assertEquals("http://poi.apache.org/", linkB.getUrlString());
- assertEquals(8, linkB.getRow());
- assertEquals(1, linkB.getColumn());
-
- // Now check at the HSSFCell level
- assertEquals(3, wb.getNumberOfSheets());
-
- HSSFSheet s = wb.getSheetAt(1);
- HSSFRow r = s.getRow(4);
- assertNotNull(r);
- HSSFCell c = r.getCell((short)0);
+ HSSFSheet sheet = wb.getSheetAt(0);
+
+ HSSFCell cell1 = sheet.getRow(4).getCell((short)0);
+ HSSFHyperlink link1 = cell1.getHyperlink();
+ assertNotNull(link1);
+ assertEquals("Foo", link1.getLabel());
+ assertEquals("http://poi.apache.org/", link1.getAddress());
+ assertEquals(4, link1.getRow());
+ assertEquals(0, link1.getColumn());
+
+ HSSFCell cell2 = sheet.getRow(8).getCell((short)1);
+ HSSFHyperlink link2 = cell2.getHyperlink();
+ assertNotNull(link2);
+ assertEquals("Bar", link2.getLabel());
+ assertEquals("http://poi.apache.org/", link2.getAddress());
+ assertEquals(8, link2.getRow());
+ assertEquals(1, link2.getColumn());
+
}
/*tests the toString() method of HSSFCell*/