summaryrefslogtreecommitdiff
path: root/xmerge/source/pexcel/java/org/openoffice/xmerge/converter/xml/sxc/pexcel/records/Workbook.java
diff options
context:
space:
mode:
Diffstat (limited to 'xmerge/source/pexcel/java/org/openoffice/xmerge/converter/xml/sxc/pexcel/records/Workbook.java')
-rw-r--r--xmerge/source/pexcel/java/org/openoffice/xmerge/converter/xml/sxc/pexcel/records/Workbook.java539
1 files changed, 539 insertions, 0 deletions
diff --git a/xmerge/source/pexcel/java/org/openoffice/xmerge/converter/xml/sxc/pexcel/records/Workbook.java b/xmerge/source/pexcel/java/org/openoffice/xmerge/converter/xml/sxc/pexcel/records/Workbook.java
new file mode 100644
index 000000000000..5a9f329e4667
--- /dev/null
+++ b/xmerge/source/pexcel/java/org/openoffice/xmerge/converter/xml/sxc/pexcel/records/Workbook.java
@@ -0,0 +1,539 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.xmerge.converter.xml.sxc.pexcel.records;
+
+import java.io.OutputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.util.Vector;
+import java.util.Enumeration;
+
+import org.openoffice.xmerge.converter.xml.OfficeConstants;
+import org.openoffice.xmerge.converter.xml.sxc.Format;
+import org.openoffice.xmerge.converter.xml.sxc.NameDefinition;
+import org.openoffice.xmerge.converter.xml.sxc.BookSettings;
+import org.openoffice.xmerge.converter.xml.sxc.SheetSettings;
+import org.openoffice.xmerge.util.Debug;
+import org.openoffice.xmerge.converter.xml.sxc.pexcel.PocketExcelConstants;
+import org.openoffice.xmerge.converter.xml.sxc.ColumnRowInfo;
+
+/**
+ * This class is used by <code> PxlDocument</code> to maintain pexcel
+ * workbooks.
+ *
+ * @author Martin Maher
+ */
+public class Workbook implements org.openoffice.xmerge.Document,
+OfficeConstants {
+
+ private Vector fonts = new Vector();
+ private Vector extendedFormats = new Vector();
+ private Vector worksheets = new Vector();
+ private Vector boundsheets = new Vector();
+ private Vector definedNames = new Vector();
+ private static final CodePage cp;
+ private static final Window1 win1;
+ private static final BeginningOfFile bof;;
+ private static final Eof eof;
+ private String fileName;
+
+ static {
+ cp = new CodePage();
+ win1 = new Window1();
+ bof = new BeginningOfFile(true);
+ eof = new Eof();
+ }
+
+
+ /**
+ * Constructs a pocket Excel Workbook with the name of the file passed in
+ * as an argument. Also fills out a basic header block containing the
+ * minimum number of objects that can be created at this time.
+ *
+ * @param name Name of the Pocket Excel Data file. (excluding the file
+ * extension)
+ */
+ public Workbook(String name) throws IOException {
+ fileName = name + PocketExcelConstants.FILE_EXTENSION;
+ Format defaultFormat = new Format();
+ FontDescription fd = new FontDescription(defaultFormat);
+ fonts.add(fd);
+ ExtendedFormat xf = new ExtendedFormat(0, defaultFormat);
+ extendedFormats.add(xf);
+ }
+
+ /**
+ * Constructs a pocket Excel Workbook from the
+ * <code>InputStream</code> and assigns it the document name passed in
+ *
+ * @param is InputStream containing a Pocket Excel Data file.
+ */
+ public Workbook(String name, InputStream is) throws IOException {
+ read(is);
+ fileName = name;
+ }
+
+ /**
+ * Writes the current workbook to the <code>Outputstream</code>
+ *
+ * @param os The destination outputstream
+ */
+ public void write(OutputStream os) throws IOException {
+ bof.write(os);
+ cp.write(os);
+ for(Enumeration e = definedNames.elements();e.hasMoreElements();) {
+ DefinedName dn = (DefinedName) e.nextElement();
+ dn.write(os);
+ }
+ win1.write(os);
+ for(Enumeration e = fonts.elements();e.hasMoreElements();) {
+ FontDescription fd = (FontDescription) e.nextElement();
+ fd.write(os);
+ }
+ for(Enumeration e = extendedFormats.elements();e.hasMoreElements();) {
+ ExtendedFormat xf = (ExtendedFormat) e.nextElement();
+ xf.write(os);
+ }
+ for(Enumeration e = boundsheets.elements();e.hasMoreElements();) {
+ BoundSheet bs = (BoundSheet) e.nextElement();
+ bs.write(os);
+ }
+ eof.write(os);
+
+ for(Enumeration e = worksheets.elements();e.hasMoreElements();) {
+ Worksheet ws = (Worksheet) e.nextElement();
+ ws.write(os);
+ }
+ }
+
+ /**
+ * Reads a workbook from the <code>InputStream</code> and contructs a
+ * workbook object from it
+ *
+ * @param is InputStream containing a Pocket Excel Data file.
+ */
+ public void read(InputStream is) throws IOException {
+
+ boolean done = false;
+
+ int b = 0;
+ while (!done)
+ {
+ b = is.read();
+ if (b == -1)
+ {
+ Debug.log(Debug.TRACE,"End of file reached");
+ break;
+ }
+
+ switch (b)
+ {
+ case PocketExcelConstants.DEFINED_NAME:
+ Debug.log(Debug.TRACE,"NAME: Defined Name (18h)");
+ DefinedName dn = new DefinedName(is, this);
+ definedNames.add(dn);
+ break;
+
+ case PocketExcelConstants.BOF_RECORD:
+ Debug.log(Debug.TRACE,"BOF Record");
+ bof.read(is);
+ break;
+
+ case PocketExcelConstants.EOF_MARKER:
+ Debug.log(Debug.TRACE,"EOF Marker");
+ eof.read(is);
+ Worksheet ws = new Worksheet(this);
+ while(ws.read(is)) {
+ worksheets.add(ws);
+ ws = new Worksheet(this);
+ }
+ break;
+
+ case PocketExcelConstants.FONT_DESCRIPTION:
+ Debug.log(Debug.TRACE,"FONT: Font Description (31h)");
+ FontDescription fd = new FontDescription(is);
+ fonts.add(fd);
+ break;
+
+ case PocketExcelConstants.WINDOW_INFO:
+ Debug.log(Debug.TRACE,"WINDOW1: Window Information (3Dh) [PXL 2.0]");
+ win1.read(is);
+ break;
+
+ case PocketExcelConstants.CODEPAGE:
+ Debug.log(Debug.TRACE,"CODEPAGE : Codepage and unknown fields (42h)");
+ cp.read(is);
+ break;
+
+ case PocketExcelConstants.BOUND_SHEET:
+ Debug.log(Debug.TRACE,"BOUNDSHEET: Sheet Information (85h)");
+ BoundSheet bs = new BoundSheet(is);
+ boundsheets.add(bs);
+ break;
+
+ case PocketExcelConstants.EXTENDED_FORMAT:
+ Debug.log(Debug.TRACE,"XF: Extended Format (E0h) [PXL 2.0]");
+ ExtendedFormat xf = new ExtendedFormat(is);
+ extendedFormats.add(xf);
+ break;
+
+ default:
+ b = is.read();
+ break;
+ }
+
+ }
+ is.close();
+ }
+
+ /**
+ * Adds a font recrod to the workbook
+ *
+ * @param f the font record to add
+ */
+ public int addFont(FontDescription f) {
+
+ boolean alreadyExists = false;
+ int i = 0;
+
+ for(Enumeration e = fonts.elements();e.hasMoreElements();) {
+ FontDescription fd = (FontDescription) e.nextElement();
+ if(fd.compareTo(f)) {
+ alreadyExists = true;
+ break;
+ } else {
+ i++;
+ }
+ }
+
+ if(!alreadyExists)
+ fonts.add(f);
+
+ return i;
+ }
+
+ /**
+ * Adds a ExtendedFormat record to the workbook
+ *
+ * @param f the font recrod to add
+ */
+ public int addExtendedFormat(Format fmt) throws IOException {
+
+ FontDescription fd = new FontDescription(fmt);
+ int ixfnt = addFont(fd);
+ ExtendedFormat xf = new ExtendedFormat(ixfnt, fmt);
+
+ boolean alreadyExists = false;
+ int i = 0;
+
+ for(Enumeration e = extendedFormats.elements();e.hasMoreElements();) {
+ ExtendedFormat currentXF = (ExtendedFormat) e.nextElement();
+ if(xf.compareTo(currentXF)) {
+ alreadyExists = true;
+ break;
+ } else if(!alreadyExists) {
+ i++;
+ }
+ }
+
+ if(!alreadyExists)
+ extendedFormats.add(xf);
+
+ return i;
+ }
+
+ /**
+ * Gets a worksheet at a particular index from mthe current workbook.
+ *
+ * @param index the index of the worksheet to retrieve
+ */
+ public Worksheet getWorksheet(int index) {
+
+ return ((Worksheet) worksheets.elementAt(index));
+ }
+
+ /**
+ * Returns a FontDescription indictated by the
+ * index parameter passed in to the method
+ *
+ * @param ixfnt index to the FontDescriptions, this is a 0 based index
+ * @return FontDescription indexed by ixfe
+ */
+ public FontDescription getFontDescription(int ixfnt) {
+
+ return (FontDescription) fonts.elementAt(ixfnt);
+ }
+
+ /**
+ * Returns a ExtendedFormat indictated by the
+ * index parameter passed in to the method
+ *
+ * @param ixfe index to the FontDescriptions, this is a 0 based index
+ * @return FontDescription indexed by ixfe
+ */
+ public ExtendedFormat getExtendedFormat(int ixfe) {
+
+ return (ExtendedFormat) extendedFormats.elementAt(ixfe);
+ }
+
+ /**
+ * Returns an enumeration of DefinedNames for this workbook
+ *
+ * @return Enumeration for the DefinedNames
+ */
+ public Enumeration getDefinedNames() {
+
+ return definedNames.elements();
+ }
+
+ /**
+ * Returns an enumeration of <code>Settings</code> for this workbook
+ *
+ * @return Enumeration of <code>Settings</code>
+ */
+ public BookSettings getSettings() {
+
+ Vector settingsVector = new Vector();
+ int index = 0;
+ for(Enumeration e = worksheets.elements();e.hasMoreElements();) {
+ Worksheet ws = (Worksheet) e.nextElement();
+ SheetSettings s = ws.getSettings();
+ s.setSheetName(getSheetName(index++));
+ settingsVector.add(s);
+ }
+ BookSettings bs = new BookSettings(settingsVector);
+ String activeSheetName = getSheetName(win1.getActiveSheet());
+ bs.setActiveSheet(activeSheetName);
+ return bs;
+ }
+
+ /**
+ * Returns a <code>Vector</code> containing all the worksheet Names
+ *
+ * @return a <code>Vector</code> containing all the worksheet Names
+ */
+ public Vector getWorksheetNames() {
+
+ Vector wsNames = new Vector();
+
+ for(int i = 0;i < boundsheets.size();i++) {
+ wsNames.add(getSheetName(i));
+ }
+
+ return wsNames;
+ }
+
+ /**
+ * Returns the name of the worksheet at the specified index
+ *
+ * @return a <code>String</code> containing the name of the worksheet
+ */
+ public String getSheetName(int index) {
+ BoundSheet bs = (BoundSheet) boundsheets.elementAt(index);
+
+ return bs.getSheetName();
+ }
+
+ /**
+ * Adds a <code>Worksheet</code> to the workbook.
+ *
+ * @return name the name of the <code>Worksheet</code> to be added
+ */
+ public void addWorksheet(String name) throws IOException {
+
+ BoundSheet bs = new BoundSheet(name);
+ boundsheets.add(bs);
+
+ Worksheet ws = new Worksheet();
+ worksheets.add(ws);
+ }
+
+ /**
+ * Adds a cell to the current worksheet.
+ *
+ * @return the name of the <code>Worksheet</code> to be added
+ */
+ public void addCell(int row,int col, Format fmt, String cellContents)
+ throws IOException {
+
+ Worksheet currentWS = (Worksheet) worksheets.elementAt(worksheets.size()-1);
+ int ixfe = addExtendedFormat(fmt);
+
+ String category = fmt.getCategory();
+
+ // Now the formatting is out of the way add the cell
+ Debug.log(Debug.TRACE,"Cell Format: " + fmt);
+ Debug.log(Debug.TRACE,"Row : " + row);
+ Debug.log(Debug.TRACE,"Col : " + col);
+ if(cellContents.startsWith("=")) {
+ try {
+ Formula f = new Formula(row, col, cellContents, ixfe, fmt, this);
+ currentWS.addCell(f);
+ if(category.equalsIgnoreCase(CELLTYPE_STRING)) {
+ StringValue sv = new StringValue(fmt.getValue());
+ currentWS.addCell(sv);
+ }
+ } catch(Exception e) {
+ Debug.log(Debug.TRACE, "Parsing Exception thrown : " + e.getMessage());
+ BoolErrCell errorCell = new BoolErrCell(row, col, ixfe, 0x2A, 1);
+ currentWS.addCell(errorCell);
+ }
+ } else if(category.equalsIgnoreCase(OfficeConstants.CELLTYPE_FLOAT)) {
+ try {
+ FloatNumber num = new FloatNumber(row, col, cellContents, ixfe);
+ currentWS.addCell(num);
+ } catch(Exception e) {
+ Debug.log(Debug.TRACE,"Error could not parse Float " + cellContents);
+ LabelCell lc = new LabelCell(row, col, cellContents, ixfe);
+ currentWS.addCell(lc);
+ }
+ } else {
+ if(cellContents.length()==0) {
+ Debug.log(Debug.TRACE, "Blank Cell");
+ BlankCell b = new BlankCell(row, col, ixfe);
+ currentWS.addCell(b);
+ } else {
+ Debug.log(Debug.TRACE, "Label Cell : " + cellContents);
+ LabelCell lc = new LabelCell(row, col, cellContents, ixfe);
+ currentWS.addCell(lc); // three because we assume the last three
+ // Records in any worksheet is the selection,
+ // window2 and eof Records
+ }
+ }
+ }
+
+ /**
+ * Will create a number of ColInfo records based on the column widths
+ * based in.
+ *
+ * @param columnRows <code>Vector</code> of <code>ColumnRowInfo</code>
+ */
+ public void addColInfo(Vector columnRows) throws IOException {
+
+ Worksheet currentWS = (Worksheet) worksheets.elementAt(worksheets.size()-1);
+
+ int nCols = 0;
+ int nRows = 0;
+
+ Debug.log(Debug.TRACE,"Workbook: addColInfo()");
+ for(Enumeration e = columnRows.elements();e.hasMoreElements();) {
+ ColumnRowInfo cri =(ColumnRowInfo) e.nextElement();
+ int ixfe = 0;
+ int size = cri.getSize();
+ int repeated = cri.getRepeated();
+ if(cri.isColumn()) {
+ Debug.log(Debug.TRACE,"Workbook: adding ColInfo width = " + size);
+ ColInfo newColInfo = new ColInfo( nCols,
+ nCols+repeated-1,
+ size, ixfe);
+ currentWS.addCol(newColInfo);
+ nCols += repeated;
+ } else if(cri.isRow()) {
+
+ Debug.log(Debug.TRACE,"Workbook: adding Row Height = " + size);
+ if(!cri.isDefaultSize()) {
+ for(int i=0;i<repeated;i++) {
+ Row newRow = new Row(nRows++, size, cri.isUserDefined());
+ currentWS.addRow(newRow);
+ }
+ } else {
+ // If it is the Default Row we don't need to add it
+ nRows += repeated;
+ }
+
+ }
+ }
+ }
+
+ /**
+ * Will create a number of ColInfo recrods based on the column widths
+ * based in.
+ *
+ * @param an integer list representing the column widths
+ */
+ public void addNameDefinition(NameDefinition nameDefinition) throws IOException {
+
+ DefinedName dn = new DefinedName(nameDefinition, this);
+ definedNames.add(dn);
+ }
+
+ /**
+ * Adds the <code>BookSettings</code> for this workbook.
+ *
+ * @param book the <code>BookSettings</code> to add
+ */
+ public void addSettings(BookSettings book) throws IOException {
+
+ int index = 0;
+ Vector sheetSettings = book.getSheetSettings();
+ String activeSheetName = book.getActiveSheet();
+
+ for(Enumeration e = worksheets.elements();e.hasMoreElements();) {
+ Worksheet ws = (Worksheet) e.nextElement();
+ String name = getSheetName(index++);
+ if(activeSheetName.equals(name)) {
+ win1.setActiveSheet(index-1);
+ }
+ for(Enumeration eSettings = sheetSettings.elements();eSettings.hasMoreElements();) {
+ SheetSettings s = (SheetSettings) eSettings.nextElement();
+ if(name.equals(s.getSheetName())) {
+ ws.addSettings(s);
+ }
+ }
+ }
+ }
+
+ /**
+ * Return the filename of the pxl document without the file extension
+ *
+ * @return filename without the file extension
+ */
+ public String getName() {
+
+ // We have to strip off the file extension
+ int end = fileName.lastIndexOf(".");
+ String name;
+ if( end >= 0) // check in case the filename is already stripped
+ name = fileName.substring(0, end);
+ else
+ name = fileName;
+
+ return name;
+ }
+
+ /**
+ * Returns the filename of the pxl document with the file extension
+ *
+ * @return filename with the file extension
+ */
+ public String getFileName() {
+
+ return fileName;
+ }
+
+}