You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ye...@apache.org on 2008/09/30 15:57:37 UTC

svn commit: r700472 [3/3] - in /poi/branches/ooxml/src: examples/src/org/apache/poi/xssf/usermodel/examples/ ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/ ooxml/java/org/apache/poi/ ooxml/java/org/apache/poi/util/ ooxml/java/org/apache/poi/xssf/d...

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=700472&r1=700471&r2=700472&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 Sep 30 06:57:36 2008
@@ -18,16 +18,15 @@
 package org.apache.poi.xssf.usermodel;
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.LinkedList;
 import java.util.List;
-
+import java.util.HashMap;
+import java.util.Iterator;
 import javax.xml.namespace.QName;
-
 import org.apache.poi.POIXMLDocument;
-import org.apache.poi.ss.usermodel.CommentsSource;
-import org.apache.poi.ss.usermodel.CreationHelper;
+import org.apache.poi.POIXMLDocumentPart;
+import org.apache.poi.POIXMLFactory;
 import org.apache.poi.ss.usermodel.Palette;
 import org.apache.poi.ss.usermodel.PictureData;
 import org.apache.poi.ss.usermodel.Row;
@@ -37,19 +36,15 @@
 import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
+import org.apache.poi.util.PackageHelper;
 import org.apache.poi.xssf.model.*;
-import org.apache.xmlbeans.XmlException;
+import org.apache.poi.POIXMLException;
 import org.apache.xmlbeans.XmlObject;
 import org.apache.xmlbeans.XmlOptions;
 import org.openxml4j.exceptions.InvalidFormatException;
+import org.openxml4j.exceptions.OpenXML4JException;
+import org.openxml4j.opc.*;
 import org.openxml4j.opc.Package;
