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/07/30 00:02:09 UTC

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

Author: nick
Date: Tue Jul 29 15:02:09 2008
New Revision: 680857

URL: http://svn.apache.org/viewvc?rev=680857&view=rev
Log:
Improved .xlsm support - still not quite there though

Modified:
    poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
    poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java

Modified: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java?rev=680857&r1=680856&r2=680857&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java (original)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java Tue Jul 29 15:02:09 2008
@@ -80,6 +80,12 @@
 			"/xl/workbook.xml",
 			null
 	);
+	public static final XSSFRelation MACROS_WORKBOOK = new XSSFRelation(
+			"application/vnd.ms-excel.sheet.macroEnabled.main+xml",
+			"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument",
+			"/xl/workbook.xml",
+			null
+	);
 	public static final XSSFRelation WORKSHEET = new XSSFRelation(
 			"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
 			"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet",
@@ -254,6 +260,9 @@
             return rel.getId();
 		}
 	}
+
+	/** Are we a normal workbook, or a macro enabled one? */
+	private boolean isMacroEnabled = false;
 	
     private CTWorkbook workbook;
     
@@ -288,6 +297,10 @@
             WorkbookDocument doc = WorkbookDocument.Factory.parse(getCorePart().getInputStream());
             this.workbook = doc.getWorkbook();
             
+            // Are we macro enabled, or just normal?
+            isMacroEnabled = 
+            		getCorePart().getContentType().equals(MACROS_WORKBOOK.getContentType());
+            
             try {
 	            // Load shared strings
 	            this.sharedStringSource = (SharedStringSource)
@@ -659,6 +672,14 @@
     	}
     	return sr;
 	}
+    
+    /**
+     * Are we a normal workbook (.xlsx), or a 
+     *  macro enabled workbook (.xlsm)?
+     */
+    public boolean isMacroEnabled() {
+    	return isMacroEnabled;
+    }
 
 	public void insertChartRecord() {
         // TODO Auto-generated method stub
@@ -764,16 +785,21 @@
     }
 
     public void write(OutputStream stream) throws IOException {
+    	// What kind of workbook are we?
+    	XSSFRelation workbookRelation = WORKBOOK;
+    	if(isMacroEnabled) {
+    		workbookRelation = MACROS_WORKBOOK;
+    	}
 
         try {
             // Create a package referring the temp file.
             Package pkg = Package.create(stream);
             // Main part
-            PackagePartName corePartName = PackagingURIHelper.createPartName("/xl/workbook.xml");
+            PackagePartName corePartName = PackagingURIHelper.createPartName(workbookRelation.getDefaultFileName());
             // Create main part relationship
             pkg.addRelationship(corePartName, TargetMode.INTERNAL, PackageRelationshipTypes.CORE_DOCUMENT, "rId1");
             // Create main document part
-            PackagePart corePart = pkg.createPart(corePartName, WORKBOOK.getContentType());
+            PackagePart corePart = pkg.createPart(corePartName, workbookRelation.getContentType());
             OutputStream out;
 
             XmlOptions xmlOptions = new XmlOptions();
@@ -840,15 +866,17 @@
             	}
             }
             
-            // VBA Macros
-            if(VBA_MACROS.exists( getCorePart() )) {
-            	// Copy over
-            	try {
-	            	XSSFModel vba = VBA_MACROS.load(getCorePart());
-	            	VBA_MACROS.save(vba, corePart);
-            	} catch(Exception e) {
-            		throw new RuntimeException("Unable to copy vba macros over", e);
-            	}
+            // Macro related bits
+            if(isMacroEnabled) {
+	            // Copy VBA Macros if present
+	            if(VBA_MACROS.exists( getCorePart() )) {
+	            	try {
+		            	XSSFModel vba = VBA_MACROS.load(getCorePart());
+		            	VBA_MACROS.save(vba, corePart);
+	            	} catch(Exception e) {
+	            		throw new RuntimeException("Unable to copy vba macros over", e);
+	            	}
+	            }
             }
 
             // Now we can write out the main Workbook, with

Modified: poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java?rev=680857&r1=680856&r2=680857&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java (original)
+++ poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java Tue Jul 29 15:02:09 2008
@@ -20,6 +20,7 @@
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.FileOutputStream;
 
 import junit.framework.TestCase;
 
@@ -85,6 +86,7 @@
 		Package pkg = Package.open(getFilePath("45431.xlsm"));
 		XSSFWorkbook wb = new XSSFWorkbook(pkg);
 		
+		// Check the various macro related bits can be found
 		PackagePart vba = pkg.getPart(
 				PackagingURIHelper.createPartName("/xl/vbaProject.bin")
 		);
@@ -106,6 +108,10 @@
 		);
 		assertNotNull(vba);
 		
+		FileOutputStream fout = new FileOutputStream("/tmp/foo.xlsm");
+		nwb.write(fout);
+		fout.close();
+		
 		// For testing with excel
 //		FileOutputStream fout = new FileOutputStream("/tmp/foo.xlsm");
 //		nwb.write(fout);



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