2002-01-30 21:22:28 -05:00
/ * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
2006-12-22 14:18:16 -05:00
Licensed to the Apache Software Foundation ( ASF ) under one or more
contributor license agreements . See the NOTICE file distributed with
this work for additional information regarding copyright ownership .
The ASF licenses this file to You under the Apache License , Version 2 . 0
( the " License " ) ; you may not use this file except in compliance with
the License . You may obtain a copy of the License at
2004-04-09 09:05:39 -04:00
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an " AS IS " BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = * /
2004-08-23 04:52:54 -04:00
2002-01-30 21:22:28 -05:00
package org.apache.poi.hssf.model ;
import java.util.ArrayList ;
import java.util.Iterator ;
2002-12-16 06:16:41 -05:00
import java.util.List ;
2002-07-20 23:03:57 -04:00
import java.util.Locale ;
2002-01-30 21:22:28 -05:00
2008-09-07 12:30:35 -04:00
import org.apache.poi.ddf.* ;
import org.apache.poi.hssf.record.* ;
2008-08-11 18:55:38 -04:00
import org.apache.poi.hssf.record.formula.NameXPtg ;
import org.apache.poi.hssf.util.HSSFColor ;
import org.apache.poi.hssf.util.SheetReferences ;
import org.apache.poi.util.POILogFactory ;
import org.apache.poi.util.POILogger ;
2002-01-30 21:22:28 -05:00
/ * *
* Low level model implementation of a Workbook . Provides creational methods
* for settings and objects contained in the workbook object .
* < P >
* This file contains the low level binary records starting at the workbook ' s BOF and
* ending with the workbook ' s EOF . Use HSSFWorkbook for a high level representation .
* < P >
* The structures of the highlevel API use references to this to perform most of their
* operations . Its probably unwise to use these low level structures directly unless you
* really know what you ' re doing . I recommend you read the Microsoft Excel 97 Developer ' s
* Kit ( Microsoft Press ) and the documentation at http : //sc.openoffice.org/excelfileformat.pdf
* before even attempting to use this .
*
2002-12-16 06:16:41 -05:00
*
2007-07-18 13:00:14 -04:00
* @author Luc Girardin ( luc dot girardin at macrofocus dot com )
* @author Sergei Kozello ( sergeikozello at mail . ru )
2002-10-04 22:38:07 -04:00
* @author Shawn Laubach ( slaubach at apache dot org ) ( Data Formats )
2002-01-30 21:22:28 -05:00
* @author Andrew C . Oliver ( acoliver at apache dot org )
2003-01-02 06:17:57 -05:00
* @author Brian Sanders ( bsanders at risklabs dot com ) - custom palette
2007-07-18 13:00:14 -04:00
* @author Dan Sherman ( dsherman at isisph . com )
* @author Glen Stampoultzis ( glens at apache . org )
2002-01-30 21:22:28 -05:00
* @see org . apache . poi . hssf . usermodel . HSSFWorkbook
* @version 1 . 0 - pre
* /
2008-08-11 17:24:19 -04:00
public final class Workbook implements Model {
2008-08-11 18:55:38 -04:00
private static final int DEBUG = POILogger . DEBUG ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* constant used to set the " codepage " wherever " codepage " is set in records
2008-08-11 17:24:19 -04:00
* ( which is duplicated in more than one record )
2002-01-30 21:22:28 -05:00
* /
private final static short CODEPAGE = ( short ) 0x4b0 ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* this contains the Worksheet record objects
* /
2003-02-06 05:29:45 -05:00
protected WorkbookRecordList records = new WorkbookRecordList ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* this contains a reference to the SSTRecord so that new stings can be added
* to it .
* /
protected SSTRecord sst = null ;
2002-07-29 09:25:46 -04:00
2008-03-04 11:53:32 -05:00
private LinkTable linkTable ; // optionally occurs if there are references in the document. (4.10.3)
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* holds the " boundsheet " records ( aka bundlesheet ) so that they can have their
* reference to their " BOF " marker
* /
protected ArrayList boundsheets = new ArrayList ( ) ;
2002-07-29 09:25:46 -04:00
2002-08-15 10:13:34 -04:00
protected ArrayList formats = new ArrayList ( ) ;
2008-02-01 11:52:58 -05:00
protected ArrayList hyperlinks = new ArrayList ( ) ;
2002-07-29 09:25:46 -04:00
2002-12-16 06:16:41 -05:00
protected int numxfs = 0 ; // hold the number of extended format records
2003-02-06 05:29:45 -05:00
protected int numfonts = 0 ; // hold the number of font records
2002-12-16 06:16:41 -05:00
private short maxformatid = - 1 ; // holds the max format id
private boolean uses1904datewindowing = false ; // whether 1904 date windowing is being used
2005-05-01 07:26:18 -04:00
private DrawingManager2 drawingManager ;
private List escherBSERecords = new ArrayList ( ) ; // EscherBSERecord
2005-08-24 12:26:20 -04:00
private WindowOneRecord windowOne ;
2007-07-18 13:00:14 -04:00
private FileSharingRecord fileShare ;
private WriteAccessRecord writeAccess ;
private WriteProtectRecord writeProtect ;
2002-12-16 06:16:41 -05:00
private static POILogger log = POILogFactory . getLogger ( Workbook . class ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* Creates new Workbook with no intitialization - - useless right now
2002-02-19 17:58:30 -05:00
* @see # createWorkbook ( List )
2002-01-30 21:22:28 -05:00
* /
2002-04-23 18:24:41 -04:00
public Workbook ( ) {
2002-01-30 21:22:28 -05:00
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* read support for low level
* API . Pass in an array of Record objects , A Workbook
* object is constructed and passed back with all of its initialization set
* to the passed in records and references to those records held . Unlike Sheet
* workbook does not use an offset ( its assumed to be 0 ) since its first in a file .
* If you need an offset then construct a new array with a 0 offset or write your
* own ; - p .
*
* @param recs an array of Record objects
* @return Workbook object
* /
2002-04-23 18:24:41 -04:00
public static Workbook createWorkbook ( List recs ) {
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " Workbook (readfile) created with reclen= " ,
new Integer ( recs . size ( ) ) ) ;
2002-01-30 21:22:28 -05:00
Workbook retval = new Workbook ( ) ;
ArrayList records = new ArrayList ( recs . size ( ) / 3 ) ;
2008-03-04 11:53:32 -05:00
retval . records . setRecords ( records ) ;
2002-07-29 09:25:46 -04:00
2008-02-01 11:52:58 -05:00
int k ;
for ( k = 0 ; k < recs . size ( ) ; k + + ) {
2002-01-30 21:22:28 -05:00
Record rec = ( Record ) recs . get ( k ) ;
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
if ( rec . getSid ( ) = = EOFRecord . sid ) {
2002-01-30 21:22:28 -05:00
records . add ( rec ) ;
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " found workbook eof record at " + k ) ;
2002-01-30 21:22:28 -05:00
break ;
}
2002-04-23 18:24:41 -04:00
switch ( rec . getSid ( ) ) {
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case BoundSheetRecord . sid :
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " found boundsheet record at " + k ) ;
2002-01-30 21:22:28 -05:00
retval . boundsheets . add ( rec ) ;
2003-02-06 05:29:45 -05:00
retval . records . setBspos ( k ) ;
2002-01-30 21:22:28 -05:00
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case SSTRecord . sid :
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " found sst record at " + k ) ;
2002-01-30 21:22:28 -05:00
retval . sst = ( SSTRecord ) rec ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case FontRecord . sid :
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " found font record at " + k ) ;
2003-02-06 05:29:45 -05:00
retval . records . setFontpos ( k ) ;
2002-01-30 21:22:28 -05:00
retval . numfonts + + ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case ExtendedFormatRecord . sid :
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " found XF record at " + k ) ;
2003-02-06 05:29:45 -05:00
retval . records . setXfpos ( k ) ;
2002-01-30 21:22:28 -05:00
retval . numxfs + + ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case TabIdRecord . sid :
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " found tabid record at " + k ) ;
2003-02-06 05:29:45 -05:00
retval . records . setTabpos ( k ) ;
2002-01-30 21:22:28 -05:00
break ;
2002-07-29 09:25:46 -04:00
2002-12-16 06:16:41 -05:00
case ProtectRecord . sid :
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " found protect record at " + k ) ;
2003-02-06 05:29:45 -05:00
retval . records . setProtpos ( k ) ;
2002-12-16 06:16:41 -05:00
break ;
2002-01-30 21:22:28 -05:00
case BackupRecord . sid :
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " found backup record at " + k ) ;
2003-02-06 05:29:45 -05:00
retval . records . setBackuppos ( k ) ;
2002-01-30 21:22:28 -05:00
break ;
2002-04-23 18:24:41 -04:00
case ExternSheetRecord . sid :
2008-03-04 11:53:32 -05:00
throw new RuntimeException ( " Extern sheet is part of LinkTable " ) ;
2002-04-23 18:24:41 -04:00
case NameRecord . sid :
2003-02-06 05:29:45 -05:00
case SupBookRecord . sid :
2008-05-23 01:28:54 -04:00
// LinkTable can start with either of these
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " found SupBook record at " + k ) ;
2008-03-04 11:53:32 -05:00
retval . linkTable = new LinkTable ( recs , k , retval . records ) ;
k + = retval . linkTable . getRecordCount ( ) - 1 ;
continue ;
2004-06-20 06:18:50 -04:00
case FormatRecord . sid :
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " found format record at " + k ) ;
retval . formats . add ( rec ) ;
retval . maxformatid = retval . maxformatid > = ( ( FormatRecord ) rec ) . getIndexCode ( ) ? retval . maxformatid : ( ( FormatRecord ) rec ) . getIndexCode ( ) ;
2002-04-23 18:24:41 -04:00
break ;
2002-11-28 14:32:52 -05:00
case DateWindow1904Record . sid :
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " found datewindow1904 record at " + k ) ;
2002-11-28 14:32:52 -05:00
retval . uses1904datewindowing = ( ( DateWindow1904Record ) rec ) . getWindowing ( ) = = 1 ;
break ;
2003-01-02 06:17:57 -05:00
case PaletteRecord . sid :
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " found palette record at " + k ) ;
2003-02-06 05:29:45 -05:00
retval . records . setPalettepos ( k ) ;
2005-09-01 23:48:31 -04:00
break ;
2005-08-24 12:26:20 -04:00
case WindowOneRecord . sid :
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " found WindowOneRecord at " + k ) ;
2007-07-18 13:00:14 -04:00
retval . windowOne = ( WindowOneRecord ) rec ;
break ;
case WriteAccessRecord . sid :
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " found WriteAccess at " + k ) ;
retval . writeAccess = ( WriteAccessRecord ) rec ;
break ;
case WriteProtectRecord . sid :
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " found WriteProtect at " + k ) ;
retval . writeProtect = ( WriteProtectRecord ) rec ;
break ;
case FileSharingRecord . sid :
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " found FileSharing at " + k ) ;
retval . fileShare = ( FileSharingRecord ) rec ;
2002-01-30 21:22:28 -05:00
default :
}
records . add ( rec ) ;
}
2002-04-23 18:24:41 -04:00
//What if we dont have any ranges and supbooks
2004-06-20 06:18:50 -04:00
// if (retval.records.supbookpos == 0) {
// retval.records.supbookpos = retval.records.bspos + 1;
// retval.records.namepos = retval.records.supbookpos + 1;
// }
2008-02-01 11:52:58 -05:00
// Look for other interesting values that
// follow the EOFRecord
for ( ; k < recs . size ( ) ; k + + ) {
Record rec = ( Record ) recs . get ( k ) ;
switch ( rec . getSid ( ) ) {
2008-08-11 17:24:19 -04:00
case HyperlinkRecord . sid :
retval . hyperlinks . add ( rec ) ;
break ;
2008-02-01 11:52:58 -05:00
}
}
2005-08-24 12:26:20 -04:00
if ( retval . windowOne = = null ) {
retval . windowOne = ( WindowOneRecord ) retval . createWindowOne ( ) ;
}
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " exit create workbook from existing file function " ) ;
2002-01-30 21:22:28 -05:00
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* Creates an empty workbook object with three blank sheets and all the empty
* fields . Use this to create a workbook from scratch .
* /
2002-12-16 06:16:41 -05:00
public static Workbook createWorkbook ( )
{
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " creating new workbook from scratch " ) ;
2002-12-16 06:16:41 -05:00
Workbook retval = new Workbook ( ) ;
ArrayList records = new ArrayList ( 30 ) ;
2008-03-04 11:53:32 -05:00
retval . records . setRecords ( records ) ;
2002-12-16 06:16:41 -05:00
ArrayList formats = new ArrayList ( 8 ) ;
records . add ( retval . createBOF ( ) ) ;
records . add ( retval . createInterfaceHdr ( ) ) ;
records . add ( retval . createMMS ( ) ) ;
records . add ( retval . createInterfaceEnd ( ) ) ;
records . add ( retval . createWriteAccess ( ) ) ;
records . add ( retval . createCodepage ( ) ) ;
records . add ( retval . createDSF ( ) ) ;
records . add ( retval . createTabId ( ) ) ;
2003-02-06 05:29:45 -05:00
retval . records . setTabpos ( records . size ( ) - 1 ) ;
2002-12-16 06:16:41 -05:00
records . add ( retval . createFnGroupCount ( ) ) ;
records . add ( retval . createWindowProtect ( ) ) ;
records . add ( retval . createProtect ( ) ) ;
2003-02-06 05:29:45 -05:00
retval . records . setProtpos ( records . size ( ) - 1 ) ;
2002-12-16 06:16:41 -05:00
records . add ( retval . createPassword ( ) ) ;
records . add ( retval . createProtectionRev4 ( ) ) ;
records . add ( retval . createPasswordRev4 ( ) ) ;
2005-08-24 12:26:20 -04:00
retval . windowOne = ( WindowOneRecord ) retval . createWindowOne ( ) ;
records . add ( retval . windowOne ) ;
2002-12-16 06:16:41 -05:00
records . add ( retval . createBackup ( ) ) ;
2003-02-06 05:29:45 -05:00
retval . records . setBackuppos ( records . size ( ) - 1 ) ;
2002-12-16 06:16:41 -05:00
records . add ( retval . createHideObj ( ) ) ;
records . add ( retval . createDateWindow1904 ( ) ) ;
records . add ( retval . createPrecision ( ) ) ;
records . add ( retval . createRefreshAll ( ) ) ;
records . add ( retval . createBookBool ( ) ) ;
records . add ( retval . createFont ( ) ) ;
records . add ( retval . createFont ( ) ) ;
records . add ( retval . createFont ( ) ) ;
records . add ( retval . createFont ( ) ) ;
2003-02-06 05:29:45 -05:00
retval . records . setFontpos ( records . size ( ) - 1 ) ; // last font record postion
2002-01-30 21:22:28 -05:00
retval . numfonts = 4 ;
2002-08-15 10:13:34 -04:00
// set up format records
2002-12-16 06:16:41 -05:00
for ( int i = 0 ; i < = 7 ; i + + )
{
Record rec ;
rec = retval . createFormat ( i ) ;
retval . maxformatid = retval . maxformatid > = ( ( FormatRecord ) rec ) . getIndexCode ( ) ? retval . maxformatid : ( ( FormatRecord ) rec ) . getIndexCode ( ) ;
formats . add ( rec ) ;
records . add ( rec ) ;
}
retval . formats = formats ;
2002-08-15 10:13:34 -04:00
2002-12-16 06:16:41 -05:00
for ( int k = 0 ; k < 21 ; k + + )
{
records . add ( retval . createExtendedFormat ( k ) ) ;
2002-01-30 21:22:28 -05:00
retval . numxfs + + ;
}
2003-02-06 05:29:45 -05:00
retval . records . setXfpos ( records . size ( ) - 1 ) ;
2002-12-16 06:16:41 -05:00
for ( int k = 0 ; k < 6 ; k + + )
{
records . add ( retval . createStyle ( k ) ) ;
2002-01-30 21:22:28 -05:00
}
2002-12-16 06:16:41 -05:00
records . add ( retval . createUseSelFS ( ) ) ;
2008-03-04 11:53:32 -05:00
int nBoundSheets = 1 ; // now just do 1
for ( int k = 0 ; k < nBoundSheets ; k + + ) {
2002-01-30 21:22:28 -05:00
BoundSheetRecord bsr =
2002-12-16 06:16:41 -05:00
( BoundSheetRecord ) retval . createBoundSheet ( k ) ;
2002-07-29 09:25:46 -04:00
2002-12-16 06:16:41 -05:00
records . add ( bsr ) ;
retval . boundsheets . add ( bsr ) ;
2003-02-06 05:29:45 -05:00
retval . records . setBspos ( records . size ( ) - 1 ) ;
2002-01-30 21:22:28 -05:00
}
2003-02-06 05:29:45 -05:00
// retval.records.supbookpos = retval.records.bspos + 1;
// retval.records.namepos = retval.records.supbookpos + 2;
2002-12-16 06:16:41 -05:00
records . add ( retval . createCountry ( ) ) ;
2008-03-04 11:53:32 -05:00
for ( int k = 0 ; k < nBoundSheets ; k + + ) {
retval . getOrCreateLinkTable ( ) . checkExternSheet ( k ) ;
}
2002-12-16 06:16:41 -05:00
retval . sst = ( SSTRecord ) retval . createSST ( ) ;
records . add ( retval . sst ) ;
records . add ( retval . createExtendedSST ( ) ) ;
2002-07-29 09:25:46 -04:00
2008-08-07 16:32:25 -04:00
records . add ( EOFRecord . instance ) ;
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " exit create new workbook from scratch " ) ;
2002-01-30 21:22:28 -05:00
return retval ;
}
2002-07-29 09:25:46 -04:00
2003-03-06 15:41:17 -05:00
2008-08-11 17:24:19 -04:00
/ * * Retrieves the Builtin NameRecord that matches the name and index
* There shouldn ' t be too many names to make the sequential search too slow
* @param name byte representation of the builtin name to match
* @param sheetNumber 1 - based sheet number
* @return null if no builtin NameRecord matches
* /
public NameRecord getSpecificBuiltinRecord ( byte name , int sheetNumber )
2008-03-04 11:53:32 -05:00
{
2008-08-11 17:24:19 -04:00
return getOrCreateLinkTable ( ) . getSpecificBuiltinRecord ( name , sheetNumber ) ;
2008-03-04 11:53:32 -05:00
}
2003-03-06 15:41:17 -05:00
2008-08-11 17:24:19 -04:00
/ * *
* Removes the specified Builtin NameRecord that matches the name and index
* @param name byte representation of the builtin to match
* @param sheetIndex zero - based sheet reference
* /
2008-03-04 11:53:32 -05:00
public void removeBuiltinRecord ( byte name , int sheetIndex ) {
linkTable . removeBuiltinRecord ( name , sheetIndex ) ;
// TODO - do we need "this.records.remove(...);" similar to that in this.removeName(int namenum) {}?
}
2003-03-07 16:52:37 -05:00
2002-04-23 18:24:41 -04:00
public int getNumRecords ( ) {
2002-01-30 21:22:28 -05:00
return records . size ( ) ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* gets the font record at the given index in the font table . Remember
* " There is No Four " ( someone at M$ must have gone to Rocky Horror one too
* many times )
*
* @param idx the index to look at ( 0 or greater but NOT 4 )
* @return FontRecord located at the given index
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
public FontRecord getFontRecordAt ( int idx ) {
2002-01-30 21:22:28 -05:00
int index = idx ;
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
if ( index > 4 ) {
2002-01-30 21:22:28 -05:00
index - = 1 ; // adjust for "There is no 4"
}
2002-04-23 18:24:41 -04:00
if ( index > ( numfonts - 1 ) ) {
2002-01-30 21:22:28 -05:00
throw new ArrayIndexOutOfBoundsException (
2002-04-23 18:24:41 -04:00
" There are only " + numfonts
+ " font records, you asked for " + idx ) ;
2002-01-30 21:22:28 -05:00
}
FontRecord retval =
2003-02-06 05:29:45 -05:00
( FontRecord ) records . get ( ( records . getFontpos ( ) - ( numfonts - 1 ) ) + index ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
return retval ;
}
2008-07-12 13:38:10 -04:00
/ * *
* Retrieves the index of the given font
* /
public int getFontIndex ( FontRecord font ) {
2008-08-11 17:24:19 -04:00
for ( int i = 0 ; i < = numfonts ; i + + ) {
2008-07-12 13:38:10 -04:00
FontRecord thisFont =
( FontRecord ) records . get ( ( records . getFontpos ( ) - ( numfonts - 1 ) ) + i ) ;
if ( thisFont = = font ) {
2008-08-11 17:24:19 -04:00
// There is no 4!
if ( i > 3 ) {
return ( i + 1 ) ;
}
return i ;
2008-07-12 13:38:10 -04:00
}
2008-08-11 17:24:19 -04:00
}
throw new IllegalArgumentException ( " Could not find that font! " ) ;
2008-07-12 13:38:10 -04:00
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates a new font record and adds it to the " font table " . This causes the
* boundsheets to move down one , extended formats to move down ( so this function moves
* those pointers as well )
*
* @return FontRecord that was just created
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
public FontRecord createNewFont ( ) {
2002-01-30 21:22:28 -05:00
FontRecord rec = ( FontRecord ) createFont ( ) ;
2002-07-29 09:25:46 -04:00
2003-02-06 05:29:45 -05:00
records . add ( records . getFontpos ( ) + 1 , rec ) ;
records . setFontpos ( records . getFontpos ( ) + 1 ) ;
2002-01-30 21:22:28 -05:00
numfonts + + ;
return rec ;
}
2008-07-15 16:24:53 -04:00
/ * *
* Removes the given font record from the
* file ' s list . This will make all
* subsequent font indicies drop by one ,
* so you ' ll need to update those yourself !
* /
public void removeFontRecord ( FontRecord rec ) {
2008-08-11 17:24:19 -04:00
records . remove ( rec ) ; // this updates FontPos for us
2008-07-15 16:24:53 -04:00
numfonts - - ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* gets the number of font records
*
2002-02-19 17:58:30 -05:00
* @return number of font records in the " font table "
2002-01-30 21:22:28 -05:00
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
public int getNumberOfFontRecords ( ) {
2002-01-30 21:22:28 -05:00
return numfonts ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* Sets the BOF for a given sheet
*
2008-08-11 18:55:38 -04:00
* @param sheetIndex the number of the sheet to set the positing of the bof for
2002-01-30 21:22:28 -05:00
* @param pos the actual bof position
* /
2002-07-29 09:25:46 -04:00
2008-08-11 18:55:38 -04:00
public void setSheetBof ( int sheetIndex , int pos ) {
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
2008-08-11 18:55:38 -04:00
log . log ( DEBUG , " setting bof for sheetnum = " , new Integer ( sheetIndex ) ,
2004-06-20 06:18:50 -04:00
" at pos= " , new Integer ( pos ) ) ;
2008-08-11 18:55:38 -04:00
checkSheets ( sheetIndex ) ;
getBoundSheetRec ( sheetIndex )
2002-04-23 18:24:41 -04:00
. setPositionOfBof ( pos ) ;
2002-01-30 21:22:28 -05:00
}
2002-07-29 09:25:46 -04:00
2008-08-11 18:55:38 -04:00
private BoundSheetRecord getBoundSheetRec ( int sheetIndex ) {
return ( ( BoundSheetRecord ) boundsheets . get ( sheetIndex ) ) ;
}
2002-01-30 21:22:28 -05:00
/ * *
* Returns the position of the backup record .
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
public BackupRecord getBackupRecord ( ) {
2003-02-06 05:29:45 -05:00
return ( BackupRecord ) records . get ( records . getBackuppos ( ) ) ;
2002-01-30 21:22:28 -05:00
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* sets the name for a given sheet . If the boundsheet record doesn ' t exist and
* its only one more than we have , go ahead and create it . If its > 1 more than
* we have , except
*
* @param sheetnum the sheet number ( 0 based )
* @param sheetname the name for the sheet
* /
2002-07-20 23:03:57 -04:00
public void setSheetName ( int sheetnum , String sheetname ) {
2006-01-03 06:41:36 -05:00
checkSheets ( sheetnum ) ;
BoundSheetRecord sheet = ( BoundSheetRecord ) boundsheets . get ( sheetnum ) ;
sheet . setSheetname ( sheetname ) ;
sheet . setSheetnameLength ( ( byte ) sheetname . length ( ) ) ;
2002-07-20 23:03:57 -04:00
}
2002-07-29 09:25:46 -04:00
2004-09-18 22:06:54 -04:00
/ * *
2008-04-30 23:25:37 -04:00
* Determines whether a workbook contains the provided sheet name .
2004-09-18 22:06:54 -04:00
*
2008-04-30 23:25:37 -04:00
* @param name the name to test ( case insensitive match )
2004-09-18 22:06:54 -04:00
* @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 .
* /
public boolean doesContainsSheetName ( String name , int excludeSheetIdx )
{
for ( int i = 0 ; i < boundsheets . size ( ) ; i + + )
{
2008-08-11 18:55:38 -04:00
BoundSheetRecord boundSheetRecord = getBoundSheetRec ( i ) ;
2008-04-30 23:25:37 -04:00
if ( excludeSheetIdx ! = i & & name . equalsIgnoreCase ( boundSheetRecord . getSheetname ( ) ) )
2004-09-18 22:06:54 -04:00
return true ;
}
return false ;
}
2006-01-03 06:41:36 -05:00
/ * *
* sets the name for a given sheet forcing the encoding . This is STILL A BAD IDEA .
* Poi now automatically detects unicode
*
* @deprecated 3 - Jan - 06 Simply use setSheetNam e ( int sheetnum , String sheetname )
* @param sheetnum the sheet number ( 0 based )
* @param sheetname the name for the sheet
* /
2002-07-20 23:03:57 -04:00
public void setSheetName ( int sheetnum , String sheetname , short encoding ) {
2002-01-30 21:22:28 -05:00
checkSheets ( sheetnum ) ;
2008-08-11 18:55:38 -04:00
BoundSheetRecord sheet = getBoundSheetRec ( sheetnum ) ;
2002-07-20 23:03:57 -04:00
sheet . setSheetname ( sheetname ) ;
sheet . setSheetnameLength ( ( byte ) sheetname . length ( ) ) ;
2008-08-11 17:24:19 -04:00
sheet . setCompressedUnicodeFlag ( ( byte ) encoding ) ;
2002-01-30 21:22:28 -05:00
}
2003-03-01 12:32:26 -05:00
2004-09-18 22:06:54 -04:00
/ * *
2008-08-11 17:24:19 -04:00
* 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 )
* /
2003-03-01 12:32:26 -05:00
public void setSheetOrder ( String sheetname , int pos ) {
2008-08-11 17:24:19 -04:00
int sheetNumber = getSheetIndex ( sheetname ) ;
//remove the sheet that needs to be reordered and place it in the spot we want
boundsheets . add ( pos , boundsheets . remove ( sheetNumber ) ) ;
2003-03-01 12:32:26 -05:00
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* gets the name for a given sheet .
*
2008-08-11 18:55:38 -04:00
* @param sheetIndex the sheet number ( 0 based )
2002-01-30 21:22:28 -05:00
* @return sheetname the name for the sheet
* /
2008-08-11 18:55:38 -04:00
public String getSheetName ( int sheetIndex ) {
return getBoundSheetRec ( sheetIndex ) . getSheetname ( ) ;
2002-01-30 21:22:28 -05:00
}
2002-07-29 09:25:46 -04:00
2008-01-08 06:59:26 -05:00
/ * *
2008-09-08 13:43:31 -04:00
* Gets the hidden flag for a given sheet .
* Note that a sheet could instead be
* set to be very hidden , which is different
* ( { @link # isSheetVeryHidden ( int ) } )
2008-01-08 06:59:26 -05:00
*
* @param sheetnum the sheet number ( 0 based )
* @return True if sheet is hidden
* /
public boolean isSheetHidden ( int sheetnum ) {
2008-08-11 18:55:38 -04:00
return getBoundSheetRec ( sheetnum ) . isHidden ( ) ;
2008-01-08 06:59:26 -05:00
}
2008-09-08 13:43:31 -04:00
/ * *
* Gets the very hidden flag for a given sheet .
* This is different from the normal
* hidden flag
* ( { @link # isSheetHidden ( int ) } )
*
* @param sheetnum the sheet number ( 0 based )
* @return True if sheet is very hidden
* /
public boolean isSheetVeryHidden ( int sheetnum ) {
return getBoundSheetRec ( sheetnum ) . isVeryHidden ( ) ;
}
2008-01-08 06:59:26 -05:00
/ * *
* Hide or unhide a sheet
*
* @param sheetnum The sheet number
* @param hidden True to mark the sheet as hidden , false otherwise
* /
public void setSheetHidden ( int sheetnum , boolean hidden ) {
2008-08-11 18:55:38 -04:00
getBoundSheetRec ( sheetnum ) . setHidden ( hidden ) ;
2008-01-08 06:59:26 -05:00
}
2008-09-08 13:43:31 -04:00
/ * *
* Hide or unhide a sheet .
* 0 = not hidden
* 1 = hidden
* 2 = very hidden .
*
* @param sheetnum The sheet number
* @param hidden 0 for not hidden , 1 for hidden , 2 for very hidden
* /
public void setSheetHidden ( int sheetnum , int hidden ) {
BoundSheetRecord bsr = getBoundSheetRec ( sheetnum ) ;
boolean h = false ;
boolean vh = false ;
if ( hidden = = 0 ) {
} else if ( hidden = = 1 ) {
h = true ;
} else if ( hidden = = 2 ) {
vh = true ;
} else {
throw new IllegalArgumentException ( " Invalid hidden flag " + hidden + " given, must be 0, 1 or 2 " ) ;
}
bsr . setHidden ( h ) ;
bsr . setVeryHidden ( vh ) ;
}
2002-04-23 18:24:41 -04:00
/ * *
* get the sheet ' s index
* @param name sheet name
* @return sheet index or - 1 if it was not found .
* /
public int getSheetIndex ( String name ) {
int retval = - 1 ;
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
for ( int k = 0 ; k < boundsheets . size ( ) ; k + + ) {
String sheet = getSheetName ( k ) ;
2002-07-29 09:25:46 -04:00
2003-07-27 14:52:24 -04:00
if ( sheet . equalsIgnoreCase ( name ) ) {
2002-04-23 18:24:41 -04:00
retval = k ;
break ;
}
}
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* if we ' re trying to address one more sheet than we have , go ahead and add it ! if we ' re
* trying to address > 1 more than we have throw an exception !
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
private void checkSheets ( int sheetnum ) {
if ( ( boundsheets . size ( ) ) < = sheetnum ) { // if we're short one add another..
if ( ( boundsheets . size ( ) + 1 ) < = sheetnum ) {
2002-01-30 21:22:28 -05:00
throw new RuntimeException ( " Sheet number out of bounds! " ) ;
}
2003-02-06 05:29:45 -05:00
BoundSheetRecord bsr = ( BoundSheetRecord ) createBoundSheet ( sheetnum ) ;
2002-07-29 09:25:46 -04:00
2003-02-06 05:29:45 -05:00
records . add ( records . getBspos ( ) + 1 , bsr ) ;
records . setBspos ( records . getBspos ( ) + 1 ) ;
2002-01-30 21:22:28 -05:00
boundsheets . add ( bsr ) ;
2008-03-04 11:53:32 -05:00
getOrCreateLinkTable ( ) . checkExternSheet ( sheetnum ) ;
2002-01-30 21:22:28 -05:00
fixTabIdRecord ( ) ;
}
}
2002-07-29 09:25:46 -04:00
2008-08-11 17:24:19 -04:00
/ * *
* @param sheetIndex zero based sheet index
* /
public void removeSheet ( int sheetIndex ) {
if ( boundsheets . size ( ) > sheetIndex ) {
records . remove ( records . getBspos ( ) - ( boundsheets . size ( ) - 1 ) + sheetIndex ) ;
boundsheets . remove ( sheetIndex ) ;
2002-01-30 21:22:28 -05:00
fixTabIdRecord ( ) ;
}
2008-06-16 09:20:42 -04:00
2008-06-18 07:35:04 -04:00
// Within NameRecords, it's ok to have the formula
// part point at deleted sheets. It's also ok to
// have the ExternSheetNumber point at deleted
// sheets.
// However, the sheet index must be adjusted, or
// excel will break. (Sheet index is either 0 for
// global, or 1 based index to sheet)
2008-08-11 17:24:19 -04:00
int sheetNum1Based = sheetIndex + 1 ;
2008-06-18 07:35:04 -04:00
for ( int i = 0 ; i < getNumNames ( ) ; i + + ) {
2008-08-11 17:24:19 -04:00
NameRecord nr = getNameRecord ( i ) ;
if ( nr . getSheetNumber ( ) = = sheetNum1Based ) {
// Excel re-writes these to point to no sheet
nr . setSheetNumber ( 0 ) ;
} else if ( nr . getSheetNumber ( ) > sheetNum1Based ) {
// Bump down by one, so still points
// at the same sheet
nr . setSheetNumber ( nr . getSheetNumber ( ) - 1 ) ;
}
2008-06-18 07:35:04 -04:00
}
2002-01-30 21:22:28 -05:00
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* make the tabid record look like the current situation .
*
* /
2002-04-23 18:24:41 -04:00
private void fixTabIdRecord ( ) {
2003-02-06 05:29:45 -05:00
TabIdRecord tir = ( TabIdRecord ) records . get ( records . getTabpos ( ) ) ;
2002-01-30 21:22:28 -05:00
short [ ] tia = new short [ boundsheets . size ( ) ] ;
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
for ( short k = 0 ; k < tia . length ; k + + ) {
2002-01-30 21:22:28 -05:00
tia [ k ] = k ;
}
tir . setTabIdArray ( tia ) ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* returns the number of boundsheet objects contained in this workbook .
*
* @return number of BoundSheet records
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
public int getNumSheets ( ) {
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " getNumSheets= " , new Integer ( boundsheets . size ( ) ) ) ;
2002-01-30 21:22:28 -05:00
return boundsheets . size ( ) ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* get the number of ExtendedFormat records contained in this workbook .
*
* @return int count of ExtendedFormat records
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
public int getNumExFormats ( ) {
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " getXF= " , new Integer ( numxfs ) ) ;
2002-01-30 21:22:28 -05:00
return numxfs ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* gets the ExtendedFormatRecord at the given 0 - based index
*
* @param index of the Extended format record ( 0 - based )
* @return ExtendedFormatRecord at the given index
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
public ExtendedFormatRecord getExFormatAt ( int index ) {
2003-02-06 05:29:45 -05:00
int xfptr = records . getXfpos ( ) - ( numxfs - 1 ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
xfptr + = index ;
ExtendedFormatRecord retval =
2002-04-23 18:24:41 -04:00
( ExtendedFormatRecord ) records . get ( xfptr ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
return retval ;
}
2008-07-15 17:38:38 -04:00
/ * *
* Removes the given ExtendedFormatRecord record from the
* file ' s list . This will make all
* subsequent font indicies drop by one ,
* so you ' ll need to update those yourself !
* /
public void removeExFormatRecord ( ExtendedFormatRecord rec ) {
2008-08-11 17:24:19 -04:00
records . remove ( rec ) ; // this updates XfPos for us
2008-07-15 17:38:38 -04:00
numxfs - - ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates a new Cell - type Extneded Format Record and adds it to the end of
* ExtendedFormatRecords collection
*
* @return ExtendedFormatRecord that was created
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
public ExtendedFormatRecord createCellXF ( ) {
2002-01-30 21:22:28 -05:00
ExtendedFormatRecord xf = createExtendedFormat ( ) ;
2002-07-29 09:25:46 -04:00
2003-02-06 05:29:45 -05:00
records . add ( records . getXfpos ( ) + 1 , xf ) ;
records . setXfpos ( records . getXfpos ( ) + 1 ) ;
2002-01-30 21:22:28 -05:00
numxfs + + ;
return xf ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* Adds a string to the SST table and returns its index ( if its a duplicate
2005-08-18 03:06:44 -04:00
* just returns its index and update the counts ) ASSUMES compressed unicode
* ( meaning 8bit )
2002-01-30 21:22:28 -05:00
*
* @param string the string to be added to the SSTRecord
2005-08-18 03:06:44 -04:00
*
2002-01-30 21:22:28 -05:00
* @return index of the string within the SSTRecord
* /
2002-07-29 09:25:46 -04:00
2005-08-18 03:06:44 -04:00
public int addSSTString ( UnicodeString string ) {
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
2005-08-18 03:06:44 -04:00
log . log ( DEBUG , " insert to sst string=' " , string ) ;
2002-04-23 18:24:41 -04:00
if ( sst = = null ) {
2002-01-30 21:22:28 -05:00
insertSST ( ) ;
}
2005-08-18 03:06:44 -04:00
return sst . addString ( string ) ;
2002-01-30 21:22:28 -05:00
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* given an index into the SST table , this function returns the corresponding String value
* @return String containing the SST String
* /
2002-07-29 09:25:46 -04:00
2005-08-18 03:06:44 -04:00
public UnicodeString getSSTString ( int str ) {
2002-04-23 18:24:41 -04:00
if ( sst = = null ) {
2002-01-30 21:22:28 -05:00
insertSST ( ) ;
}
2005-08-18 03:06:44 -04:00
UnicodeString retval = sst . getString ( str ) ;
2002-07-29 09:25:46 -04:00
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " Returning SST for index= " , new Integer ( str ) ,
2004-08-23 04:52:54 -04:00
" String= " , retval ) ;
2002-01-30 21:22:28 -05:00
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* use this function to add a Shared String Table to an existing sheet ( say
* generated by a different java api ) without an sst . . . .
* @see # createSST ( )
* @see org . apache . poi . hssf . record . SSTRecord
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
public void insertSST ( ) {
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " creating new SST via insertSST! " ) ;
2002-01-30 21:22:28 -05:00
sst = ( SSTRecord ) createSST ( ) ;
records . add ( records . size ( ) - 1 , createExtendedSST ( ) ) ;
records . add ( records . size ( ) - 2 , sst ) ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* Serializes all records int the worksheet section into a big byte array . Use
* this to write the Workbook out .
*
* @return byte array containing the HSSF - only portions of the POIFS file .
* /
2004-08-23 04:52:54 -04:00
// GJS: Not used so why keep it.
2003-06-26 09:33:47 -04:00
// public byte [] serialize() {
// log.log(DEBUG, "Serializing Workbook!");
// byte[] retval = null;
//
2004-08-23 04:52:54 -04:00
//// ArrayList bytes = new ArrayList(records.size());
2003-06-26 09:33:47 -04:00
// int arraysize = getSize();
// int pos = 0;
//
// retval = new byte[ arraysize ];
// for (int k = 0; k < records.size(); k++) {
//
// Record record = records.get(k);
2004-08-23 04:52:54 -04:00
//// Let's skip RECALCID records, as they are only use for optimization
2008-08-11 17:24:19 -04:00
// if(record.getSid() != RecalcIdRecord.sid || ((RecalcIdRecord)record).isNeeded()) {
2003-06-26 09:33:47 -04:00
// pos += record.serialize(pos, retval); // rec.length;
2008-08-11 17:24:19 -04:00
// }
2003-06-26 09:33:47 -04:00
// }
// log.log(DEBUG, "Exiting serialize workbook");
// return retval;
// }
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* Serializes all records int the worksheet section into a big byte array . Use
* this to write the Workbook out .
* @param offset of the data to be written
* @param data array of bytes to write this to
* /
2002-07-29 09:25:46 -04:00
2003-06-26 09:33:47 -04:00
public int serialize ( int offset , byte [ ] data )
{
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " Serializing Workbook with offsets " ) ;
2003-06-26 09:33:47 -04:00
int pos = 0 ;
SSTRecord sst = null ;
int sstPos = 0 ;
2007-06-04 09:52:57 -04:00
boolean wroteBoundSheets = false ;
2003-06-26 09:33:47 -04:00
for ( int k = 0 ; k < records . size ( ) ; k + + )
{
2004-08-23 04:52:54 -04:00
2003-06-26 09:33:47 -04:00
Record record = records . get ( k ) ;
2002-11-28 14:20:36 -05:00
// Let's skip RECALCID records, as they are only use for optimization
2003-06-26 09:33:47 -04:00
if ( record . getSid ( ) ! = RecalcIdRecord . sid | | ( ( RecalcIdRecord ) record ) . isNeeded ( ) )
{
2007-06-04 09:52:57 -04:00
int len = 0 ;
2003-06-26 09:33:47 -04:00
if ( record instanceof SSTRecord )
{
sst = ( SSTRecord ) record ;
sstPos = pos ;
}
if ( record . getSid ( ) = = ExtSSTRecord . sid & & sst ! = null )
{
record = sst . createExtSSTRecord ( sstPos + offset ) ;
}
2007-06-04 09:52:57 -04:00
if ( record instanceof BoundSheetRecord ) {
if ( ! wroteBoundSheets ) {
for ( int i = 0 ; i < boundsheets . size ( ) ; i + + ) {
2008-08-11 18:55:38 -04:00
len + = getBoundSheetRec ( i )
2007-06-04 09:52:57 -04:00
. serialize ( pos + offset + len , data ) ;
}
wroteBoundSheets = true ;
}
} else {
len = record . serialize ( pos + offset , data ) ;
}
2005-05-01 07:26:18 -04:00
///// DEBUG BEGIN /////
// if (len != record.getRecordSize())
// throw new IllegalStateException("Record size does not match serialized bytes. Serialized size = " + len + " but getRecordSize() returns " + record.getRecordSize());
///// DEBUG END /////
pos + = len ; // rec.length;
2002-11-28 14:20:36 -05:00
}
2002-01-30 21:22:28 -05:00
}
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " Exiting serialize workbook " ) ;
2002-01-30 21:22:28 -05:00
return pos ;
}
2002-07-29 09:25:46 -04:00
2003-06-26 09:33:47 -04:00
public int getSize ( )
{
2002-01-30 21:22:28 -05:00
int retval = 0 ;
2002-07-29 09:25:46 -04:00
2003-06-26 09:33:47 -04:00
SSTRecord sst = null ;
for ( int k = 0 ; k < records . size ( ) ; k + + )
{
Record record = records . get ( k ) ;
2002-11-28 14:20:36 -05:00
// Let's skip RECALCID records, as they are only use for optimization
2003-06-26 09:33:47 -04:00
if ( record . getSid ( ) ! = RecalcIdRecord . sid | | ( ( RecalcIdRecord ) record ) . isNeeded ( ) )
{
if ( record instanceof SSTRecord )
sst = ( SSTRecord ) record ;
if ( record . getSid ( ) = = ExtSSTRecord . sid & & sst ! = null )
retval + = sst . calcExtSSTRecordSize ( ) ;
else
retval + = record . getRecordSize ( ) ;
2002-11-28 14:20:36 -05:00
}
2002-01-30 21:22:28 -05:00
}
return retval ;
2004-08-23 04:52:54 -04:00
}
2002-01-30 21:22:28 -05:00
/ * *
* creates the BOF record
* @see org . apache . poi . hssf . record . BOFRecord
* @see org . apache . poi . hssf . record . Record
* @return record containing a BOFRecord
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createBOF ( ) {
2002-01-30 21:22:28 -05:00
BOFRecord retval = new BOFRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setVersion ( ( short ) 0x600 ) ;
retval . setType ( ( short ) 5 ) ;
retval . setBuild ( ( short ) 0x10d3 ) ;
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
// retval.setBuild((short)0x0dbb);
2002-01-30 21:22:28 -05:00
retval . setBuildYear ( ( short ) 1996 ) ;
retval . setHistoryBitMask ( 0x41 ) ; // was c1 before verify
retval . setRequiredVersion ( 0x6 ) ;
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates the InterfaceHdr record
* @see org . apache . poi . hssf . record . InterfaceHdrRecord
* @see org . apache . poi . hssf . record . Record
* @return record containing a InterfaceHdrRecord
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createInterfaceHdr ( ) {
2002-01-30 21:22:28 -05:00
InterfaceHdrRecord retval = new InterfaceHdrRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setCodepage ( CODEPAGE ) ;
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates an MMS record
* @see org . apache . poi . hssf . record . MMSRecord
* @see org . apache . poi . hssf . record . Record
* @return record containing a MMSRecord
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createMMS ( ) {
2002-01-30 21:22:28 -05:00
MMSRecord retval = new MMSRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setAddMenuCount ( ( byte ) 0 ) ;
retval . setDelMenuCount ( ( byte ) 0 ) ;
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates the InterfaceEnd record
* @see org . apache . poi . hssf . record . InterfaceEndRecord
* @see org . apache . poi . hssf . record . Record
* @return record containing a InterfaceEndRecord
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createInterfaceEnd ( ) {
2002-01-30 21:22:28 -05:00
return new InterfaceEndRecord ( ) ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates the WriteAccess record containing the logged in user ' s name
* @see org . apache . poi . hssf . record . WriteAccessRecord
* @see org . apache . poi . hssf . record . Record
* @return record containing a WriteAccessRecord
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createWriteAccess ( ) {
2002-01-30 21:22:28 -05:00
WriteAccessRecord retval = new WriteAccessRecord ( ) ;
2002-07-29 09:25:46 -04:00
2004-09-18 21:37:33 -04:00
try
{
retval . setUsername ( System . getProperty ( " user.name " ) ) ;
}
catch ( java . security . AccessControlException e )
{
// AccessControlException can occur in a restricted context
// (client applet/jws application or restricted security server)
retval . setUsername ( " POI " ) ;
}
2002-01-30 21:22:28 -05:00
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates the Codepage record containing the constant stored in CODEPAGE
* @see org . apache . poi . hssf . record . CodepageRecord
* @see org . apache . poi . hssf . record . Record
* @return record containing a CodepageRecord
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createCodepage ( ) {
2002-01-30 21:22:28 -05:00
CodepageRecord retval = new CodepageRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setCodepage ( CODEPAGE ) ;
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates the DSF record containing a 0 since HSSF can ' t even create Dual Stream Files
* @see org . apache . poi . hssf . record . DSFRecord
* @see org . apache . poi . hssf . record . Record
* @return record containing a DSFRecord
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createDSF ( ) {
2002-01-30 21:22:28 -05:00
DSFRecord retval = new DSFRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setDsf (
2002-04-23 18:24:41 -04:00
( short ) 0 ) ; // we don't even support double stream files
2002-01-30 21:22:28 -05:00
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates the TabId record containing an array of 0 , 1 , 2 . This release of HSSF
* always has the default three sheets , no less , no more .
* @see org . apache . poi . hssf . record . TabIdRecord
* @see org . apache . poi . hssf . record . Record
* @return record containing a TabIdRecord
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createTabId ( ) {
2002-01-30 21:22:28 -05:00
TabIdRecord retval = new TabIdRecord ( ) ;
2002-04-23 18:24:41 -04:00
short [ ] tabidarray = {
2002-01-30 21:22:28 -05:00
0
} ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setTabIdArray ( tabidarray ) ;
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates the FnGroupCount record containing the Magic number constant of 14 .
* @see org . apache . poi . hssf . record . FnGroupCountRecord
* @see org . apache . poi . hssf . record . Record
* @return record containing a FnGroupCountRecord
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createFnGroupCount ( ) {
2002-01-30 21:22:28 -05:00
FnGroupCountRecord retval = new FnGroupCountRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setCount ( ( short ) 14 ) ;
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates the WindowProtect record with protect set to false .
* @see org . apache . poi . hssf . record . WindowProtectRecord
* @see org . apache . poi . hssf . record . Record
* @return record containing a WindowProtectRecord
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createWindowProtect ( ) {
2002-01-30 21:22:28 -05:00
WindowProtectRecord retval = new WindowProtectRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setProtect (
2002-04-23 18:24:41 -04:00
false ) ; // by default even when we support it we won't
2002-01-30 21:22:28 -05:00
return retval ; // want it to be protected
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates the Protect record with protect set to false .
* @see org . apache . poi . hssf . record . ProtectRecord
* @see org . apache . poi . hssf . record . Record
* @return record containing a ProtectRecord
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createProtect ( ) {
2002-01-30 21:22:28 -05:00
ProtectRecord retval = new ProtectRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setProtect (
2002-04-23 18:24:41 -04:00
false ) ; // by default even when we support it we won't
2002-01-30 21:22:28 -05:00
return retval ; // want it to be protected
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates the Password record with password set to 0 .
* @see org . apache . poi . hssf . record . PasswordRecord
* @see org . apache . poi . hssf . record . Record
* @return record containing a PasswordRecord
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createPassword ( ) {
2002-01-30 21:22:28 -05:00
PasswordRecord retval = new PasswordRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setPassword ( ( short ) 0 ) ; // no password by default!
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates the ProtectionRev4 record with protect set to false .
* @see org . apache . poi . hssf . record . ProtectionRev4Record
* @see org . apache . poi . hssf . record . Record
* @return record containing a ProtectionRev4Record
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createProtectionRev4 ( ) {
2002-01-30 21:22:28 -05:00
ProtectionRev4Record retval = new ProtectionRev4Record ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setProtect ( false ) ;
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates the PasswordRev4 record with password set to 0 .
* @see org . apache . poi . hssf . record . PasswordRev4Record
* @see org . apache . poi . hssf . record . Record
* @return record containing a PasswordRev4Record
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createPasswordRev4 ( ) {
2002-01-30 21:22:28 -05:00
PasswordRev4Record retval = new PasswordRev4Record ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setPassword ( ( short ) 0 ) ; // no password by default!
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates the WindowOne record with the following magic values : < P >
* horizontal hold - 0x168 < P >
* vertical hold - 0x10e < P >
* width - 0x3a5c < P >
* height - 0x23be < P >
* options - 0x38 < P >
* selected tab - 0 < P >
* displayed tab - 0 < P >
* num selected tab - 0 < P >
* tab width ratio - 0x258 < P >
* @see org . apache . poi . hssf . record . WindowOneRecord
* @see org . apache . poi . hssf . record . Record
* @return record containing a WindowOneRecord
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createWindowOne ( ) {
2002-01-30 21:22:28 -05:00
WindowOneRecord retval = new WindowOneRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setHorizontalHold ( ( short ) 0x168 ) ;
retval . setVerticalHold ( ( short ) 0x10e ) ;
retval . setWidth ( ( short ) 0x3a5c ) ;
retval . setHeight ( ( short ) 0x23be ) ;
retval . setOptions ( ( short ) 0x38 ) ;
2008-08-11 18:55:38 -04:00
retval . setActiveSheetIndex ( 0x0 ) ;
retval . setFirstVisibleTab ( 0x0 ) ;
2002-01-30 21:22:28 -05:00
retval . setNumSelectedTabs ( ( short ) 1 ) ;
retval . setTabWidthRatio ( ( short ) 0x258 ) ;
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates the Backup record with backup set to 0 . ( loose the data , who cares )
* @see org . apache . poi . hssf . record . BackupRecord
* @see org . apache . poi . hssf . record . Record
* @return record containing a BackupRecord
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createBackup ( ) {
2002-01-30 21:22:28 -05:00
BackupRecord retval = new BackupRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setBackup (
2002-04-23 18:24:41 -04:00
( short ) 0 ) ; // by default DONT save backups of files...just loose data
2002-01-30 21:22:28 -05:00
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates the HideObj record with hide object set to 0 . ( don ' t hide )
* @see org . apache . poi . hssf . record . HideObjRecord
* @see org . apache . poi . hssf . record . Record
* @return record containing a HideObjRecord
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createHideObj ( ) {
2002-01-30 21:22:28 -05:00
HideObjRecord retval = new HideObjRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setHideObj ( ( short ) 0 ) ; // by default set hide object off
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates the DateWindow1904 record with windowing set to 0 . ( don ' t window )
* @see org . apache . poi . hssf . record . DateWindow1904Record
* @see org . apache . poi . hssf . record . Record
* @return record containing a DateWindow1904Record
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createDateWindow1904 ( ) {
2002-01-30 21:22:28 -05:00
DateWindow1904Record retval = new DateWindow1904Record ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setWindowing (
2002-04-23 18:24:41 -04:00
( short ) 0 ) ; // don't EVER use 1904 date windowing...tick tock..
2002-01-30 21:22:28 -05:00
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates the Precision record with precision set to true . ( full precision )
* @see org . apache . poi . hssf . record . PrecisionRecord
* @see org . apache . poi . hssf . record . Record
* @return record containing a PrecisionRecord
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createPrecision ( ) {
2002-01-30 21:22:28 -05:00
PrecisionRecord retval = new PrecisionRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setFullPrecision (
2002-04-23 18:24:41 -04:00
true ) ; // always use real numbers in calculations!
2002-01-30 21:22:28 -05:00
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates the RefreshAll record with refreshAll set to true . ( refresh all calcs )
* @see org . apache . poi . hssf . record . RefreshAllRecord
* @see org . apache . poi . hssf . record . Record
* @return record containing a RefreshAllRecord
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createRefreshAll ( ) {
2002-01-30 21:22:28 -05:00
RefreshAllRecord retval = new RefreshAllRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setRefreshAll ( false ) ;
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates the BookBool record with saveLinkValues set to 0 . ( don ' t save link values )
* @see org . apache . poi . hssf . record . BookBoolRecord
* @see org . apache . poi . hssf . record . Record
* @return record containing a BookBoolRecord
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createBookBool ( ) {
2002-01-30 21:22:28 -05:00
BookBoolRecord retval = new BookBoolRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setSaveLinkValues ( ( short ) 0 ) ;
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates a Font record with the following magic values : < P >
* fontheight = 0xc8 < P >
* attributes = 0x0 < P >
* color palette index = 0x7fff < P >
* bold weight = 0x190 < P >
* Font Name Length = 5 < P >
* Font Name = Arial < P >
*
* @see org . apache . poi . hssf . record . FontRecord
* @see org . apache . poi . hssf . record . Record
* @return record containing a FontRecord
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createFont ( ) {
2002-01-30 21:22:28 -05:00
FontRecord retval = new FontRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setFontHeight ( ( short ) 0xc8 ) ;
retval . setAttributes ( ( short ) 0x0 ) ;
retval . setColorPaletteIndex ( ( short ) 0x7fff ) ;
retval . setBoldWeight ( ( short ) 0x190 ) ;
retval . setFontNameLength ( ( byte ) 5 ) ;
retval . setFontName ( " Arial " ) ;
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* Creates a FormatRecord object
2002-02-19 17:58:30 -05:00
* @param id the number of the format record to create ( meaning its position in
2002-01-30 21:22:28 -05:00
* a file as M$ Excel would create it . )
* @return record containing a FormatRecord
* @see org . apache . poi . hssf . record . FormatRecord
* @see org . apache . poi . hssf . record . Record
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createFormat ( int id ) { // we'll need multiple editions for
2002-01-30 21:22:28 -05:00
FormatRecord retval = new FormatRecord ( ) ; // the differnt formats
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
switch ( id ) {
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 0 :
retval . setIndexCode ( ( short ) 5 ) ;
retval . setFormatStringLength ( ( byte ) 0x17 ) ;
retval . setFormatString ( " \" $ \" #,##0_); \\ ( \" $ \" #,##0 \\ ) " ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 1 :
retval . setIndexCode ( ( short ) 6 ) ;
retval . setFormatStringLength ( ( byte ) 0x1c ) ;
retval . setFormatString ( " \" $ \" #,##0_);[Red] \\ ( \" $ \" #,##0 \\ ) " ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 2 :
retval . setIndexCode ( ( short ) 7 ) ;
retval . setFormatStringLength ( ( byte ) 0x1d ) ;
retval . setFormatString ( " \" $ \" #,##0.00_); \\ ( \" $ \" #,##0.00 \\ ) " ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 3 :
retval . setIndexCode ( ( short ) 8 ) ;
retval . setFormatStringLength ( ( byte ) 0x22 ) ;
retval . setFormatString (
2002-04-23 18:24:41 -04:00
" \" $ \" #,##0.00_);[Red] \\ ( \" $ \" #,##0.00 \\ ) " ) ;
2002-01-30 21:22:28 -05:00
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 4 :
retval . setIndexCode ( ( short ) 0x2a ) ;
retval . setFormatStringLength ( ( byte ) 0x32 ) ;
retval . setFormatString (
2002-04-23 18:24:41 -04:00
" _( \" $ \" * #,##0_);_( \" $ \" * \\ (#,##0 \\ );_( \" $ \" * \" - \" _);_(@_) " ) ;
2002-01-30 21:22:28 -05:00
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 5 :
retval . setIndexCode ( ( short ) 0x29 ) ;
retval . setFormatStringLength ( ( byte ) 0x29 ) ;
retval . setFormatString (
2002-04-23 18:24:41 -04:00
" _(* #,##0_);_(* \\ (#,##0 \\ );_(* \" - \" _);_(@_) " ) ;
2002-01-30 21:22:28 -05:00
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 6 :
retval . setIndexCode ( ( short ) 0x2c ) ;
retval . setFormatStringLength ( ( byte ) 0x3a ) ;
retval . setFormatString (
2002-04-23 18:24:41 -04:00
" _( \" $ \" * #,##0.00_);_( \" $ \" * \\ (#,##0.00 \\ );_( \" $ \" * \" - \" ??_);_(@_) " ) ;
2002-01-30 21:22:28 -05:00
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 7 :
retval . setIndexCode ( ( short ) 0x2b ) ;
retval . setFormatStringLength ( ( byte ) 0x31 ) ;
retval . setFormatString (
2002-04-23 18:24:41 -04:00
" _(* #,##0.00_);_(* \\ (#,##0.00 \\ );_(* \" - \" ??_);_(@_) " ) ;
2002-01-30 21:22:28 -05:00
break ;
}
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* Creates an ExtendedFormatRecord object
2002-02-19 17:58:30 -05:00
* @param id the number of the extended format record to create ( meaning its position in
2002-01-30 21:22:28 -05:00
* a file as MS Excel would create it . )
*
* @return record containing an ExtendedFormatRecord
* @see org . apache . poi . hssf . record . ExtendedFormatRecord
* @see org . apache . poi . hssf . record . Record
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createExtendedFormat ( int id ) { // we'll need multiple editions
2002-01-30 21:22:28 -05:00
ExtendedFormatRecord retval = new ExtendedFormatRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
switch ( id ) {
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 0 :
retval . setFontIndex ( ( short ) 0 ) ;
retval . setFormatIndex ( ( short ) 0 ) ;
retval . setCellOptions ( ( short ) 0xfffffff5 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 1 :
retval . setFontIndex ( ( short ) 1 ) ;
retval . setFormatIndex ( ( short ) 0 ) ;
retval . setCellOptions ( ( short ) 0xfffffff5 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0xfffff400 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 2 :
retval . setFontIndex ( ( short ) 1 ) ;
retval . setFormatIndex ( ( short ) 0 ) ;
retval . setCellOptions ( ( short ) 0xfffffff5 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0xfffff400 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 3 :
retval . setFontIndex ( ( short ) 2 ) ;
retval . setFormatIndex ( ( short ) 0 ) ;
retval . setCellOptions ( ( short ) 0xfffffff5 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0xfffff400 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 4 :
retval . setFontIndex ( ( short ) 2 ) ;
retval . setFormatIndex ( ( short ) 0 ) ;
retval . setCellOptions ( ( short ) 0xfffffff5 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0xfffff400 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 5 :
retval . setFontIndex ( ( short ) 0 ) ;
retval . setFormatIndex ( ( short ) 0 ) ;
retval . setCellOptions ( ( short ) 0xfffffff5 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0xfffff400 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 6 :
retval . setFontIndex ( ( short ) 0 ) ;
retval . setFormatIndex ( ( short ) 0 ) ;
retval . setCellOptions ( ( short ) 0xfffffff5 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0xfffff400 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 7 :
retval . setFontIndex ( ( short ) 0 ) ;
retval . setFormatIndex ( ( short ) 0 ) ;
retval . setCellOptions ( ( short ) 0xfffffff5 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0xfffff400 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 8 :
retval . setFontIndex ( ( short ) 0 ) ;
retval . setFormatIndex ( ( short ) 0 ) ;
retval . setCellOptions ( ( short ) 0xfffffff5 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0xfffff400 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 9 :
retval . setFontIndex ( ( short ) 0 ) ;
retval . setFormatIndex ( ( short ) 0 ) ;
retval . setCellOptions ( ( short ) 0xfffffff5 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0xfffff400 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 10 :
retval . setFontIndex ( ( short ) 0 ) ;
retval . setFormatIndex ( ( short ) 0 ) ;
retval . setCellOptions ( ( short ) 0xfffffff5 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0xfffff400 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 11 :
retval . setFontIndex ( ( short ) 0 ) ;
retval . setFormatIndex ( ( short ) 0 ) ;
retval . setCellOptions ( ( short ) 0xfffffff5 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0xfffff400 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 12 :
retval . setFontIndex ( ( short ) 0 ) ;
retval . setFormatIndex ( ( short ) 0 ) ;
retval . setCellOptions ( ( short ) 0xfffffff5 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0xfffff400 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 13 :
retval . setFontIndex ( ( short ) 0 ) ;
retval . setFormatIndex ( ( short ) 0 ) ;
retval . setCellOptions ( ( short ) 0xfffffff5 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0xfffff400 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 14 :
retval . setFontIndex ( ( short ) 0 ) ;
retval . setFormatIndex ( ( short ) 0 ) ;
retval . setCellOptions ( ( short ) 0xfffffff5 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0xfffff400 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
// cell records
2002-01-30 21:22:28 -05:00
case 15 :
retval . setFontIndex ( ( short ) 0 ) ;
retval . setFormatIndex ( ( short ) 0 ) ;
retval . setCellOptions ( ( short ) 0x1 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0x0 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
// style
2002-01-30 21:22:28 -05:00
case 16 :
retval . setFontIndex ( ( short ) 1 ) ;
retval . setFormatIndex ( ( short ) 0x2b ) ;
retval . setCellOptions ( ( short ) 0xfffffff5 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0xfffff800 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 17 :
retval . setFontIndex ( ( short ) 1 ) ;
retval . setFormatIndex ( ( short ) 0x29 ) ;
retval . setCellOptions ( ( short ) 0xfffffff5 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0xfffff800 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 18 :
retval . setFontIndex ( ( short ) 1 ) ;
retval . setFormatIndex ( ( short ) 0x2c ) ;
retval . setCellOptions ( ( short ) 0xfffffff5 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0xfffff800 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 19 :
retval . setFontIndex ( ( short ) 1 ) ;
retval . setFormatIndex ( ( short ) 0x2a ) ;
retval . setCellOptions ( ( short ) 0xfffffff5 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0xfffff800 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 20 :
retval . setFontIndex ( ( short ) 1 ) ;
retval . setFormatIndex ( ( short ) 0x9 ) ;
retval . setCellOptions ( ( short ) 0xfffffff5 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0xfffff800 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
// unused from this point down
2002-01-30 21:22:28 -05:00
case 21 :
retval . setFontIndex ( ( short ) 5 ) ;
retval . setFormatIndex ( ( short ) 0x0 ) ;
retval . setCellOptions ( ( short ) 0x1 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0x800 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 22 :
retval . setFontIndex ( ( short ) 6 ) ;
retval . setFormatIndex ( ( short ) 0x0 ) ;
retval . setCellOptions ( ( short ) 0x1 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0x5c00 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 23 :
retval . setFontIndex ( ( short ) 0 ) ;
retval . setFormatIndex ( ( short ) 0x31 ) ;
retval . setCellOptions ( ( short ) 0x1 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0x5c00 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 24 :
retval . setFontIndex ( ( short ) 0 ) ;
retval . setFormatIndex ( ( short ) 0x8 ) ;
retval . setCellOptions ( ( short ) 0x1 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0x5c00 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 25 :
retval . setFontIndex ( ( short ) 6 ) ;
retval . setFormatIndex ( ( short ) 0x8 ) ;
retval . setCellOptions ( ( short ) 0x1 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0x5c00 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
break ;
}
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* creates an default cell type ExtendedFormatRecord object .
* @return ExtendedFormatRecord with intial defaults ( cell - type )
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected ExtendedFormatRecord createExtendedFormat ( ) {
2002-01-30 21:22:28 -05:00
ExtendedFormatRecord retval = new ExtendedFormatRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setFontIndex ( ( short ) 0 ) ;
retval . setFormatIndex ( ( short ) 0x0 ) ;
retval . setCellOptions ( ( short ) 0x1 ) ;
retval . setAlignmentOptions ( ( short ) 0x20 ) ;
retval . setIndentionOptions ( ( short ) 0 ) ;
retval . setBorderOptions ( ( short ) 0 ) ;
retval . setPaletteOptions ( ( short ) 0 ) ;
retval . setAdtlPaletteOptions ( ( short ) 0 ) ;
retval . setFillPaletteOptions ( ( short ) 0x20c0 ) ;
2002-07-20 10:10:57 -04:00
retval . setTopBorderPaletteIdx ( HSSFColor . BLACK . index ) ;
retval . setBottomBorderPaletteIdx ( HSSFColor . BLACK . index ) ;
retval . setLeftBorderPaletteIdx ( HSSFColor . BLACK . index ) ;
retval . setRightBorderPaletteIdx ( HSSFColor . BLACK . index ) ;
2002-01-30 21:22:28 -05:00
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* Creates a StyleRecord object
2002-02-19 17:58:30 -05:00
* @param id the number of the style record to create ( meaning its position in
* a file as MS Excel would create it .
2002-01-30 21:22:28 -05:00
* @return record containing a StyleRecord
* @see org . apache . poi . hssf . record . StyleRecord
* @see org . apache . poi . hssf . record . Record
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createStyle ( int id ) { // we'll need multiple editions
2002-01-30 21:22:28 -05:00
StyleRecord retval = new StyleRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
switch ( id ) {
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 0 :
retval . setIndex ( ( short ) 0xffff8010 ) ;
retval . setBuiltin ( ( byte ) 3 ) ;
retval . setOutlineStyleLevel ( ( byte ) 0xffffffff ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 1 :
retval . setIndex ( ( short ) 0xffff8011 ) ;
retval . setBuiltin ( ( byte ) 6 ) ;
retval . setOutlineStyleLevel ( ( byte ) 0xffffffff ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 2 :
retval . setIndex ( ( short ) 0xffff8012 ) ;
retval . setBuiltin ( ( byte ) 4 ) ;
retval . setOutlineStyleLevel ( ( byte ) 0xffffffff ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 3 :
retval . setIndex ( ( short ) 0xffff8013 ) ;
retval . setBuiltin ( ( byte ) 7 ) ;
retval . setOutlineStyleLevel ( ( byte ) 0xffffffff ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 4 :
retval . setIndex ( ( short ) 0xffff8000 ) ;
retval . setBuiltin ( ( byte ) 0 ) ;
retval . setOutlineStyleLevel ( ( byte ) 0xffffffff ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 5 :
retval . setIndex ( ( short ) 0xffff8014 ) ;
retval . setBuiltin ( ( byte ) 5 ) ;
retval . setOutlineStyleLevel ( ( byte ) 0xffffffff ) ;
break ;
}
return retval ;
}
2002-07-29 09:25:46 -04:00
2003-01-02 06:17:57 -05:00
/ * *
* Creates a palette record initialized to the default palette
* @return a PaletteRecord instance populated with the default colors
* @see org . apache . poi . hssf . record . PaletteRecord
* /
protected PaletteRecord createPalette ( )
{
2005-08-18 03:06:44 -04:00
return new PaletteRecord ( ) ;
2003-01-02 06:17:57 -05:00
}
2002-01-30 21:22:28 -05:00
/ * *
* Creates the UseSelFS object with the use natural language flag set to 0 ( false )
* @return record containing a UseSelFSRecord
* @see org . apache . poi . hssf . record . UseSelFSRecord
* @see org . apache . poi . hssf . record . Record
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createUseSelFS ( ) {
2002-01-30 21:22:28 -05:00
UseSelFSRecord retval = new UseSelFSRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setFlag ( ( short ) 0 ) ;
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* create a " bound sheet " or " bundlesheet " ( depending who you ask ) record
* Always sets the sheet ' s bof to 0 . You ' ll need to set that yourself .
* @param id either sheet 0 , 1 or 2 .
* @return record containing a BoundSheetRecord
* @see org . apache . poi . hssf . record . BoundSheetRecord
* @see org . apache . poi . hssf . record . Record
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createBoundSheet ( int id ) { // 1,2,3 sheets
2002-01-30 21:22:28 -05:00
BoundSheetRecord retval = new BoundSheetRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
switch ( id ) {
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 0 :
retval . setPositionOfBof ( 0x0 ) ; // should be set later
retval . setOptionFlags ( ( short ) 0 ) ;
retval . setSheetnameLength ( ( byte ) 0x6 ) ;
retval . setCompressedUnicodeFlag ( ( byte ) 0 ) ;
retval . setSheetname ( " Sheet1 " ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 1 :
retval . setPositionOfBof ( 0x0 ) ; // should be set later
retval . setOptionFlags ( ( short ) 0 ) ;
retval . setSheetnameLength ( ( byte ) 0x6 ) ;
retval . setCompressedUnicodeFlag ( ( byte ) 0 ) ;
retval . setSheetname ( " Sheet2 " ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 2 :
retval . setPositionOfBof ( 0x0 ) ; // should be set later
retval . setOptionFlags ( ( short ) 0 ) ;
retval . setSheetnameLength ( ( byte ) 0x6 ) ;
retval . setCompressedUnicodeFlag ( ( byte ) 0 ) ;
retval . setSheetname ( " Sheet3 " ) ;
break ;
}
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
2002-07-20 23:03:57 -04:00
* Creates the Country record with the default country set to 1
* and current country set to 7 in case of russian locale ( " ru_RU " ) and 1 otherwise
2002-01-30 21:22:28 -05:00
* @return record containing a CountryRecord
* @see org . apache . poi . hssf . record . CountryRecord
* @see org . apache . poi . hssf . record . Record
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createCountry ( ) { // what a novel idea, create your own!
2002-01-30 21:22:28 -05:00
CountryRecord retval = new CountryRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setDefaultCountry ( ( short ) 1 ) ;
2002-07-29 09:25:46 -04:00
2002-07-20 23:03:57 -04:00
// from Russia with love ;)
if ( Locale . getDefault ( ) . toString ( ) . equals ( " ru_RU " ) ) {
2008-08-11 17:24:19 -04:00
retval . setCurrentCountry ( ( short ) 7 ) ;
2002-07-20 23:03:57 -04:00
}
else {
2008-08-11 17:24:19 -04:00
retval . setCurrentCountry ( ( short ) 1 ) ;
2002-07-20 23:03:57 -04:00
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
return retval ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* Creates the SST record with no strings and the unique / num string set to 0
* @return record containing a SSTRecord
* @see org . apache . poi . hssf . record . SSTRecord
* @see org . apache . poi . hssf . record . Record
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createSST ( ) {
2002-01-30 21:22:28 -05:00
return new SSTRecord ( ) ;
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* Creates the ExtendedSST record with numstrings per bucket set to 0x8 . HSSF
* doesn ' t yet know what to do with this thing , but we create it with nothing in
* it hardly just to make Excel happy and our sheets look like Excel ' s
*
* @return record containing an ExtSSTRecord
* @see org . apache . poi . hssf . record . ExtSSTRecord
* @see org . apache . poi . hssf . record . Record
* /
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
protected Record createExtendedSST ( ) {
2002-01-30 21:22:28 -05:00
ExtSSTRecord retval = new ExtSSTRecord ( ) ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
retval . setNumStringsPerBucket ( ( short ) 0x8 ) ;
return retval ;
}
2008-03-04 11:53:32 -05:00
/ * *
* lazy initialization
* Note - creating the link table causes creation of 1 EXTERNALBOOK and 1 EXTERNALSHEET record
* /
private LinkTable getOrCreateLinkTable ( ) {
if ( linkTable = = null ) {
linkTable = new LinkTable ( ( short ) getNumSheets ( ) , records ) ;
}
return linkTable ;
}
2002-07-14 20:14:40 -04:00
public SheetReferences getSheetReferences ( ) {
2003-07-27 15:15:16 -04:00
SheetReferences refs = new SheetReferences ( ) ;
2008-03-04 11:53:32 -05:00
if ( linkTable ! = null ) {
int numRefStructures = linkTable . getNumberOfREFStructures ( ) ;
for ( short k = 0 ; k < numRefStructures ; k + + ) {
2003-07-27 15:15:16 -04:00
2008-03-04 11:53:32 -05:00
String sheetName = findSheetNameFromExternSheet ( k ) ;
2003-07-27 15:15:16 -04:00
refs . addSheetReference ( sheetName , k ) ;
}
}
return refs ;
2002-01-30 21:22:28 -05:00
}
2002-07-29 09:25:46 -04:00
2003-02-06 05:29:45 -05:00
/ * * finds the sheet name by his extern sheet index
2002-04-23 18:24:41 -04:00
* @param num extern sheet index
* @return sheet name
* /
public String findSheetNameFromExternSheet ( short num ) {
2002-07-29 09:25:46 -04:00
2008-08-11 18:55:38 -04:00
int indexToSheet = linkTable . getIndexToSheet ( num ) ;
2008-03-04 11:53:32 -05:00
2008-08-11 18:55:38 -04:00
if ( indexToSheet < 0 ) {
// TODO - what does '-1' mean here?
//error check, bail out gracefully!
return " " ;
2003-07-27 15:15:16 -04:00
}
2008-08-11 18:55:38 -04:00
return getSheetName ( indexToSheet ) ;
2002-04-23 18:24:41 -04:00
}
2002-07-29 09:25:46 -04:00
2003-02-06 05:29:45 -05:00
/ * *
* Finds the sheet index for a particular external sheet number .
* @param externSheetNumber The external sheet number to convert
* @return The index to the sheet found .
* /
public int getSheetIndexFromExternSheetIndex ( int externSheetNumber )
{
2008-03-04 11:53:32 -05:00
return linkTable . getSheetIndexFromExternSheetIndex ( externSheetNumber ) ;
2003-02-06 05:29:45 -05:00
}
2002-04-23 18:24:41 -04:00
/ * * returns the extern sheet number for specific sheet number ,
* if this sheet doesn ' t exist in extern sheet , add it
* @param sheetNumber sheet number
* @return index to extern sheet
* /
public short checkExternSheet ( int sheetNumber ) {
2008-03-04 11:53:32 -05:00
return getOrCreateLinkTable ( ) . checkExternSheet ( sheetNumber ) ;
2002-04-23 18:24:41 -04:00
}
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
/ * * gets the total number of names
* @return number of names
* /
public int getNumNames ( ) {
2008-03-04 11:53:32 -05:00
if ( linkTable = = null ) {
return 0 ;
}
return linkTable . getNumNames ( ) ;
2002-04-23 18:24:41 -04:00
}
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
/ * * gets the name record
* @param index name index
* @return name record
* /
public NameRecord getNameRecord ( int index ) {
2008-03-04 11:53:32 -05:00
return linkTable . getNameRecord ( index ) ;
2002-04-23 18:24:41 -04:00
}
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
/ * * creates new name
* @return new name record
* /
public NameRecord createName ( ) {
2008-03-04 11:53:32 -05:00
return addName ( new NameRecord ( ) ) ;
2003-02-06 05:29:45 -05:00
}
2003-03-06 15:41:17 -05:00
2003-02-06 05:29:45 -05:00
/ * * creates new name
* @return new name record
* /
public NameRecord addName ( NameRecord name )
{
2008-08-11 17:24:19 -04:00
2008-07-10 17:49:37 -04:00
LinkTable linkTable = getOrCreateLinkTable ( ) ;
if ( linkTable . nameAlreadyExists ( name ) ) {
2008-08-11 17:24:19 -04:00
throw new IllegalArgumentException (
2008-07-10 17:49:37 -04:00
" You are trying to assign a duplicated name record: "
+ name . getNameText ( ) ) ;
}
linkTable . addName ( name ) ;
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
return name ;
}
2008-07-10 17:49:37 -04:00
/ * *
* Generates a NameRecord to represent a built - in region
2008-08-11 17:24:19 -04:00
* @return a new NameRecord
2008-03-04 11:53:32 -05:00
* /
2008-08-11 17:24:19 -04:00
public NameRecord createBuiltInName ( byte builtInName , int sheetNumber ) {
if ( sheetNumber < 0 | | sheetNumber + 1 > Short . MAX_VALUE ) {
throw new IllegalArgumentException ( " Sheet number [ " + sheetNumber + " ]is not valid " ) ;
}
2008-03-04 11:53:32 -05:00
2008-08-11 17:24:19 -04:00
NameRecord name = new NameRecord ( builtInName , sheetNumber ) ;
2008-03-04 11:53:32 -05:00
2008-07-10 17:49:37 -04:00
while ( linkTable . nameAlreadyExists ( name ) ) {
2008-08-11 17:24:19 -04:00
throw new RuntimeException ( " Builtin ( " + builtInName
+ " ) already exists for sheet ( " + sheetNumber + " ) " ) ;
2008-07-10 17:49:37 -04:00
}
addName ( name ) ;
2008-03-04 11:53:32 -05:00
return name ;
}
2003-03-06 15:41:17 -05:00
2002-04-23 18:24:41 -04:00
/ * * removes the name
2008-08-11 17:24:19 -04:00
* @param nameIndex name index
2002-04-23 18:24:41 -04:00
* /
2008-08-11 17:24:19 -04:00
public void removeName ( int nameIndex ) {
2008-03-04 11:53:32 -05:00
2008-08-11 17:24:19 -04:00
if ( linkTable . getNumNames ( ) > nameIndex ) {
2003-02-06 05:29:45 -05:00
int idx = findFirstRecordLocBySid ( NameRecord . sid ) ;
2008-08-11 17:24:19 -04:00
records . remove ( idx + nameIndex ) ;
linkTable . removeName ( nameIndex ) ;
2002-04-23 18:24:41 -04:00
}
}
2002-07-29 09:25:46 -04:00
2002-08-15 10:13:34 -04:00
/ * *
* Returns a format index that matches the passed in format . It does not tie into HSSFDataFormat .
* @param format the format string
* @param createIfNotFound creates a new format if format not found
* @return the format id of a format that matches or - 1 if none found and createIfNotFound
* /
public short getFormat ( String format , boolean createIfNotFound ) {
2008-08-11 17:24:19 -04:00
Iterator iterator ;
for ( iterator = formats . iterator ( ) ; iterator . hasNext ( ) ; ) {
FormatRecord r = ( FormatRecord ) iterator . next ( ) ;
if ( r . getFormatString ( ) . equals ( format ) ) {
return r . getIndexCode ( ) ;
}
}
2002-08-15 10:13:34 -04:00
2008-08-11 17:24:19 -04:00
if ( createIfNotFound ) {
return createFormat ( format ) ;
}
2002-08-15 10:13:34 -04:00
2008-08-11 17:24:19 -04:00
return - 1 ;
2002-08-15 10:13:34 -04:00
}
2002-09-06 00:08:30 -04:00
/ * *
* Returns the list of FormatRecords in the workbook .
* @return ArrayList of FormatRecords in the notebook
* /
public ArrayList getFormats ( ) {
2008-08-11 17:24:19 -04:00
return formats ;
2002-09-06 00:08:30 -04:00
}
2002-08-15 10:13:34 -04:00
/ * *
* Creates a FormatRecord , inserts it , and returns the index code .
* @param format the format string
* @return the index code of the format record .
* @see org . apache . poi . hssf . record . FormatRecord
* @see org . apache . poi . hssf . record . Record
* /
2002-12-16 06:16:41 -05:00
public short createFormat ( String format )
{
2008-08-11 17:24:19 -04:00
// ++xfpos; //These are to ensure that positions are updated properly
2003-02-06 05:29:45 -05:00
// ++palettepos;
// ++bspos;
2002-12-16 06:16:41 -05:00
FormatRecord rec = new FormatRecord ( ) ;
maxformatid = maxformatid > = ( short ) 0xa4 ? ( short ) ( maxformatid + 1 ) : ( short ) 0xa4 ; //Starting value from M$ empiracle study.
rec . setIndexCode ( maxformatid ) ;
rec . setFormatStringLength ( ( byte ) format . length ( ) ) ;
rec . setFormatString ( format ) ;
2002-08-15 10:13:34 -04:00
2002-12-16 06:16:41 -05:00
int pos = 0 ;
2003-02-06 05:29:45 -05:00
while ( pos < records . size ( ) & & records . get ( pos ) . getSid ( ) ! = FormatRecord . sid )
2002-12-16 06:16:41 -05:00
pos + + ;
pos + = formats . size ( ) ;
formats . add ( rec ) ;
records . add ( pos , rec ) ;
return maxformatid ;
}
2002-08-15 10:13:34 -04:00
2005-04-28 10:04:22 -04:00
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* Returns the first occurance of a record matching a particular sid .
* /
2002-04-23 18:24:41 -04:00
public Record findFirstRecordBySid ( short sid ) {
for ( Iterator iterator = records . iterator ( ) ; iterator . hasNext ( ) ; ) {
2002-01-30 21:22:28 -05:00
Record record = ( Record ) iterator . next ( ) ;
2002-08-15 10:13:34 -04:00
if ( record . getSid ( ) = = sid ) {
return record ;
}
}
return null ;
}
2002-12-16 06:16:41 -05:00
/ * *
* Returns the index of a record matching a particular sid .
* @param sid The sid of the record to match
* @return The index of - 1 if no match made .
* /
public int findFirstRecordLocBySid ( short sid ) {
int index = 0 ;
for ( Iterator iterator = records . iterator ( ) ; iterator . hasNext ( ) ; ) {
Record record = ( Record ) iterator . next ( ) ;
if ( record . getSid ( ) = = sid ) {
return index ;
}
index + + ;
}
return - 1 ;
}
2002-08-15 10:13:34 -04:00
/ * *
* Returns the next occurance of a record matching a particular sid .
* /
public Record findNextRecordBySid ( short sid , int pos ) {
2003-02-06 05:29:45 -05:00
int matches = 0 ;
for ( Iterator iterator = records . iterator ( ) ; iterator . hasNext ( ) ; ) {
2002-08-15 10:13:34 -04:00
Record record = ( Record ) iterator . next ( ) ;
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
if ( record . getSid ( ) = = sid ) {
2003-02-06 05:29:45 -05:00
if ( matches + + = = pos )
return record ;
2002-01-30 21:22:28 -05:00
}
}
return null ;
}
2002-04-29 07:10:29 -04:00
2008-02-01 11:52:58 -05:00
public List getHyperlinks ( )
{
2008-08-11 17:24:19 -04:00
return hyperlinks ;
2008-02-01 11:52:58 -05:00
}
2002-04-29 07:10:29 -04:00
public List getRecords ( )
{
2003-02-06 05:29:45 -05:00
return records . getRecords ( ) ;
2002-04-29 07:10:29 -04:00
}
2002-11-28 14:32:52 -05:00
2002-12-16 06:16:41 -05:00
// public void insertChartRecords( List chartRecords )
// {
// backuppos += chartRecords.size();
// fontpos += chartRecords.size();
2003-01-02 06:17:57 -05:00
// palettepos += chartRecords.size();
2002-12-16 06:16:41 -05:00
// bspos += chartRecords.size();
// xfpos += chartRecords.size();
//
// records.addAll(protpos, chartRecords);
// }
2002-11-28 14:32:52 -05:00
/ * *
* Whether date windowing is based on 1 / 2 / 1904 or 1 / 1 / 1900 .
* Some versions of Excel ( Mac ) can save workbooks using 1904 date windowing .
*
* @return true if using 1904 date windowing
* /
public boolean isUsing1904DateWindowing ( ) {
return uses1904datewindowing ;
}
2003-01-02 06:17:57 -05:00
/ * *
* Returns the custom palette in use for this workbook ; if a custom palette record
* does not exist , then it is created .
* /
public PaletteRecord getCustomPalette ( )
{
2004-08-23 04:52:54 -04:00
PaletteRecord palette ;
2003-10-14 18:50:48 -04:00
int palettePos = records . getPalettepos ( ) ;
if ( palettePos ! = - 1 ) {
Record rec = records . get ( palettePos ) ;
if ( rec instanceof PaletteRecord ) {
2004-08-23 04:52:54 -04:00
palette = ( PaletteRecord ) rec ;
2003-10-14 18:50:48 -04:00
} else throw new RuntimeException ( " InternalError: Expected PaletteRecord but got a ' " + rec + " ' " ) ;
2004-08-23 04:52:54 -04:00
}
else
{
palette = createPalette ( ) ;
2003-10-14 18:50:48 -04:00
//Add the palette record after the bof which is always the first record
records . add ( 1 , palette ) ;
2003-10-14 19:18:03 -04:00
records . setPalettepos ( 1 ) ;
2004-08-23 04:52:54 -04:00
}
return palette ;
2003-01-02 06:17:57 -05:00
}
2008-01-09 18:21:35 -05:00
/ * *
* Finds the primary drawing group , if one already exists
* /
public void findDrawingGroup ( ) {
2008-08-11 17:24:19 -04:00
// Need to find a DrawingGroupRecord that
// contains a EscherDggRecord
for ( Iterator rit = records . iterator ( ) ; rit . hasNext ( ) ; ) {
Record r = ( Record ) rit . next ( ) ;
2008-09-07 12:30:35 -04:00
2008-08-11 17:24:19 -04:00
if ( r instanceof DrawingGroupRecord ) {
DrawingGroupRecord dg = ( DrawingGroupRecord ) r ;
dg . processChildRecords ( ) ;
2008-09-07 12:30:35 -04:00
2008-08-11 17:24:19 -04:00
EscherContainerRecord cr =
dg . getEscherContainer ( ) ;
if ( cr = = null ) {
continue ;
}
2008-09-07 12:30:35 -04:00
2008-08-11 17:24:19 -04:00
EscherDggRecord dgg = null ;
for ( Iterator it = cr . getChildRecords ( ) . iterator ( ) ; it . hasNext ( ) ; ) {
Object er = it . next ( ) ;
if ( er instanceof EscherDggRecord ) {
dgg = ( EscherDggRecord ) er ;
}
}
2008-09-07 12:30:35 -04:00
2008-08-11 17:24:19 -04:00
if ( dgg ! = null ) {
drawingManager = new DrawingManager2 ( dgg ) ;
return ;
}
}
}
// Look for the DrawingGroup record
2008-01-09 18:21:35 -05:00
int dgLoc = findFirstRecordLocBySid ( DrawingGroupRecord . sid ) ;
2008-09-07 12:30:35 -04:00
2008-08-11 17:24:19 -04:00
// If there is one, does it have a EscherDggRecord?
2008-01-09 18:21:35 -05:00
if ( dgLoc ! = - 1 ) {
2008-08-11 17:24:19 -04:00
DrawingGroupRecord dg =
( DrawingGroupRecord ) records . get ( dgLoc ) ;
EscherDggRecord dgg = null ;
for ( Iterator it = dg . getEscherRecords ( ) . iterator ( ) ; it . hasNext ( ) ; ) {
Object er = it . next ( ) ;
if ( er instanceof EscherDggRecord ) {
dgg = ( EscherDggRecord ) er ;
}
}
2008-09-07 12:30:35 -04:00
2008-08-11 17:24:19 -04:00
if ( dgg ! = null ) {
drawingManager = new DrawingManager2 ( dgg ) ;
}
2008-01-09 18:21:35 -05:00
}
}
2004-08-23 04:52:54 -04:00
2004-04-09 07:45:38 -04:00
/ * *
2008-01-09 18:21:35 -05:00
* Creates a primary drawing group record . If it already
* exists then it ' s modified .
2004-04-09 07:45:38 -04:00
* /
public void createDrawingGroup ( )
{
2005-05-01 07:26:18 -04:00
if ( drawingManager = = null )
2004-04-09 07:45:38 -04:00
{
EscherContainerRecord dggContainer = new EscherContainerRecord ( ) ;
EscherDggRecord dgg = new EscherDggRecord ( ) ;
EscherOptRecord opt = new EscherOptRecord ( ) ;
EscherSplitMenuColorsRecord splitMenuColors = new EscherSplitMenuColorsRecord ( ) ;
dggContainer . setRecordId ( ( short ) 0xF000 ) ;
dggContainer . setOptions ( ( short ) 0x000F ) ;
dgg . setRecordId ( EscherDggRecord . RECORD_ID ) ;
dgg . setOptions ( ( short ) 0x0000 ) ;
dgg . setShapeIdMax ( 1024 ) ;
dgg . setNumShapesSaved ( 0 ) ;
dgg . setDrawingsSaved ( 0 ) ;
dgg . setFileIdClusters ( new EscherDggRecord . FileIdCluster [ ] { } ) ;
2005-05-01 07:26:18 -04:00
drawingManager = new DrawingManager2 ( dgg ) ;
EscherContainerRecord bstoreContainer = null ;
if ( escherBSERecords . size ( ) > 0 )
{
bstoreContainer = new EscherContainerRecord ( ) ;
bstoreContainer . setRecordId ( EscherContainerRecord . BSTORE_CONTAINER ) ;
bstoreContainer . setOptions ( ( short ) ( ( escherBSERecords . size ( ) < < 4 ) | 0xF ) ) ;
for ( Iterator iterator = escherBSERecords . iterator ( ) ; iterator . hasNext ( ) ; )
{
EscherRecord escherRecord = ( EscherRecord ) iterator . next ( ) ;
bstoreContainer . addChildRecord ( escherRecord ) ;
}
}
2004-04-09 07:45:38 -04:00
opt . setRecordId ( ( short ) 0xF00B ) ;
opt . setOptions ( ( short ) 0x0033 ) ;
opt . addEscherProperty ( new EscherBoolProperty ( EscherProperties . TEXT__SIZE_TEXT_TO_FIT_SHAPE , 524296 ) ) ;
2005-05-01 07:26:18 -04:00
opt . addEscherProperty ( new EscherRGBProperty ( EscherProperties . FILL__FILLCOLOR , 0x08000041 ) ) ;
2004-04-09 07:45:38 -04:00
opt . addEscherProperty ( new EscherRGBProperty ( EscherProperties . LINESTYLE__COLOR , 134217792 ) ) ;
splitMenuColors . setRecordId ( ( short ) 0xF11E ) ;
splitMenuColors . setOptions ( ( short ) 0x0040 ) ;
splitMenuColors . setColor1 ( 0x0800000D ) ;
splitMenuColors . setColor2 ( 0x0800000C ) ;
splitMenuColors . setColor3 ( 0x08000017 ) ;
splitMenuColors . setColor4 ( 0x100000F7 ) ;
dggContainer . addChildRecord ( dgg ) ;
2005-05-01 07:26:18 -04:00
if ( bstoreContainer ! = null )
dggContainer . addChildRecord ( bstoreContainer ) ;
2004-04-09 07:45:38 -04:00
dggContainer . addChildRecord ( opt ) ;
dggContainer . addChildRecord ( splitMenuColors ) ;
2005-05-01 07:26:18 -04:00
int dgLoc = findFirstRecordLocBySid ( DrawingGroupRecord . sid ) ;
if ( dgLoc = = - 1 )
{
DrawingGroupRecord drawingGroup = new DrawingGroupRecord ( ) ;
drawingGroup . addEscherRecord ( dggContainer ) ;
int loc = findFirstRecordLocBySid ( CountryRecord . sid ) ;
getRecords ( ) . add ( loc + 1 , drawingGroup ) ;
}
else
{
DrawingGroupRecord drawingGroup = new DrawingGroupRecord ( ) ;
drawingGroup . addEscherRecord ( dggContainer ) ;
getRecords ( ) . set ( dgLoc , drawingGroup ) ;
}
2004-04-09 07:45:38 -04:00
}
2005-05-01 07:26:18 -04:00
}
2005-08-24 12:26:20 -04:00
public WindowOneRecord getWindowOne ( ) {
return windowOne ;
}
2007-10-01 14:07:32 -04:00
public EscherBSERecord getBSERecord ( int pictureIndex )
{
return ( EscherBSERecord ) escherBSERecords . get ( pictureIndex - 1 ) ;
}
2005-05-01 07:26:18 -04:00
public int addBSERecord ( EscherBSERecord e )
{
createDrawingGroup ( ) ;
// maybe we don't need that as an instance variable anymore
escherBSERecords . add ( e ) ;
int dgLoc = findFirstRecordLocBySid ( DrawingGroupRecord . sid ) ;
DrawingGroupRecord drawingGroup = ( DrawingGroupRecord ) getRecords ( ) . get ( dgLoc ) ;
EscherContainerRecord dggContainer = ( EscherContainerRecord ) drawingGroup . getEscherRecord ( 0 ) ;
EscherContainerRecord bstoreContainer ;
if ( dggContainer . getChild ( 1 ) . getRecordId ( ) = = EscherContainerRecord . BSTORE_CONTAINER )
{
bstoreContainer = ( EscherContainerRecord ) dggContainer . getChild ( 1 ) ;
}
else
{
bstoreContainer = new EscherContainerRecord ( ) ;
bstoreContainer . setRecordId ( EscherContainerRecord . BSTORE_CONTAINER ) ;
dggContainer . getChildRecords ( ) . add ( 1 , bstoreContainer ) ;
}
bstoreContainer . setOptions ( ( short ) ( ( escherBSERecords . size ( ) < < 4 ) | 0xF ) ) ;
bstoreContainer . addChildRecord ( e ) ;
return escherBSERecords . size ( ) ;
2004-04-09 07:45:38 -04:00
}
2005-05-01 07:26:18 -04:00
public DrawingManager2 getDrawingManager ( )
2004-04-09 07:45:38 -04:00
{
return drawingManager ;
}
2004-08-23 04:52:54 -04:00
2007-07-18 13:00:14 -04:00
public WriteProtectRecord getWriteProtect ( ) {
if ( this . writeProtect = = null ) {
this . writeProtect = new WriteProtectRecord ( ) ;
int i = 0 ;
for ( i = 0 ;
i < records . size ( ) & & ! ( records . get ( i ) instanceof BOFRecord ) ;
i + + ) {
}
records . add ( i + 1 , this . writeProtect ) ;
}
return this . writeProtect ;
}
public WriteAccessRecord getWriteAccess ( ) {
if ( this . writeAccess = = null ) {
this . writeAccess = ( WriteAccessRecord ) createWriteAccess ( ) ;
int i = 0 ;
for ( i = 0 ;
i < records . size ( ) & & ! ( records . get ( i ) instanceof InterfaceEndRecord ) ;
i + + ) {
}
records . add ( i + 1 , this . writeAccess ) ;
}
return this . writeAccess ;
}
public FileSharingRecord getFileSharing ( ) {
if ( this . fileShare = = null ) {
this . fileShare = new FileSharingRecord ( ) ;
int i = 0 ;
for ( i = 0 ;
i < records . size ( ) & & ! ( records . get ( i ) instanceof WriteAccessRecord ) ;
i + + ) {
}
records . add ( i + 1 , this . fileShare ) ;
}
return this . fileShare ;
}
2008-03-07 06:36:14 -05:00
/ * *
* is the workbook protected with a password ( not encrypted ) ?
* /
public boolean isWriteProtected ( ) {
if ( this . fileShare = = null ) {
2008-08-11 17:24:19 -04:00
return false ;
2008-03-07 06:36:14 -05:00
}
FileSharingRecord frec = getFileSharing ( ) ;
return ( frec . getReadOnly ( ) = = 1 ) ;
}
2007-07-18 13:00:14 -04:00
/ * *
* protect a workbook with a password ( not encypted , just sets writeprotect
* flags and the password .
* @param password to set
* /
public void writeProtectWorkbook ( String password , String username ) {
int protIdx = - 1 ;
FileSharingRecord frec = getFileSharing ( ) ;
WriteAccessRecord waccess = getWriteAccess ( ) ;
WriteProtectRecord wprotect = getWriteProtect ( ) ;
frec . setReadOnly ( ( short ) 1 ) ;
frec . setPassword ( FileSharingRecord . hashPassword ( password ) ) ;
frec . setUsername ( username ) ;
waccess . setUsername ( username ) ;
}
/ * *
* removes the write protect flag
* /
public void unwriteProtectWorkbook ( ) {
records . remove ( fileShare ) ;
records . remove ( writeProtect ) ;
fileShare = null ;
writeProtect = null ;
}
2008-03-04 11:53:32 -05:00
/ * *
* @param refIndex Index to REF entry in EXTERNSHEET record in the Link Table
* @param definedNameIndex zero - based to DEFINEDNAME or EXTERNALNAME record
* @return the string representation of the defined or external name
* /
public String resolveNameXText ( int refIndex , int definedNameIndex ) {
return linkTable . resolveNameXText ( refIndex , definedNameIndex ) ;
}
2008-08-11 18:55:38 -04:00
public NameXPtg getNameXPtg ( String name ) {
return getOrCreateLinkTable ( ) . getNameXPtg ( name ) ;
}
2008-09-07 12:30:35 -04:00
/ * *
* Check if the cloned sheet has drawings . If yes , then allocate a new drawing group ID and
* re - generate shape IDs
*
* @param sheet the cloned sheet
* /
public void cloneDrawings ( Sheet sheet ) {
findDrawingGroup ( ) ;
if ( drawingManager = = null ) {
//this workbook does not have drawings
return ;
}
//check if the cloned sheet has drawings
int aggLoc = sheet . aggregateDrawingRecords ( drawingManager , false ) ;
if ( aggLoc ! = - 1 ) {
EscherAggregate agg = ( EscherAggregate ) sheet . findFirstRecordBySid ( EscherAggregate . sid ) ;
2008-09-08 15:49:03 -04:00
EscherContainerRecord escherContainer = agg . getEscherContainer ( ) ;
if ( escherContainer = = null ) {
return ;
}
2008-09-07 12:30:35 -04:00
EscherDggRecord dgg = drawingManager . getDgg ( ) ;
//register a new drawing group for the cloned sheet
int dgId = drawingManager . findNewDrawingGroupId ( ) ;
dgg . addCluster ( dgId , 0 ) ;
dgg . setDrawingsSaved ( dgg . getDrawingsSaved ( ) + 1 ) ;
EscherDgRecord dg = null ;
2008-09-08 15:49:03 -04:00
for ( Iterator it = escherContainer . getChildRecords ( ) . iterator ( ) ; it . hasNext ( ) ; ) {
2008-09-07 12:30:35 -04:00
Object er = it . next ( ) ;
if ( er instanceof EscherDgRecord ) {
dg = ( EscherDgRecord ) er ;
//update id of the drawing in the cloned sheet
dg . setOptions ( ( short ) ( dgId < < 4 ) ) ;
} else if ( er instanceof EscherContainerRecord ) {
//recursively find shape records and re-generate shapeId
ArrayList spRecords = new ArrayList ( ) ;
EscherContainerRecord cp = ( EscherContainerRecord ) er ;
cp . getRecordsById ( EscherSpRecord . RECORD_ID , spRecords ) ;
for ( Iterator spIt = spRecords . iterator ( ) ; spIt . hasNext ( ) ; ) {
EscherSpRecord sp = ( EscherSpRecord ) spIt . next ( ) ;
int shapeId = drawingManager . allocateShapeId ( ( short ) dgId , dg ) ;
sp . setShapeId ( shapeId ) ;
}
}
}
}
}
2008-08-11 18:55:38 -04:00
}