You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ni...@apache.org on 2008/04/07 12:31:56 UTC

svn commit: r645446 - in /poi/branches/ooxml: ./ src/ooxml/java/org/apache/poi/xssf/usermodel/ src/ooxml/testcases/org/apache/poi/xssf/usermodel/

Author: nick
Date: Mon Apr  7 03:31:55 2008
New Revision: 645446

URL: http://svn.apache.org/viewvc?rev=645446&view=rev
Log:
Finish off XSSFHyperlink support

Modified:
    poi/branches/ooxml/build.xml
    poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java
    poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFHyperlink.java
    poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
    poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHyperlink.java

Modified: poi/branches/ooxml/build.xml
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/build.xml?rev=645446&r1=645445&r2=645446&view=diff
==============================================================================
--- poi/branches/ooxml/build.xml (original)
+++ poi/branches/ooxml/build.xml Mon Apr  7 03:31:55 2008
@@ -151,8 +151,8 @@
   <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"/>
   <!-- No official release of openxml4j yet -->
-  <property name="ooxml.jar6.dir" location="${ooxml.lib}/openxml4j-bin-alpha-080403.jar"/>
-  <property name="ooxml.jar6.url" value="http://people.apache.org/~nick/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-080407.jar"/>
 
   <!-- See http://www.ecma-international.org/publications/standards/Ecma-376.htm -->
   <!-- "Copy these file(s), free of charge" -->

Modified: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java?rev=645446&r1=645445&r2=645446&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java (original)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java Mon Apr  7 03:31:55 2008
@@ -423,14 +423,20 @@
     /**
      * Creates an XSSFRichTextString for you.
      */
-    public RichTextString createRichTextString(String text) {
-        return new XSSFRichTextString(text);
-    }
-
-    public Hyperlink getHyperlink() {
-        return row.getSheet().getHyperlink(row.getRowNum(), cellNum);
-    }
-    public void setHyperlink(Hyperlink hyperlink) {
-        row.getSheet().setCellHyperlink((XSSFHyperlink)hyperlink);
-    }
+	public RichTextString createRichTextString(String text) {
+		return new XSSFRichTextString(text);
+	}
+	
+	public Hyperlink getHyperlink() {
+		return row.getSheet().getHyperlink(row.getRowNum(), cellNum);
+	}
+	public void setHyperlink(Hyperlink hyperlink) {
+		XSSFHyperlink link = (XSSFHyperlink)hyperlink;
+		
+		// Assign to us
+		link.setCellReference( new CellReference(row.getRowNum(), cellNum).formatAsString() );
+		
+		// Add to the lists
+		row.getSheet().setCellHyperlink(link);
+	}
 }

Modified: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFHyperlink.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFHyperlink.java?rev=645446&r1=645445&r2=645446&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFHyperlink.java (original)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFHyperlink.java Mon Apr  7 03:31:55 2008
@@ -22,7 +22,6 @@
 import org.apache.poi.ss.util.CellReference;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTHyperlink;
 
-import org.openxml4j.opc.Package;
 import org.openxml4j.opc.PackagePart;
 import org.openxml4j.opc.PackageRelationship;
 
@@ -46,7 +45,7 @@
 		this.ctHyperlink = ctHyperlink;
 		this.externalRel = hyperlinkRel;
 		
-		// Figure out the Hyperlink type
+		// Figure out the Hyperlink type and distination
 		
 		// If it has a location, it's internal
 		if(ctHyperlink.getLocation() != null) {
@@ -62,10 +61,19 @@
 					throw new IllegalStateException("A sheet hyperlink must either have a location, or a relationship. Found:\n" + ctHyperlink);
 				}
 			}
-			// TODO
 			
-			//URI target = externalRel.getTargetURI();
-			//location = target.toString();
+			URI target = externalRel.getTargetURI();
+			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 @@
 	 */
 	protected void generateRelationIfNeeded(PackagePart sheetPart) {
 		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 @@
 		location = address;
 	}
 
+	/**
+	 * Assigns this hyperlink to the given cell reference
+	 */
+	protected void setCellReference(String ref) {
+		ctHyperlink.setRef(ref);
+	}
+	
 	private CellReference buildCellReference() {
 		return new CellReference(ctHyperlink.getRef());
 	}

Modified: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java?rev=645446&r1=645445&r2=645446&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java (original)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java Mon Apr  7 03:31:55 2008
@@ -180,10 +180,9 @@
     			hyperRel = hyperRels.getRelationshipByID(hyperlink.getId());
     		}
     		
-    		// TODO: fix openxml4j
-//    		hyperlinks.add(
-//    				new XSSFHyperlink(hyperlink, hyperRel)
-//    		);
+    		hyperlinks.add(
+    				new XSSFHyperlink(hyperlink, hyperRel)
+    		);
     	}
     }
     

Modified: poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHyperlink.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHyperlink.java?rev=645446&r1=645445&r2=645446&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHyperlink.java (original)
+++ poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHyperlink.java Mon Apr  7 03:31:55 2008
@@ -23,6 +23,10 @@
 
 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;
 
 public class TestXSSFHyperlink extends TestCase {
@@ -52,8 +56,9 @@
 		
 		XSSFSheet sheet = (XSSFSheet)workbook.getSheetAt(0);
 
-		// TODO - check hyperlinks
-		//assertEquals(4, sheet.getNumHyperlinks());
+		// Check the hyperlinks
+		assertEquals(4, sheet.getNumHyperlinks());
+		doTestHyperlinkContents(sheet);
 	}
 
     public void testLoadSave() throws Exception {
@@ -64,9 +69,14 @@
 		assertTrue(xml.exists());
     	
 		XSSFWorkbook workbook = new XSSFWorkbook(xml.toString());
+		CreationHelper createHelper = workbook.getCreationHelper();
 		assertEquals(3, workbook.getNumberOfSheets());
+		XSSFSheet sheet = (XSSFSheet)workbook.getSheetAt(0);
 
-		// TODO - check hyperlinks
+		// Check hyperlinks
+		assertEquals(4, sheet.getNumHyperlinks());
+		doTestHyperlinkContents(sheet);
+		
 		
 		// Write out, and check
 		ByteArrayOutputStream baos = new ByteArrayOutputStream();
@@ -79,8 +89,99 @@
 		assertNotNull(wb2.getSheetAt(0));
 		assertNotNull(wb2.getSheetAt(1));
 		assertNotNull(wb2.getSheetAt(2));
+		
+		sheet = (XSSFSheet)wb2.getSheetAt(0);
 
-		// TODO
+		
+		// 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());
     }
-    
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org