-import org.openxml4j.opc.PackagePart;
-import org.openxml4j.opc.PackagePartName;
-import org.openxml4j.opc.PackageRelationship;
-import org.openxml4j.opc.PackageRelationshipCollection;
-import org.openxml4j.opc.PackageRelationshipTypes;
-import org.openxml4j.opc.PackagingURIHelper;
-import org.openxml4j.opc.TargetMode;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBookView;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBookViews;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedName;
@@ -57,137 +52,203 @@
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDialogsheet;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTXf;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.WorkbookDocument;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.WorksheetDocument;
-
-
-public class XSSFWorkbook extends POIXMLDocument implements Workbook {
-	/** Are we a normal workbook, or a macro enabled one? */
-	private boolean isMacroEnabled = false;
-
-	private CTWorkbook workbook;
 
-	private List<XSSFSheet> sheets = new LinkedList<XSSFSheet>();
-	private List<XSSFName> namedRanges = new LinkedList<XSSFName>();
-
-	private SharedStringSource sharedStringSource;
-	private StylesSource stylesSource;
-
-	private List<ThemeTable> themes = new LinkedList<ThemeTable>();
-
-	private MissingCellPolicy missingCellPolicy = Row.RETURN_NULL_AND_BLANK;
+/**
+ * High level representation of a SpreadsheetML workbook.  This is the first object most users
+ * will construct whether they are reading or writing a workbook.  It is also the
+ * top level object for creating new sheets/etc.
+ */
+public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<XSSFSheet> {
+
+    /**
+     * The underlying XML bean
+     */
+    private CTWorkbook workbook;
+
+    /**
+     * this holds the XSSFSheet objects attached to this workbook
+     */
+    private List<XSSFSheet> sheets;
+
+    /**
+     * this holds the XSSFName objects attached to this workbook
+     */
+    private List<XSSFName> namedRanges;
+
+    /**
+     * shared string table - a cache of strings in this workbook
+     */
+    private SharedStringsTable sharedStringSource;
+
+    /**
+     * A collection of shared objects used for styling content,
+     * e.g. fonts, cell styles, colors, etc.
+     */
+    private StylesSource stylesSource;
+
+    /**
+     * Used to keep track of the data formatter so that all
+     * createDataFormatter calls return the same one for a given
+     * book.  This ensures that updates from one places is visible
+     * someplace else.
+     */
+    private XSSFDataFormat formatter;
+
+    /**
+     * The policy to apply in the event of missing or
+     *  blank cells when fetching from a row.
+     * See {@link org.apache.poi.ss.usermodel.Row.MissingCellPolicy}
+     */
+    private MissingCellPolicy missingCellPolicy = Row.RETURN_NULL_AND_BLANK;
 
 	private static POILogger log = POILogFactory.getLogger(XSSFWorkbook.class);
 
+    /**
+     * Create a new SpreadsheetML workbook.
+     */
 	public XSSFWorkbook() {
-		this.workbook = CTWorkbook.Factory.newInstance();
-		CTBookViews bvs = this.workbook.addNewBookViews();
-		CTBookView bv = bvs.addNewWorkbookView();
-		bv.setActiveTab(0);
-		this.workbook.addNewSheets();
-
-		// We always require styles and shared strings
-		sharedStringSource = new SharedStringsTable();
-		stylesSource = new StylesTable();
+        super();
+        try {
+            newWorkbook();
+        }catch (Exception e){
+            throw new POIXMLException(e);
+        }
 	}
 
+    /**
+     * Constructs a XSSFWorkbook object given a file name.
+     *
+     * @param      path   the file name.
+     */
 	public XSSFWorkbook(String path) throws IOException {
 		this(openPackage(path));
 	}
-	public XSSFWorkbook(InputStream  is) throws IOException {
-		this(openPackage(is));
-	}
 
-	public XSSFWorkbook(Package pkg) throws IOException {
-		super(pkg);
+    /**
+     * Constructs a XSSFWorkbook object given a OpenXML4J <code>Package</code> object,
+     * see <a href="http://openxml4j.org/">www.openxml4j.org</a>.
+     *
+     * @param pkg the OpenXML4J <code>Package</code> object.
+     */
+    public XSSFWorkbook(Package pkg) throws IOException {
+        super();
+        if(pkg.getPackageAccess() == PackageAccess.READ){
+            //current implementation of OpenXML4J is funny.
+            //Packages opened by Package.open(InputStream is) are read-only,
+            //there is no way to change or even save such an instance in a OutputStream.
+            //The workaround is to create a copy via a temp file
+            try {
+                Package tmp = PackageHelper.clone(pkg);
+                initialize(tmp);
+            } catch (OpenXML4JException e){
+                throw new POIXMLException(e);
+            }
+        } else {
+            initialize(pkg);
+        }
+    }
+
+    /**
+     * Initialize this workbook from the specified Package
+     */
+    @Override
+    protected void initialize(Package pkg) throws IOException {
+        super.initialize(pkg);
+
 		try {
-			WorkbookDocument doc = WorkbookDocument.Factory.parse(getCorePart().getInputStream());
+            //build the POIXMLDocumentPart tree, this workbook is the root
+            read(new XSSFFactory());
+
+            PackagePart corePart = getCorePart();
+
+            WorkbookDocument doc = WorkbookDocument.Factory.parse(corePart.getInputStream());
 			this.workbook = doc.getWorkbook();
 
-			// Are we macro enabled, or just normal?
-			isMacroEnabled =
-					getCorePart().getContentType().equals(XSSFRelation.MACROS_WORKBOOK.getContentType());
-
-			try {
-				// Load shared strings
-				sharedStringSource = XSSFRelation.SHARED_STRINGS.load(getCorePart());
-			} catch(Exception e) {
-				throw new IOException("Unable to load shared strings - " + e.toString());
-			}
-			try {
-				// Load styles source
-				stylesSource = XSSFRelation.STYLES.load(getCorePart());
-			} catch(Exception e) {
-				e.printStackTrace();
-				throw new IOException("Unable to load styles - " + e.toString());
+            HashMap<String, XSSFSheet> shIdMap = new HashMap<String, XSSFSheet>();
+            for(POIXMLDocumentPart p : getRelations()){
+                if(p instanceof SharedStringsTable) sharedStringSource = (SharedStringsTable)p;
+                else if(p instanceof StylesSource) stylesSource = (StylesSource)p;
+                else if (p instanceof XSSFSheet) {
+                    shIdMap.put(p.getPackageRelationship().getId(), (XSSFSheet)p);
+			    }
 			}
-			try {
-				// Load themes
-				themes = XSSFRelation.THEME.loadAll(getCorePart());
-			} catch(Exception e) {
-				throw new IOException("Unable to load shared strings - " + e.toString());
-			}
-
 			// Load individual sheets
+            sheets = new LinkedList<XSSFSheet>();
 			for (CTSheet ctSheet : this.workbook.getSheets().getSheetArray()) {
-				PackagePart part = getPackagePart(ctSheet);
-				if (part == null) {
+                String id = ctSheet.getId();
+                XSSFSheet sh = shIdMap.get(id);
+                sh.sheet = ctSheet;
+                if(sh == null) {
 					log.log(POILogger.WARN, "Sheet with name " + ctSheet.getName() + " and r:id " + ctSheet.getId()+ " was defined, but didn't exist in package, skipping");
 					continue;
 				}
+                //initialize internal arrays of rows and columns
+                sh.initialize();
 
-				// Load child streams of the sheet
-				List<CommentsTable> childModels;
-				CommentsSource comments = null;
-				List<Drawing> drawings;
-				List<Control> controls;
-				try {
-					// Get the comments for the sheet, if there are any
-					childModels = XSSFRelation.SHEET_COMMENTS.loadAll(part);
-					if(childModels.size() > 0) {
-						comments = childModels.get(0);
-					}
-
-					// Get the drawings for the sheet, if there are any
-					drawings = XSSFRelation.VML_DRAWINGS.loadAll(part);
-					// Get the activeX controls for the sheet, if there are any
-					controls = XSSFRelation.ACTIVEX_CONTROLS.loadAll(part);
-				} catch(Exception e) {
-					throw new RuntimeException("Unable to construct child part",e);
-				}
-
-				// Now create the sheet
-				WorksheetDocument worksheetDoc = WorksheetDocument.Factory.parse(part.getInputStream());
-				XSSFSheet sheet = new XSSFSheet(ctSheet, worksheetDoc.getWorksheet(), this, comments, drawings, controls);
-				this.sheets.add(sheet);
-
+                PackagePart sheetPart = sh.getPackagePart();
 				// Process external hyperlinks for the sheet,
 				//  if there are any
 				PackageRelationshipCollection hyperlinkRels =
-					part.getRelationshipsByType(XSSFRelation.SHEET_HYPERLINKS.getRelation());
-				sheet.initHyperlinks(hyperlinkRels);
+                	sheetPart.getRelationshipsByType(XSSFRelation.SHEET_HYPERLINKS.getRelation());
+                sh.initHyperlinks(hyperlinkRels);
 
 				// Get the embeddings for the workbook
-				for(PackageRelationship rel : part.getRelationshipsByType(XSSFRelation.OLEEMBEDDINGS.getRelation()))
+                for(PackageRelationship rel : sheetPart.getRelationshipsByType(XSSFRelation.OLEEMBEDDINGS.getRelation()))
 					embedds.add(getTargetPart(rel)); // TODO: Add this reference to each sheet as well
 
-				for(PackageRelationship rel : part.getRelationshipsByType(XSSFRelation.PACKEMBEDDINGS.getRelation()))
+                for(PackageRelationship rel : sheetPart.getRelationshipsByType(XSSFRelation.PACKEMBEDDINGS.getRelation()))
 					embedds.add(getTargetPart(rel));
-			}
-		} catch (XmlException e) {
-			throw new IOException(e.toString());
-		} catch (InvalidFormatException e) {
-			throw new IOException(e.toString());
-		}
 
-		// Process the named ranges
-		if(workbook.getDefinedNames() != null) {
-			for(CTDefinedName ctName : workbook.getDefinedNames().getDefinedNameArray()) {
-				namedRanges.add(new XSSFName(ctName, this));
+                sheets.add(sh);
 			}
-		}
+
+            if(sharedStringSource == null) {
+                //Create SST if it is missing
+                sharedStringSource = (SharedStringsTable)createRelationship(XSSFRelation.SHARED_STRINGS, SharedStringsTable.class);
+		    }
+
+		    // Process the named ranges
+            namedRanges = new LinkedList<XSSFName>();
+            if(workbook.getDefinedNames() != null) {
+                for(CTDefinedName ctName : workbook.getDefinedNames().getDefinedNameArray()) {
+                    namedRanges.add(new XSSFName(ctName, this));
+                }
+		    }
+
+        } catch (Exception e) {
+            throw new POIXMLException(e);
+        }
+    }
+
+    /**
+     * Create a new SpreadsheetML OOXML package and setup the default minimal content
+     */
+    protected void newWorkbook() throws IOException, OpenXML4JException{
+        Package pkg = Package.create(PackageHelper.createTempFile());
+        // Main part
+        PackagePartName corePartName = PackagingURIHelper.createPartName(XSSFRelation.WORKBOOK.getDefaultFileName());
+        // Create main part relationship
+        pkg.addRelationship(corePartName, TargetMode.INTERNAL, PackageRelationshipTypes.CORE_DOCUMENT);
+        // Create main document part
+        pkg.createPart(corePartName, XSSFRelation.WORKBOOK.getContentType());
+
+        pkg.getPackageProperties().setCreatorProperty("Apache POI");
+
+        super.initialize(pkg);
+
+        workbook = CTWorkbook.Factory.newInstance();
+        CTBookViews bvs = workbook.addNewBookViews();
+        CTBookView bv = bvs.addNewWorkbookView();
+        bv.setActiveTab(0);
+        workbook.addNewSheets();
+
+        sharedStringSource = (SharedStringsTable)createRelationship(XSSFRelation.SHARED_STRINGS, SharedStringsTable.class);
+        stylesSource = (StylesTable)createRelationship(XSSFRelation.STYLES, StylesTable.class);
+
+        namedRanges = new LinkedList<XSSFName>();
+        sheets = new LinkedList<XSSFSheet>();
 	}
 
 	/**
@@ -199,22 +260,6 @@
 		return this.workbook;
 	}
 
-	/**
-	 * Get the PackagePart corresponding to a given sheet.
-	 *
-	 * @param ctSheet The sheet
-	 * @return A PackagePart, or null if no matching part found.
-	 * @throws InvalidFormatException
-	 */
-	private PackagePart getPackagePart(CTSheet ctSheet) throws InvalidFormatException {
-		PackageRelationship rel = this.getCorePart().getRelationship(ctSheet.getId());
-		if (rel == null) {
-			log.log(POILogger.WARN, "No relationship found for sheet " + ctSheet.getId() + " - core part has " + this.getCorePart().getRelationships().size() + " relations defined");
-			return null;
-		}
-		return getTargetPart(rel);
-	}
-
 	public int addPicture(byte[] pictureData, int format) {
 		// TODO Auto-generated method stub
 		return 0;
@@ -252,6 +297,11 @@
 		return null;
 	}
 
+    /**
+     * Create a new XSSFCellStyle and add it to the workbook's style table
+     *
+     * @return the new XSSFCellStyle object
+     */
 	public XSSFCellStyle createCellStyle() {
 		CTXf xf=CTXf.Factory.newInstance();
 		xf.setNumFmtId(0);
@@ -265,53 +315,93 @@
 		return style;
 	}
 
-	public XSSFDataFormat createDataFormat() {
-		return (XSSFDataFormat)getCreationHelper().createDataFormat();
-	}
-
+    /**
+     * Returns the instance of XSSFDataFormat for this workbook.
+     *
+     * @return the XSSFDataFormat object
+     * @see org.apache.poi.ss.usermodel.DataFormat
+     */
+    public XSSFDataFormat createDataFormat() {
+        if (formatter == null)
+            formatter = new XSSFDataFormat(stylesSource);
+        return formatter;
+    }
+
+    /**
+     * create a new Font and add it to the workbook's font table
+     *
+     * @return new font object
+     */
 	public XSSFFont createFont() {
 		XSSFFont font= new XSSFFont();
 		stylesSource.putFont(font);
 		return font;
 	}
 
+    /**
+     * Creates a new named range and add it to the model
+     *
+     * @return named range high level
+     */
 	public XSSFName createName() {
 		XSSFName name = new XSSFName(this);
 		namedRanges.add(name);
 		return name;
 	}
 
+    /**
+     * create an XSSFSheet for this workbook, adds it to the sheets and returns
+     * the high level representation.  Use this to create new sheets.
+     *
+     * @return XSSFSheet representing the new sheet.
+     */
 	public XSSFSheet createSheet() {
 		String sheetname = "Sheet" + (sheets.size() + 1);
 		return createSheet(sheetname);
 	}
 
+    /**
+     * create an XSSFSheet for this workbook, adds it to the sheets and returns
+     * the high level representation.  Use this to create new sheets.
+     *
+     * @param sheetname  sheetname to set for the sheet, can't be duplicate, greater than 31 chars or contain /\?*[]
+     * @return XSSFSheet representing the new sheet.
+     */
 	public XSSFSheet createSheet(String sheetname) {
 		if (doesContainsSheetName( sheetname, sheets.size() ))
 	   		throw new IllegalArgumentException( "The workbook already contains a sheet of this name" );
-		return createSheet(sheetname, XSSFSheet.newInstance());
-	}
 
-	public XSSFSheet createSheet(String sheetname, CTWorksheet worksheet) {
+        int sheetNumber = getNumberOfSheets() + 1;
+        XSSFSheet wrapper = (XSSFSheet)createRelationship(XSSFRelation.WORKSHEET, XSSFSheet.class, sheetNumber);
+        wrapper.setParent(this);
+
 		CTSheet sheet = addSheet(sheetname);
-		XSSFSheet wrapper = new XSSFSheet(sheet, worksheet, this);
+        wrapper.sheet = sheet;
+        sheet.setId(wrapper.getPackageRelationship().getId());
+        sheet.setSheetId(sheetNumber);
+
 		this.sheets.add(wrapper);
 		return wrapper;
 	}
 
-	public XSSFSheet createDialogsheet(String sheetname, CTDialogsheet dialogsheet) {
-	CTSheet sheet = addSheet(sheetname);
-	XSSFDialogsheet wrapper = new XSSFDialogsheet(sheet, dialogsheet, this);
-	this.sheets.add(wrapper);
-	return wrapper;
+    protected XSSFSheet createDialogsheet(String sheetname, CTDialogsheet dialogsheet) {
+        CTSheet sheet = addSheet(sheetname);
+        XSSFDialogsheet wrapper = new XSSFDialogsheet(sheet, dialogsheet, this);
+        this.sheets.add(wrapper);
+        return wrapper;
 	}
 
 	private CTSheet addSheet(String sheetname) {
-		CTSheet sheet = workbook.getSheets().addNewSheet();
+		validateSheetName(sheetname);
+
+        CTSheet sheet = workbook.getSheets().addNewSheet();
 		sheet.setName(sheetname);
 		return sheet;
 	}
 
+    /**
+     * Finds a font that matches the one with the supplied attributes
+     */
 	public XSSFFont findFont(short boldWeight, short color, short fontHeight, String name, boolean italic, boolean strikeout, short typeOffset, byte underline) {
 		short fontNum=getNumberOfFonts();
 		for (short i = 0; i < fontNum; i++) {
@@ -344,34 +434,43 @@
 		return index.intValue();
 	}
 
+    /**
+     * Gets all embedded OLE2 objects from the Workbook.
+     *
+     * @return the list of embedded objects (a list of {@link org.openxml4j.opc.PackagePart} objects.)
+     */
 	public List getAllEmbeddedObjects() {
-		// TODO Auto-generated method stub
-		return null;
+        return embedds;
 	}
 
+    /**
+     * Gets all pictures from the Workbook.
+     *
+     * @return the list of pictures (a list of {@link XSSFPictureData} objects.)
+     */
 	public List<PictureData> getAllPictures() {
 		// In OOXML pictures are referred to in sheets
 		List<PictureData> pictures = new LinkedList<PictureData>();
-		for (CTSheet ctSheet : this.workbook.getSheets().getSheetArray()) {
-			try {
-				PackagePart sheetPart = getPackagePart(ctSheet);
-				if (sheetPart == null) {
-					continue;
-				}
-				PackageRelationshipCollection prc = sheetPart.getRelationshipsByType(XSSFRelation.DRAWINGS.getRelation());
-				for (PackageRelationship rel : prc) {
-					PackagePart drawingPart = getTargetPart(rel);
-					PackageRelationshipCollection prc2 = drawingPart.getRelationshipsByType(XSSFRelation.IMAGES.getRelation());
-					for (PackageRelationship rel2 : prc2) {
-						PackagePart imagePart = getTargetPart(rel2);
-						XSSFPictureData pd = new XSSFPictureData(imagePart);
-						pictures.add(pd);
-					}
-				}
-			} catch (InvalidFormatException e) {
-				throw new RuntimeException(e.getMessage(), e);
-			}
-		}
+        for(POIXMLDocumentPart p : getRelations()){
+            if (p instanceof XSSFSheet) {
+                PackagePart sheetPart = p.getPackagePart();
+                try {
+                    PackageRelationshipCollection prc = sheetPart.getRelationshipsByType(XSSFRelation.DRAWINGS.getRelation());
+                    for (PackageRelationship rel : prc) {
+                        PackagePart drawingPart = getTargetPart(rel);
+                        PackageRelationshipCollection prc2 = drawingPart.getRelationshipsByType(XSSFRelation.IMAGES.getRelation());
+                        for (PackageRelationship rel2 : prc2) {
+                            PackagePart imagePart = getTargetPart(rel2);
+                            XSSFPictureData pd = new XSSFPictureData(imagePart);
+                            pictures.add(pd);
+                        }
+                    }
+                } catch (InvalidFormatException e) {
+                    throw new POIXMLException(e.getMessage(), e);
+                }
+
+            }
+        }
 		return pictures;
 	}
 
@@ -389,39 +488,91 @@
 		return null;
 	}
 
+    /**
+     * Get the font at the given index number
+     *
+     * @param idx  index number
+     * @return XSSFFont at the index
+     */
 	public XSSFFont getFontAt(short idx) {
 		return (XSSFFont)stylesSource.getFontAt(idx);
 	}
 
+    /**
+     * Gets the Named range at the given index number
+     *
+     * @param index position of the named range
+     * @return XSSFName at the index
+     */
 	public XSSFName getNameAt(int index) {
 		return namedRanges.get(index);
 	}
+
+    /**
+     * Gets the Named range name at the given index number,
+     * this method is equivalent to <code>getNameAt(index).getName()</code>
+     *
+     * @param index the named range index (0 based)
+     * @return named range name
+     * @see #getNameAt(int)
+     */
 	public String getNameName(int index) {
 		return getNameAt(index).getNameName();
 	}
-	public int getNameIndex(String name) {
-		for(int i=0; i<namedRanges.size(); i++) {
-			if(namedRanges.get(i).getNameName().equals(name)) {
-				return i;
-			}
-		}
+
+    /**
+     * Gets the named range index by his name
+     * <i>Note:</i>Excel named ranges are case-insensitive and
+     * this method performs a case-insensitive search.
+     *
+     * @param name named range name
+     * @return named range index
+     */
+    public int getNameIndex(String name) {
+        int i = 0;
+        for(XSSFName nr : namedRanges) {
+            if(nr.getNameName().equals(name)) {
+                return i;
+            }
+            i++;
+        }
 		return -1;
 	}
 
+    /**
+     * Get the number of styles the workbook contains
+     *
+     * @return count of cell styles
+     */
 	public short getNumCellStyles() {
 		return (short) ((StylesTable)stylesSource).getNumCellStyles();
 	}
 
+    /**
+     * Get the number of fonts in the this workbook
+     *
+     * @return number of fonts
+     */
 	public short getNumberOfFonts() {
 		return (short)((StylesTable)stylesSource).getNumberOfFonts();
 	}
 
+    /**
+     * Get the number of named ranges in the this workbook
+     *
+     * @return number of named ranges
+     */
 	public int getNumberOfNames() {
 		return namedRanges.size();
 	}
 
+    /**
+     * Get the number of worksheets in the this workbook
+     *
+     * @return number of worksheets
+     */
 	public int getNumberOfSheets() {
-		return this.workbook.getSheets().sizeOfSheetArray();
+        return this.sheets.size();
 	}
 
 	public String getPrintArea(int sheetIndex) {
@@ -429,6 +580,10 @@
 		return null;
 	}
 
+    /**
+     * deprecated May 2008
+     * @deprecated - Misleading name - use getActiveSheetIndex()
+     */
 	public short getSelectedTab() {
 		short i = 0;
 		for (XSSFSheet sheet : this.sheets) {
@@ -440,7 +595,13 @@
 		return -1;
 	}
 
-	public Sheet getSheet(String name) {
+    /**
+     * Get sheet with the given name (case insensitive match)
+     *
+     * @param name of the sheet
+     * @return XSSFSheet with the name provided or <code>null</code> if it does not exist
+     */
+	public XSSFSheet getSheet(String name) {
 		CTSheet[] sheets = this.workbook.getSheets().getSheetArray();
 		for (int i = 0 ; i < sheets.length ; ++i) {
 			if (name.equals(sheets[i].getName())) {
@@ -450,10 +611,22 @@
 		return null;
 	}
 
+    /**
+     * Get the XSSFSheet object at the given index.
+     *
+     * @param index of the sheet number (0-based physical & logical)
+     * @return XSSFSheet at the provided index
+     */
 	public XSSFSheet getSheetAt(int index) {
 		return this.sheets.get(index);
 	}
 
+    /**
+     * Returns the index of the sheet by his name
+     *
+     * @param name the sheet name
+     * @return index of the sheet (0 based)
+     */
 	public int getSheetIndex(String name) {
 		CTSheet[] sheets = this.workbook.getSheets().getSheetArray();
 		for (int i = 0 ; i < sheets.length ; ++i) {
@@ -464,25 +637,50 @@
 		return -1;
 	}
 
+    /**
+     * Returns the index of the given sheet
+     *
+     * @param sheet the sheet to look up
+     * @return index of the sheet (0 based). <tt>-1</tt> if not found
+     */
 	public int getSheetIndex(Sheet sheet) {
-		return this.sheets.indexOf(sheet);
-	}
-
-	public String getSheetName(int sheet) {
-		return this.workbook.getSheets().getSheetArray(sheet).getName();
-	}
-
+        int idx = 0;
+        for(XSSFSheet sh : this){
+            if(sh == sheet) return idx;
+            idx++;
+        }
+        return -1;
+	}
+
+    /**
+     * Get the sheet name
+     *
+     * @param sheetIx Number
+     * @return Sheet name
+     */
+	public String getSheetName(int sheetIx) {
+        validateSheetIndex(sheetIx);
+		return this.workbook.getSheets().getSheetArray(sheetIx).getName();
+	}
+
+    /**
+     * Allow foreach loops:
+     * <pre><code>
+     * XSSFWorkbook wb = new XSSFWorkbook(package);
+     * for(XSSFSheet sheet : wb){
+     *
+     * }
+     * </code></pre>
+     */
+    public Iterator<XSSFSheet> iterator() {
+        return sheets.iterator();
+    }
 	/**
 	 * 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
-
+        return getCorePart().getContentType().equals(XSSFRelation.MACROS_WORKBOOK.getContentType());
 	}
 
 	public void removeName(int index) {
@@ -500,6 +698,20 @@
 
 	}
 
+    /**
+     * Removes sheet at the given index.<p/>
+     *
+     * Care must be taken if the removed sheet is the currently active or only selected sheet in
+     * the workbook. There are a few situations when Excel must have a selection and/or active
+     * sheet. (For example when printing - see Bug 40414).<br/>
+     *
+     * This method makes sure that if the removed sheet was active, another sheet will become
+     * active in its place.  Furthermore, if the removed sheet was the only selected sheet, another
+     * sheet will become selected.  The newly active/selected sheet will have the same index, or
+     * one less if the removed sheet was the last in the workbook.
+     *
+     * @param index of the sheet  (0-based)
+     */
 	public void removeSheetAt(int index) {
 		this.sheets.remove(index);
 		this.workbook.getSheets().removeSheet(index);
@@ -518,7 +730,7 @@
 	 * Sets the policy on what to do when
 	 *  getting missing or blank cells from a row.
 	 * This will then apply to all calls to
-	 *  {@link Row.getCell()}. See
+	 *  {@link Row#getCell(int)}}. See
 	 *  {@link MissingCellPolicy}
 	 */
 	public void setMissingCellPolicy(MissingCellPolicy missingCellPolicy) {
@@ -600,12 +812,24 @@
 		}
 	}
 
+    /**
+     * Set the sheet name.
+     * Will throw IllegalArgumentException if the name is greater than 31 chars
+     * or contains /\?*[]
+     * @param sheet number (0 based)
+     */
 	public void setSheetName(int sheet, String name) {
 		if (doesContainsSheetName(name, sheet ))
 			throw new IllegalArgumentException( "The workbook already contains a sheet of this name" );
 		this.workbook.getSheets().getSheetArray(sheet).setName(name);
 	}
 
+    /**
+     * sets the order of appearance for a given sheet.
+     *
+     * @param sheetname the name of the sheet to reorder
+     * @param pos the position that we want to insert the sheet into (0 based)
+     */
 	public void setSheetOrder(String sheetname, int pos) {
 		int idx = getSheetIndex(sheetname);
 		sheets.add(pos, sheets.remove(idx));
@@ -621,141 +845,53 @@
 
 	}
 
-	public void write(OutputStream stream) throws IOException {
-		// What kind of workbook are we?
-		XSSFRelation workbookRelation = XSSFRelation.WORKBOOK;
-		if(isMacroEnabled) {
-			workbookRelation = XSSFRelation.MACROS_WORKBOOK;
-		}
-
-		try {
-			// Create a package referring the temp file.
-			Package pkg = Package.create(stream);
-			// Main part
-			PackagePartName corePartName = PackagingURIHelper.createPartName(workbookRelation.getDefaultFileName());
-			// Create main part relationship
-			int rId = 1;
-			pkg.addRelationship(corePartName, TargetMode.INTERNAL, PackageRelationshipTypes.CORE_DOCUMENT, "rId" + (rId++));
-
-			// Create main document part
-			PackagePart corePart = pkg.createPart(corePartName, workbookRelation.getContentType());
-			OutputStream out;
-
-			XmlOptions xmlOptions = new XmlOptions();
-			// Requests use of whitespace for easier reading
-			xmlOptions.setSavePrettyPrint();
-			xmlOptions.setSaveOuter();
-			xmlOptions.setUseDefaultNamespace();
-
-			// Write out our sheets, updating the references
-			//  to them in the main workbook as we go
-			int drawingIndex = 1;
-			for (int i=0 ; i < this.getNumberOfSheets(); i++) {
-				int sheetNumber = (i+1);
-				XSSFSheet sheet = this.getSheetAt(i);
-				PackagePartName partName = PackagingURIHelper.createPartName(
-						XSSFRelation.WORKSHEET.getFileName(sheetNumber));
-				PackageRelationship rel =
-					 corePart.addRelationship(partName, TargetMode.INTERNAL, XSSFRelation.WORKSHEET.getRelation(), "rId" + sheetNumber);
-				PackagePart part = pkg.createPart(partName, XSSFRelation.WORKSHEET.getContentType());
-
-				// XXX This should not be needed, but apparently the setSaveOuter call above does not work in XMLBeans 2.2
-				xmlOptions.setSaveSyntheticDocumentElement(new QName(CTWorksheet.type.getName().getNamespaceURI(), "worksheet"));
-				sheet.save(part, xmlOptions);
-
-				// Update our internal reference for the package part
-				workbook.getSheets().getSheetArray(i).setId(rel.getId());
-				workbook.getSheets().getSheetArray(i).setSheetId(sheetNumber);
-
-				// If our sheet has drawings, then write out those
-				if(sheet.getDrawings() != null) {
-					for(Drawing drawing : sheet.getDrawings()) {
-						XSSFRelation.VML_DRAWINGS.save(
-								drawing,
-								part,
-								drawingIndex
-						);
-						drawingIndex++;
-					}
-				}
-
-				// If our sheet has comments, then write out those
-				if(sheet.hasComments()) {
-					CommentsTable ct = (CommentsTable)sheet.getCommentsSourceIfExists();
-					XSSFRelation.SHEET_COMMENTS.save(ct, part, sheetNumber);
-				}
-
-				// If our sheet has controls, then write out those
-				if(sheet.getControls() != null) {
-					int controlIndex = 1;
-					for(Control control : sheet.getControls()) {
-						XSSFRelation.ACTIVEX_CONTROLS.save(
-								control,
-								part,
-								controlIndex
-						);
-						controlIndex++;
-					}
-				}
-			}
-
-			// Write shared strings and styles
-			if(sharedStringSource != null) {
-				 SharedStringsTable sst = (SharedStringsTable)sharedStringSource;
-				 XSSFRelation.SHARED_STRINGS.save(sst, corePart);
-			}
-			if(stylesSource != null) {
-				 StylesTable st = (StylesTable)stylesSource;
-				 XSSFRelation.STYLES.save(st, corePart);
-			}
-			if(themes.size() > 0) {
-				for(int i=0; i< themes.size(); i++) {
-					XSSFRelation.THEME.save(themes.get(i), corePart, i+1);
-				}
-			}
-
-			// Named ranges
-			if(namedRanges.size() > 0) {
-				CTDefinedNames names = CTDefinedNames.Factory.newInstance();
-				CTDefinedName[] nr = new CTDefinedName[namedRanges.size()];
-				for(int i=0; i<namedRanges.size(); i++) {
-					nr[i] = namedRanges.get(i).getCTName();
-				}
-				names.setDefinedNameArray(nr);
-				workbook.setDefinedNames(names);
-			} else {
-				if(workbook.isSetDefinedNames()) {
-					workbook.setDefinedNames(null);
-				}
-			}
-
-			// Macro related bits
-			if(isMacroEnabled) {
-				// Copy VBA Macros if present
-				if(XSSFRelation.VBA_MACROS.exists( getCorePart() )) {
-					try {
-						BinaryPart vba = XSSFRelation.VBA_MACROS.load(getCorePart());
-						XSSFRelation.VBA_MACROS.save(vba, corePart);
-					} catch(Exception e) {
-						throw new RuntimeException("Unable to copy vba macros over", e);
-					}
-				}
-			}
+    /**
+     * marshal named ranges from the {@link #namedRanges} collection to the underlying CTWorkbook bean
+     */
+    private void saveNamedRanges(){
+        // Named ranges
+        if(namedRanges.size() > 0) {
+            CTDefinedNames names = CTDefinedNames.Factory.newInstance();
+            CTDefinedName[] nr = new CTDefinedName[namedRanges.size()];
+            int i = 0;
+            for(XSSFName name : namedRanges) {
+                nr[i] = name.getCTName();
+                i++;
+            }
+            names.setDefinedNameArray(nr);
+            workbook.setDefinedNames(names);
+        } else {
+            if(workbook.isSetDefinedNames()) {
+                workbook.unsetDefinedNames();
+            }
+        }
+
+    }
+
+    @Override
+    protected void commit() throws IOException {
+        saveNamedRanges();
+
+        XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
+        xmlOptions.setSaveSyntheticDocumentElement(new QName(CTWorkbook.type.getName().getNamespaceURI(), "workbook"));
+        PackagePart part = getPackagePart();
+        OutputStream out = part.getOutputStream();
+        workbook.save(out, xmlOptions);
+        out.close();
+    }
+
+    /**
+     * Method write - write out this workbook to an Outputstream.
+     *
+     * @param stream - the java OutputStream you wish to write the XLS to
+     *
+     * @exception IOException if anything can't be written.
+     */
+    public void write(OutputStream stream) throws IOException {
+        //force all children to commit their changes into the underlying OOXML Package
+        save();
 
-			// Now we can write out the main Workbook, with
-			//  the correct references to the other parts
-			out = corePart.getOutputStream();
-			// XXX This should not be needed, but apparently the setSaveOuter call above does not work in XMLBeans 2.2
-			xmlOptions.setSaveSyntheticDocumentElement(new QName(CTWorkbook.type.getName().getNamespaceURI(), "workbook"));
-			workbook.save(out, xmlOptions);
-			out.close();
-
-			//  All done
-			pkg.close();
-		} catch (InvalidFormatException e) {
-			// TODO: replace with more meaningful exception
-			throw new RuntimeException(e);
-		}
+        getPackage().save(stream);
 	}
 
 	public void writeProtectWorkbook(String password, String username) {
@@ -763,24 +899,46 @@
 
 	}
 
-	public SharedStringSource getSharedStringSource() {
+    /**
+     * Returns SharedStringsTable - tha cache of string for this workbook
+     *
+     * @return the shared string table
+     */
+    public SharedStringsTable getSharedStringSource() {
 		return this.sharedStringSource;
 	}
-	protected void setSharedStringSource(SharedStringSource sharedStringSource) {
+    //TODO do we really need setSharedStringSource?
+    protected void setSharedStringSource(SharedStringsTable sharedStringSource) {
 		this.sharedStringSource = sharedStringSource;
 	}
 
+    /**
+     * Return a object representing a collection of shared objects used for styling content,
+     * e.g. fonts, cell styles, colors, etc.
+     */
 	public StylesSource getStylesSource() {
 		return this.stylesSource;
 	}
+    //TODO do we really need setStylesSource?
 	protected void setStylesSource(StylesSource stylesSource) {
 		this.stylesSource = stylesSource;
 	}
 
-	public CreationHelper getCreationHelper() {
+    /**
+     * Returns an object that handles instantiating concrete
+     *  classes of the various instances for XSSF.
+     */
+	public XSSFCreationHelper getCreationHelper() {
 		return new XSSFCreationHelper(this);
 	}
 
+    /**
+     * Determines whether a workbook contains the provided sheet name.
+     *
+     * @param name the name to test (case insensitive match)
+     * @param excludeSheetIdx the sheet to exclude from the check or -1 to include all sheets in the check.
+     * @return true if the sheet contains the name, false otherwise.
+     */
 	private boolean doesContainsSheetName(String name, int excludeSheetIdx) {
 		CTSheet[] ctSheetArray = workbook.getSheets().getSheetArray();
 		for (int i = 0; i < ctSheetArray.length; i++) {
@@ -789,4 +947,32 @@
 		}
 		return false;
 	}
+
+    private static void validateSheetName(String sheetName) {
+        if (sheetName == null) {
+            throw new IllegalArgumentException("sheetName must not be null");
+        }
+        int len = sheetName.length();
+        if (len < 1 || len > 31) {
+            throw new IllegalArgumentException("sheetName '" + sheetName
+                    + "' is invalid - must be 1-30 characters long");
+        }
+        for (int i=0; i<len; i++) {
+            char ch = sheetName.charAt(i);
+            switch (ch) {
+                case '/':
+                case '\\':
+                case '?':
+                case '*':
+                case ']':
+                case '[':
+                    break;
+                default:
+                    // all other chars OK
+                    continue;
+            }
+            throw new IllegalArgumentException("Invalid char (" + ch
+                    + ") found at index (" + i + ") in sheet name '" + sheetName + "'");
+        }
+     }
 }

Modified: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellBorder.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellBorder.java?rev=700472&r1=700471&r2=700472&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellBorder.java (original)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellBorder.java Tue Sep 30 06:57:36 2008
@@ -75,10 +75,22 @@
 	
 	private CTBorderPr getBorder(BorderSide side) {
 		switch (side) {
-		case TOP: return border.getTop();
-		case RIGHT: return border.getRight();
-		case BOTTOM: return border.getBottom();
-		case LEFT: return border.getLeft();
+		case TOP: {
+		    CTBorderPr borderPr = border.isSetTop() ? border.getTop() : border.addNewTop();
+		    return borderPr;
+		}
+		case RIGHT: {
+			    CTBorderPr borderPr = border.isSetRight() ? border.getRight() : border.addNewRight();
+			    return borderPr;
+		}
+		case BOTTOM:{
+			    CTBorderPr borderPr = border.isSetBottom() ? border.getBottom() : border.addNewBottom();
+			    return borderPr;
+		}
+		case LEFT:{
+			    CTBorderPr borderPr = border.isSetLeft() ? border.getLeft() : border.addNewLeft();
+			    return borderPr;
+			}
 		default: throw new IllegalArgumentException("No suitable side specified for the border");
 		}
 	}

Modified: poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java?rev=700472&r1=700471&r2=700472&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java (original)
+++ poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java Tue Sep 30 06:57:36 2008
@@ -17,10 +17,7 @@
 
 package org.apache.poi.xssf;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.*;
 
 import org.apache.poi.hssf.HSSFTestDataSamples;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
@@ -47,15 +44,20 @@
 		}
 	}
     public static <R extends Workbook> R writeOutAndReadBack(R wb) {
-    	ByteArrayOutputStream baos = new ByteArrayOutputStream(8192);
     	Workbook result;
 		try {
-	    	wb.write(baos);
-	    	InputStream is = new ByteArrayInputStream(baos.toByteArray());
 	    	if (wb instanceof HSSFWorkbook) {
+                ByteArrayOutputStream baos = new ByteArrayOutputStream(8192);
+                wb.write(baos);
+                InputStream is = new ByteArrayInputStream(baos.toByteArray());
 	    		result = new HSSFWorkbook(is);
 	    	} else if (wb instanceof XSSFWorkbook) {
-    			Package pkg = Package.open(is);
+                File tmp = File.createTempFile("poi-ooxml-", ".xlsx");
+                tmp.deleteOnExit();
+                FileOutputStream out = new FileOutputStream(tmp);
+                wb.write(out);
+                out.close();
+    			Package pkg = Package.open(tmp.getAbsolutePath());
     			result = new XSSFWorkbook(pkg);
 	    	} else {
 	    		throw new RuntimeException("Unexpected workbook type (" 

Modified: poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/model/TestCommentsTable.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/model/TestCommentsTable.java?rev=700472&r1=700471&r2=700472&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/model/TestCommentsTable.java (original)
+++ poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/model/TestCommentsTable.java Tue Sep 30 06:57:36 2008
@@ -30,6 +30,7 @@
 import org.apache.poi.xssf.usermodel.XSSFRichTextString;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.apache.poi.xssf.XSSFTestDataSamples;
 import org.openxml4j.opc.Package;
 import org.openxml4j.opc.PackagePart;
 import org.openxml4j.opc.PackagingURIHelper;
@@ -212,12 +213,8 @@
 		
 		
 		// Save, and re-load the file
-		ByteArrayOutputStream baos = new ByteArrayOutputStream();
-		workbook.write(baos);
-		
-		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-		workbook = new XSSFWorkbook(Package.open(bais));
-		
+        workbook = XSSFTestDataSamples.writeOutAndReadBack(workbook);
+
 		// Check we still have comments where we should do
 		sheet1 = workbook.getSheetAt(0);
 		sheet2 = (XSSFSheet)workbook.getSheetAt(1);
@@ -259,12 +256,8 @@
 				sheet1.getRow(12).getCell(2).getCellComment().getAuthor());
 		
 		// Save, and re-load the file
-		ByteArrayOutputStream baos = new ByteArrayOutputStream();
-		workbook.write(baos);
-		
-		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-		workbook = new XSSFWorkbook(Package.open(bais));
-		
+        workbook = XSSFTestDataSamples.writeOutAndReadBack(workbook);
+
 		// Check we still have comments where we should do
 		sheet1 = workbook.getSheetAt(0);
 		assertNotNull(sheet1.getRow(4).getCell(2).getCellComment());

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=700472&r1=700471&r2=700472&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 Sep 30 06:57:36 2008
@@ -17,120 +17,107 @@
 
 package org.apache.poi.xssf.usermodel;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.File;
-import java.io.FileOutputStream;
 
 import junit.framework.TestCase;
 
 import org.openxml4j.opc.Package;
 import org.openxml4j.opc.PackagePart;
 import org.openxml4j.opc.PackagingURIHelper;
+import org.apache.poi.xssf.XSSFTestDataSamples;
 
 public class TestXSSFBugs extends TestCase {
-	private String getFilePath(String file) {
-		File xml = new File(
-				System.getProperty("HSSF.testdata.path") +
-				File.separator + file
-		);
-		assertTrue(xml.exists());
-		
-		return xml.toString();
-	}
-	
-	private Package saveAndOpen(XSSFWorkbook wb) throws Exception {
-		ByteArrayOutputStream baos = new ByteArrayOutputStream();
-		wb.write(baos);
-		ByteArrayInputStream inp = new ByteArrayInputStream(
-				baos.toByteArray()
-		);
-		Package pkg = Package.open(inp);
-		return pkg;
-	}
-	
-	/**
-	 * Named ranges had the right reference, but
-	 *  the wrong sheet name
-	 */
-	public void test45430() throws Exception {
-		XSSFWorkbook wb = new XSSFWorkbook(getFilePath("45430.xlsx"));
-		assertFalse(wb.isMacroEnabled());
-		assertEquals(3, wb.getNumberOfNames());
-		
-		assertEquals(0, wb.getNameAt(0).getCTName().getLocalSheetId());
-		assertFalse(wb.getNameAt(0).getCTName().isSetLocalSheetId());
-		assertEquals("SheetA!$A$1", wb.getNameAt(0).getReference());
-		assertEquals("SheetA", wb.getNameAt(0).getSheetName());
-		
-		assertEquals(0, wb.getNameAt(1).getCTName().getLocalSheetId());
-		assertFalse(wb.getNameAt(1).getCTName().isSetLocalSheetId());
-		assertEquals("SheetB!$A$1", wb.getNameAt(1).getReference());
-		assertEquals("SheetB", wb.getNameAt(1).getSheetName());
-		
-		assertEquals(0, wb.getNameAt(2).getCTName().getLocalSheetId());
-		assertFalse(wb.getNameAt(2).getCTName().isSetLocalSheetId());
-		assertEquals("SheetC!$A$1", wb.getNameAt(2).getReference());
-		assertEquals("SheetC", wb.getNameAt(2).getSheetName());
-		
-		// Save and re-load, still there
-		Package nPkg = saveAndOpen(wb);
-		XSSFWorkbook nwb = new XSSFWorkbook(nPkg);
-		assertEquals(3, nwb.getNumberOfNames());
-		assertEquals("SheetA!$A$1", nwb.getNameAt(0).getReference());
-	}
-	
-	/**
-	 * We should carry vba macros over after save
-	 */
-	public void test45431() throws Exception {
-		Package pkg = Package.open(getFilePath("45431.xlsm"));
-		XSSFWorkbook wb = new XSSFWorkbook(pkg);
-		assertTrue(wb.isMacroEnabled());
-		
-		// Check the various macro related bits can be found
-		PackagePart vba = pkg.getPart(
-				PackagingURIHelper.createPartName("/xl/vbaProject.bin")
-		);
-		assertNotNull(vba);
-		// And the drawing bit
-		PackagePart drw = pkg.getPart(
-				PackagingURIHelper.createPartName("/xl/drawings/vmlDrawing1.vml")
-		);
-		assertNotNull(drw);
-		
-		
-		// Save and re-open, both still there
-		Package nPkg = saveAndOpen(wb);
-		XSSFWorkbook nwb = new XSSFWorkbook(nPkg);
-		assertTrue(nwb.isMacroEnabled());
-		
-		vba = nPkg.getPart(
-				PackagingURIHelper.createPartName("/xl/vbaProject.bin")
-		);
-		assertNotNull(vba);
-		drw = nPkg.getPart(
-				PackagingURIHelper.createPartName("/xl/drawings/vmlDrawing1.vml")
-		);
-		assertNotNull(drw);
-		
-		// And again, just to be sure
-		nPkg = saveAndOpen(nwb);
-		nwb = new XSSFWorkbook(nPkg);
-		assertTrue(nwb.isMacroEnabled());
-		
-		vba = nPkg.getPart(
-				PackagingURIHelper.createPartName("/xl/vbaProject.bin")
-		);
-		assertNotNull(vba);
-		drw = nPkg.getPart(
-				PackagingURIHelper.createPartName("/xl/drawings/vmlDrawing1.vml")
-		);
-		assertNotNull(drw);
-		
-		// For testing with excel
+    private String getFilePath(String file) {
+        File xml = new File(
+                System.getProperty("HSSF.testdata.path") +
+                File.separator + file
+        );
+        assertTrue(xml.exists());
+
+        return xml.toString();
+    }
+
+    /**
+     * Named ranges had the right reference, but
+     *  the wrong sheet name
+     */
+    public void test45430() throws Exception {
+        XSSFWorkbook wb = new XSSFWorkbook(getFilePath("45430.xlsx"));
+        assertFalse(wb.isMacroEnabled());
+        assertEquals(3, wb.getNumberOfNames());
+
+        assertEquals(0, wb.getNameAt(0).getCTName().getLocalSheetId());
+        assertFalse(wb.getNameAt(0).getCTName().isSetLocalSheetId());
+        assertEquals("SheetA!$A$1", wb.getNameAt(0).getReference());
+        assertEquals("SheetA", wb.getNameAt(0).getSheetName());
+
+        assertEquals(0, wb.getNameAt(1).getCTName().getLocalSheetId());
+        assertFalse(wb.getNameAt(1).getCTName().isSetLocalSheetId());
+        assertEquals("SheetB!$A$1", wb.getNameAt(1).getReference());
+        assertEquals("SheetB", wb.getNameAt(1).getSheetName());
+
+        assertEquals(0, wb.getNameAt(2).getCTName().getLocalSheetId());
+        assertFalse(wb.getNameAt(2).getCTName().isSetLocalSheetId());
+        assertEquals("SheetC!$A$1", wb.getNameAt(2).getReference());
+        assertEquals("SheetC", wb.getNameAt(2).getSheetName());
+
+        // Save and re-load, still there
+        XSSFWorkbook nwb = XSSFTestDataSamples.writeOutAndReadBack(wb);
+        assertEquals(3, nwb.getNumberOfNames());
+        assertEquals("SheetA!$A$1", nwb.getNameAt(0).getReference());
+    }
+
+    /**
+     * We should carry vba macros over after save
+     */
+    public void test45431() throws Exception {
+        Package pkg = Package.open(getFilePath("45431.xlsm"));
+        XSSFWorkbook wb = new XSSFWorkbook(pkg);
+        assertTrue(wb.isMacroEnabled());
+
+        // Check the various macro related bits can be found
+        PackagePart vba = pkg.getPart(
+                PackagingURIHelper.createPartName("/xl/vbaProject.bin")
+        );
+        assertNotNull(vba);
+        // And the drawing bit
+        PackagePart drw = pkg.getPart(
+                PackagingURIHelper.createPartName("/xl/drawings/vmlDrawing1.vml")
+        );
+        assertNotNull(drw);
+
+
+        // Save and re-open, both still there
+        XSSFWorkbook nwb = XSSFTestDataSamples.writeOutAndReadBack(wb);
+        Package nPkg = nwb.getPackage();
+        assertTrue(nwb.isMacroEnabled());
+
+        vba = nPkg.getPart(
+                PackagingURIHelper.createPartName("/xl/vbaProject.bin")
+        );
+        assertNotNull(vba);
+        drw = nPkg.getPart(
+                PackagingURIHelper.createPartName("/xl/drawings/vmlDrawing1.vml")
+        );
+        assertNotNull(drw);
+
+        // And again, just to be sure
+        nwb = XSSFTestDataSamples.writeOutAndReadBack(nwb);
+        nPkg = nwb.getPackage();
+        assertTrue(nwb.isMacroEnabled());
+
+        vba = nPkg.getPart(
+                PackagingURIHelper.createPartName("/xl/vbaProject.bin")
+        );
+        assertNotNull(vba);
+        drw = nPkg.getPart(
+                PackagingURIHelper.createPartName("/xl/drawings/vmlDrawing1.vml")
+        );
+        assertNotNull(drw);
+
+        // For testing with excel
 //		FileOutputStream fout = new FileOutputStream("/tmp/foo.xlsm");
 //		nwb.write(fout);
 //		fout.close();
-	}
+    }
 }

Modified: poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFComment.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFComment.java?rev=700472&r1=700471&r2=700472&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFComment.java (original)
+++ poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFComment.java Tue Sep 30 06:57:36 2008
@@ -17,9 +17,6 @@
 
 package org.apache.poi.xssf.usermodel;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-
 import org.apache.poi.hssf.usermodel.HSSFRichTextString;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.Comment;
@@ -27,6 +24,7 @@
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.util.CellReference;
 import org.apache.poi.xssf.model.CommentsTable;
+import org.apache.poi.xssf.XSSFTestDataSamples;
 import org.openxml4j.opc.Package;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTAuthors;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTComment;
@@ -135,7 +133,7 @@
 	 */
 	public void testCreateSave() throws Exception {
 		XSSFWorkbook wb = new XSSFWorkbook();
-		XSSFSheet s1 = (XSSFSheet)wb.createSheet();
+		XSSFSheet s1 = wb.createSheet();
 		Row r1 = s1.createRow(0);
 		Cell r1c1 = r1.createCell(0);
 		r1c1.setCellValue(2.2);
@@ -150,12 +148,8 @@
 		assertEquals(1, s1.getNumberOfComments());
 		
 		// Save and re-load
-		ByteArrayOutputStream baos = new ByteArrayOutputStream();
-		wb.write(baos);
-		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-		
-		wb = new XSSFWorkbook(Package.open(bais));
-		s1 = (XSSFSheet)wb.getSheetAt(0);
+		wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
+		s1 = wb.getSheetAt(0);
 		
 		assertEquals(1, s1.getNumberOfComments());
 		assertNotNull(s1.getRow(0).getCell(0).getCellComment());
@@ -171,12 +165,9 @@
 		assertEquals(2, s1.getNumberOfComments());
 		
 		// Save and re-load
-		baos = new ByteArrayOutputStream();
-		wb.write(baos);
-		bais = new ByteArrayInputStream(baos.toByteArray());
-		
-		wb = new XSSFWorkbook(Package.open(bais));
-		s1 = (XSSFSheet)wb.getSheetAt(0);
+
+		wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
+		s1 = wb.getSheetAt(0);
 		
 		assertEquals(2, s1.getNumberOfComments());
 		assertNotNull(s1.getCellComment(0, 0));

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=700472&r1=700471&r2=700472&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 Tue Sep 30 06:57:36 2008
@@ -17,8 +17,6 @@
 
 package org.apache.poi.xssf.usermodel;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 
 import junit.framework.TestCase;
@@ -27,6 +25,7 @@
 import org.apache.poi.ss.usermodel.CreationHelper;
 import org.apache.poi.ss.usermodel.Hyperlink;
 import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.xssf.XSSFTestDataSamples;
 import org.openxml4j.opc.Package;
 
 public class TestXSSFHyperlink extends TestCase {
@@ -79,12 +78,9 @@
 		
 		
 		// Write out, and check
-		ByteArrayOutputStream baos = new ByteArrayOutputStream();
-		workbook.write(baos);
-		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-		
+
 		// Load up again, check all links still there
-		XSSFWorkbook wb2 = new XSSFWorkbook(Package.open(bais));
+		XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(workbook);
 		assertEquals(3, wb2.getNumberOfSheets());
 		assertNotNull(wb2.getSheetAt(0));
 		assertNotNull(wb2.getSheetAt(1));
@@ -119,18 +115,14 @@
 		
 		
 		// Save and re-load once more
-		baos = new ByteArrayOutputStream();
-		wb2.write(baos);
-		bais = new ByteArrayInputStream(baos.toByteArray());
-		
-		
-		XSSFWorkbook wb3 = new XSSFWorkbook(Package.open(bais));
+
+        XSSFWorkbook wb3 = XSSFTestDataSamples.writeOutAndReadBack(wb2);
 		assertEquals(3, wb3.getNumberOfSheets());
 		assertNotNull(wb3.getSheetAt(0));
 		assertNotNull(wb3.getSheetAt(1));
 		assertNotNull(wb3.getSheetAt(2));
 		
-		sheet = (XSSFSheet)wb3.getSheetAt(0);
+		sheet = wb3.getSheetAt(0);
 		
 		assertEquals(5, sheet.getNumHyperlinks());
 		doTestHyperlinkContents(sheet);

Modified: poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java?rev=700472&r1=700471&r2=700472&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java (original)
+++ poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java Tue Sep 30 06:57:36 2008
@@ -17,8 +17,6 @@
 
 package org.apache.poi.xssf.usermodel;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.util.Iterator;
 import junit.framework.TestCase;
@@ -30,11 +28,7 @@
 import org.apache.poi.xssf.model.CommentsTable;
 import org.apache.poi.xssf.model.StylesTable;
 import org.apache.poi.xssf.usermodel.helpers.ColumnHelper;
-import org.apache.poi.hssf.usermodel.HSSFSheet;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.usermodel.HSSFRow;
-import org.apache.poi.hssf.usermodel.HSSFCell;
-import org.openxml4j.opc.Package;
+import org.apache.poi.xssf.XSSFTestDataSamples;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCols;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTComment;
@@ -349,11 +343,7 @@
 		
 		
 		// Save and reload
-		ByteArrayOutputStream baos = new ByteArrayOutputStream();
-		workbook.write(baos);
-		XSSFWorkbook wb = new XSSFWorkbook(Package.open(
-				new ByteArrayInputStream(baos.toByteArray())
-		));
+		XSSFWorkbook wb = XSSFTestDataSamples.writeOutAndReadBack(workbook);
 		
 		hdr = (XSSFOddHeader)wb.getSheetAt(0).getHeader();
 		ftr = (XSSFOddFooter)wb.getSheetAt(0).getFooter(); 

Modified: poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java?rev=700472&r1=700471&r2=700472&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java (original)
+++ poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java Tue Sep 30 06:57:36 2008
@@ -441,7 +441,7 @@
 		
 		// Now, an existing file with named ranges
 		workbook = XSSFTestDataSamples.openSampleWorkbook("WithVariousData.xlsx");
-		
+
 		assertEquals(2, workbook.getNumberOfNames());
 		assertEquals("Sheet1!$A$2:$A$7", workbook.getNameAt(0).getReference());
 		assertEquals("AllANumbers", workbook.getNameAt(0).getNameName());



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