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 ;
2008-11-28 19:46:33 -05:00
import java.security.AccessControlException ;
2002-01-30 21:22:28 -05:00
import java.util.ArrayList ;
import java.util.Iterator ;
2010-07-16 12:02:09 -04:00
import java.util.LinkedHashMap ;
2002-12-16 06:16:41 -05:00
import java.util.List ;
2002-07-20 23:03:57 -04:00
import java.util.Locale ;
2010-07-16 12:02:09 -04:00
import java.util.Map ;
import java.util.Map.Entry ;
2002-01-30 21:22:28 -05:00
2008-11-28 19:46:33 -05:00
import org.apache.poi.ddf.EscherBSERecord ;
import org.apache.poi.ddf.EscherBoolProperty ;
import org.apache.poi.ddf.EscherContainerRecord ;
import org.apache.poi.ddf.EscherDgRecord ;
import org.apache.poi.ddf.EscherDggRecord ;
import org.apache.poi.ddf.EscherOptRecord ;
import org.apache.poi.ddf.EscherProperties ;
import org.apache.poi.ddf.EscherRGBProperty ;
import org.apache.poi.ddf.EscherRecord ;
import org.apache.poi.ddf.EscherSpRecord ;
import org.apache.poi.ddf.EscherSplitMenuColorsRecord ;
import org.apache.poi.hssf.record.BOFRecord ;
import org.apache.poi.hssf.record.BackupRecord ;
import org.apache.poi.hssf.record.BookBoolRecord ;
import org.apache.poi.hssf.record.BoundSheetRecord ;
import org.apache.poi.hssf.record.CodepageRecord ;
import org.apache.poi.hssf.record.CountryRecord ;
import org.apache.poi.hssf.record.DSFRecord ;
import org.apache.poi.hssf.record.DateWindow1904Record ;
import org.apache.poi.hssf.record.DrawingGroupRecord ;
import org.apache.poi.hssf.record.EOFRecord ;
import org.apache.poi.hssf.record.EscherAggregate ;
import org.apache.poi.hssf.record.ExtSSTRecord ;
import org.apache.poi.hssf.record.ExtendedFormatRecord ;
import org.apache.poi.hssf.record.ExternSheetRecord ;
import org.apache.poi.hssf.record.FileSharingRecord ;
import org.apache.poi.hssf.record.FnGroupCountRecord ;
import org.apache.poi.hssf.record.FontRecord ;
import org.apache.poi.hssf.record.FormatRecord ;
import org.apache.poi.hssf.record.HideObjRecord ;
import org.apache.poi.hssf.record.HyperlinkRecord ;
import org.apache.poi.hssf.record.InterfaceEndRecord ;
import org.apache.poi.hssf.record.InterfaceHdrRecord ;
import org.apache.poi.hssf.record.MMSRecord ;
2010-07-16 12:02:09 -04:00
import org.apache.poi.hssf.record.NameCommentRecord ;
2008-11-28 19:46:33 -05:00
import org.apache.poi.hssf.record.NameRecord ;
import org.apache.poi.hssf.record.PaletteRecord ;
import org.apache.poi.hssf.record.PasswordRecord ;
import org.apache.poi.hssf.record.PasswordRev4Record ;
import org.apache.poi.hssf.record.PrecisionRecord ;
import org.apache.poi.hssf.record.ProtectRecord ;
import org.apache.poi.hssf.record.ProtectionRev4Record ;
import org.apache.poi.hssf.record.RecalcIdRecord ;
import org.apache.poi.hssf.record.Record ;
import org.apache.poi.hssf.record.RefreshAllRecord ;
import org.apache.poi.hssf.record.SSTRecord ;
import org.apache.poi.hssf.record.StyleRecord ;
import org.apache.poi.hssf.record.SupBookRecord ;
import org.apache.poi.hssf.record.TabIdRecord ;
import org.apache.poi.hssf.record.UseSelFSRecord ;
import org.apache.poi.hssf.record.WindowOneRecord ;
import org.apache.poi.hssf.record.WindowProtectRecord ;
import org.apache.poi.hssf.record.WriteAccessRecord ;
import org.apache.poi.hssf.record.WriteProtectRecord ;
2010-01-18 07:18:00 -05:00
import org.apache.poi.hssf.record.common.UnicodeString ;
2010-11-24 11:46:02 -05:00
import org.apache.poi.ss.formula.ptg.NameXPtg ;
2010-11-21 06:54:40 -05:00
import org.apache.poi.ss.formula.FormulaShifter ;
2010-11-27 01:30:03 -05:00
import org.apache.poi.ss.formula.udf.UDFFinder ;
2010-11-24 11:46:02 -05:00
import org.apache.poi.ss.formula.ptg.Ptg ;
2008-08-11 18:55:38 -04:00
import org.apache.poi.hssf.util.HSSFColor ;
2010-06-10 13:07:06 -04:00
import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalName ;
2008-09-27 22:04:31 -04:00
import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalSheet ;
2011-01-20 08:20:24 -05:00
import org.apache.poi.ss.usermodel.BuiltinFormats ;
2011-06-23 06:49:11 -04:00
import org.apache.poi.ss.util.WorkbookUtil ;
2009-12-21 19:51:29 -05:00
import org.apache.poi.util.Internal ;
2008-08-11 18:55:38 -04:00
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
* /
2009-12-21 19:51:29 -05:00
@Internal
public final class InternalWorkbook {
2008-09-29 18:04:20 -04:00
/ * *
* Excel silently truncates long sheet names to 31 chars .
* This constant is used to ensure uniqueness in the first 31 chars
* /
private static final int MAX_SENSITIVE_SHEET_NAME_LEN = 31 ;
2008-11-28 19:46:33 -05:00
2009-12-21 19:51:29 -05:00
private static final POILogger log = POILogFactory . getLogger ( InternalWorkbook . class ) ;
2008-11-28 19:46:33 -05: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
* /
2008-11-28 19:46:33 -05:00
private final static short CODEPAGE = 0x04B0 ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
* this contains the Worksheet record objects
* /
2009-12-21 19:13:56 -05:00
private final WorkbookRecordList records ;
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 .
* /
2009-12-21 19:13:56 -05:00
protected SSTRecord sst ;
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
* /
2009-12-21 19:13:56 -05:00
private final List < BoundSheetRecord > boundsheets ;
private final List < FormatRecord > formats ;
private final List < HyperlinkRecord > hyperlinks ;
/** the number of extended format records */
private int numxfs ;
/** the number of font records */
private int numfonts ;
/** holds the max format id */
private int maxformatid ;
/** whether 1904 date windowing is being used */
private boolean uses1904datewindowing ;
private DrawingManager2 drawingManager ;
private List < EscherBSERecord > escherBSERecords ;
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
2010-07-16 12:02:09 -04:00
/ * *
* Hold the { @link NameCommentRecord } s indexed by the name of the { @link NameRecord } to which they apply .
* /
private final Map < String , NameCommentRecord > commentRecords ;
2009-12-21 19:51:29 -05:00
private InternalWorkbook ( ) {
2009-12-21 19:13:56 -05:00
records = new WorkbookRecordList ( ) ;
boundsheets = new ArrayList < BoundSheetRecord > ( ) ;
formats = new ArrayList < FormatRecord > ( ) ;
hyperlinks = new ArrayList < HyperlinkRecord > ( ) ;
numxfs = 0 ;
numfonts = 0 ;
maxformatid = - 1 ;
uses1904datewindowing = false ;
escherBSERecords = new ArrayList < EscherBSERecord > ( ) ;
2010-07-16 12:02:09 -04:00
commentRecords = new LinkedHashMap < String , NameCommentRecord > ( ) ;
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
* /
2009-12-21 19:51:29 -05:00
public static InternalWorkbook createWorkbook ( List < Record > recs ) {
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " Workbook (readfile) created with reclen= " ,
2009-10-08 18:29:41 -04:00
Integer . valueOf ( recs . size ( ) ) ) ;
2009-12-21 19:51:29 -05:00
InternalWorkbook retval = new InternalWorkbook ( ) ;
2008-11-28 19:46:33 -05:00
List < Record > records = new ArrayList < Record > ( 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 + + ) {
2008-11-28 19:46:33 -05:00
Record rec = 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 ) ;
2008-11-28 19:46:33 -05:00
retval . boundsheets . add ( ( BoundSheetRecord ) 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 ) ;
2010-07-16 12:02:09 -04:00
retval . linkTable = new LinkTable ( recs , k , retval . records , retval . commentRecords ) ;
2008-03-04 11:53:32 -05:00
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 ) ;
2008-11-28 19:46:33 -05:00
retval . formats . add ( ( FormatRecord ) rec ) ;
2004-06-20 06:18:50 -04:00
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 ) ;
2009-08-17 22:41:45 -04:00
retval . windowOne = ( WindowOneRecord ) rec ;
2007-07-18 13:00:14 -04:00
break ;
2009-08-17 22:41:45 -04:00
case WriteAccessRecord . sid :
2007-07-18 13:00:14 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " found WriteAccess at " + k ) ;
retval . writeAccess = ( WriteAccessRecord ) rec ;
break ;
2009-08-17 22:41:45 -04:00
case WriteProtectRecord . sid :
2007-07-18 13:00:14 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " found WriteProtect at " + k ) ;
retval . writeProtect = ( WriteProtectRecord ) rec ;
break ;
2009-08-17 22:41:45 -04:00
case FileSharingRecord . sid :
2007-07-18 13:00:14 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " found FileSharing at " + k ) ;
retval . fileShare = ( FileSharingRecord ) rec ;
2010-07-16 12:02:09 -04:00
break ;
case NameCommentRecord . sid :
final NameCommentRecord ncr = ( NameCommentRecord ) rec ;
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " found NameComment at " + k ) ;
retval . commentRecords . put ( ncr . getNameText ( ) , ncr ) ;
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;
// }
2009-08-17 22:41:45 -04:00
2008-02-01 11:52:58 -05:00
// Look for other interesting values that
// follow the EOFRecord
for ( ; k < recs . size ( ) ; k + + ) {
2008-11-28 19:46:33 -05:00
Record rec = recs . get ( k ) ;
2008-02-01 11:52:58 -05:00
switch ( rec . getSid ( ) ) {
2008-08-11 17:24:19 -04:00
case HyperlinkRecord . sid :
2008-11-28 19:46:33 -05:00
retval . hyperlinks . add ( ( HyperlinkRecord ) rec ) ;
2008-08-11 17:24:19 -04:00
break ;
2008-02-01 11:52:58 -05:00
}
}
2009-08-17 22:41:45 -04:00
2005-08-24 12:26:20 -04:00
if ( retval . windowOne = = null ) {
2008-11-28 19:46:33 -05:00
retval . windowOne = createWindowOne ( ) ;
2005-08-24 12:26:20 -04:00
}
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 .
* /
2009-12-21 19:51:29 -05:00
public static InternalWorkbook createWorkbook ( )
2002-12-16 06:16:41 -05:00
{
2004-06-20 06:18:50 -04:00
if ( log . check ( POILogger . DEBUG ) )
log . log ( DEBUG , " creating new workbook from scratch " ) ;
2009-12-21 19:51:29 -05:00
InternalWorkbook retval = new InternalWorkbook ( ) ;
2008-11-28 19:46:33 -05:00
List < Record > records = new ArrayList < Record > ( 30 ) ;
2008-03-04 11:53:32 -05:00
retval . records . setRecords ( records ) ;
2008-11-28 19:46:33 -05:00
List < FormatRecord > formats = retval . formats ;
2009-12-22 23:35:37 -05:00
records . add ( createBOF ( ) ) ;
records . add ( new InterfaceHdrRecord ( CODEPAGE ) ) ;
records . add ( createMMS ( ) ) ;
records . add ( InterfaceEndRecord . instance ) ;
records . add ( createWriteAccess ( ) ) ;
records . add ( createCodepage ( ) ) ;
records . add ( createDSF ( ) ) ;
records . add ( createTabId ( ) ) ;
2008-11-28 19:46:33 -05:00
retval . records . setTabpos ( records . size ( ) - 1 ) ;
2009-12-22 23:35:37 -05:00
records . add ( createFnGroupCount ( ) ) ;
2008-11-28 19:46:33 -05:00
records . add ( createWindowProtect ( ) ) ;
records . add ( createProtect ( ) ) ;
retval . records . setProtpos ( records . size ( ) - 1 ) ;
records . add ( createPassword ( ) ) ;
records . add ( createProtectionRev4 ( ) ) ;
2009-12-22 23:35:37 -05:00
records . add ( createPasswordRev4 ( ) ) ;
2008-11-28 19:46:33 -05:00
retval . windowOne = createWindowOne ( ) ;
records . add ( retval . windowOne ) ;
2009-12-22 23:35:37 -05:00
records . add ( createBackup ( ) ) ;
2008-11-28 19:46:33 -05:00
retval . records . setBackuppos ( records . size ( ) - 1 ) ;
2009-12-22 23:35:37 -05:00
records . add ( createHideObj ( ) ) ;
records . add ( createDateWindow1904 ( ) ) ;
records . add ( createPrecision ( ) ) ;
2008-11-28 19:46:33 -05:00
records . add ( createRefreshAll ( ) ) ;
2009-12-22 23:35:37 -05:00
records . add ( createBookBool ( ) ) ;
records . add ( createFont ( ) ) ;
records . add ( createFont ( ) ) ;
records . add ( createFont ( ) ) ;
records . add ( createFont ( ) ) ;
2008-11-28 19:46:33 -05:00
retval . records . setFontpos ( records . size ( ) - 1 ) ; // last font record position
2002-01-30 21:22:28 -05:00
retval . numfonts = 4 ;
2002-08-15 10:13:34 -04:00
// set up format records
2008-11-28 19:46:33 -05:00
for ( int i = 0 ; i < = 7 ; i + + ) {
FormatRecord rec = createFormat ( i ) ;
retval . maxformatid = retval . maxformatid > = rec . getIndexCode ( ) ? retval . maxformatid : rec . getIndexCode ( ) ;
formats . add ( rec ) ;
records . add ( rec ) ;
2002-12-16 06:16:41 -05:00
}
2002-08-15 10:13:34 -04:00
2008-11-28 19:46:33 -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 ) ;
2008-11-28 19:46:33 -05:00
for ( int k = 0 ; k < 6 ; k + + ) {
records . add ( retval . createStyle ( k ) ) ;
2002-01-30 21:22:28 -05:00
}
2008-11-28 19:46:33 -05:00
records . add ( retval . createUseSelFS ( ) ) ;
2008-03-04 11:53:32 -05:00
int nBoundSheets = 1 ; // now just do 1
2008-11-28 19:46:33 -05:00
for ( int k = 0 ; k < nBoundSheets ; k + + ) {
BoundSheetRecord bsr = createBoundSheet ( k ) ;
2002-07-29 09:25:46 -04:00
2008-09-27 22:04:31 -04:00
records . add ( bsr ) ;
retval . boundsheets . add ( bsr ) ;
retval . records . setBspos ( records . size ( ) - 1 ) ;
2002-01-30 21:22:28 -05:00
}
2002-12-16 06:16:41 -05:00
records . add ( retval . createCountry ( ) ) ;
2009-08-17 22:41:45 -04:00
for ( int k = 0 ; k < nBoundSheets ; k + + ) {
2008-03-04 11:53:32 -05:00
retval . getOrCreateLinkTable ( ) . checkExternSheet ( k ) ;
}
2008-11-28 19:46:33 -05:00
retval . sst = new SSTRecord ( ) ;
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 ;
}
2009-08-17 22:41:45 -04:00
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
}
2009-08-17 22:41:45 -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 ( ) {
2008-11-28 19:46:33 -05:00
FontRecord rec = 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 ;
}
2009-08-17 22:41:45 -04:00
2008-07-15 16:24:53 -04:00
/ * *
* Removes the given font record from the
2009-08-17 22:41:45 -04:00
* file ' s list . This will make all
2008-07-15 16:24:53 -04:00
* 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 ) )
2009-10-08 18:29:41 -04:00
log . log ( DEBUG , " setting bof for sheetnum = " , Integer . valueOf ( sheetIndex ) ,
" at pos= " , Integer . valueOf ( 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 ) {
2008-11-28 19:46:33 -05:00
return boundsheets . get ( sheetIndex ) ;
2008-08-11 18:55:38 -04:00
}
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
2008-09-29 18:04:20 -04:00
* its only one more than we have , go ahead and create it . If it ' s > 1 more than
2002-01-30 21:22:28 -05:00
* we have , except
*
* @param sheetnum the sheet number ( 0 based )
* @param sheetname the name for the sheet
* /
2008-09-29 18:04:20 -04:00
public void setSheetName ( int sheetnum , String sheetname ) {
2006-01-03 06:41:36 -05:00
checkSheets ( sheetnum ) ;
2011-06-23 06:49:11 -04:00
// YK: Mimic Excel and silently truncate sheet names longer than 31 characters
if ( sheetname . length ( ) > 31 ) sheetname = sheetname . substring ( 0 , 31 ) ;
2008-11-28 19:46:33 -05:00
BoundSheetRecord sheet = boundsheets . get ( sheetnum ) ;
2006-01-03 06:41:36 -05:00
sheet . setSheetname ( sheetname ) ;
2002-07-20 23:03:57 -04:00
}
2002-07-29 09:25:46 -04:00
2004-09-18 22:06:54 -04:00
/ * *
2009-08-17 22:41:45 -04:00
* Determines whether a workbook contains the provided sheet name . For the purpose of
2008-09-29 18:04:20 -04:00
* comparison , long names are truncated to 31 chars .
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 .
* /
2008-09-29 18:04:20 -04:00
public boolean doesContainsSheetName ( String name , int excludeSheetIdx ) {
String aName = name ;
if ( aName . length ( ) > MAX_SENSITIVE_SHEET_NAME_LEN ) {
aName = aName . substring ( 0 , MAX_SENSITIVE_SHEET_NAME_LEN ) ;
}
for ( int i = 0 ; i < boundsheets . size ( ) ; i + + ) {
2008-08-11 18:55:38 -04:00
BoundSheetRecord boundSheetRecord = getBoundSheetRec ( i ) ;
2008-09-29 18:04:20 -04:00
if ( excludeSheetIdx = = i ) {
continue ;
}
String bName = boundSheetRecord . getSheetname ( ) ;
if ( bName . length ( ) > MAX_SENSITIVE_SHEET_NAME_LEN ) {
bName = bName . substring ( 0 , MAX_SENSITIVE_SHEET_NAME_LEN ) ;
}
if ( aName . equalsIgnoreCase ( bName ) ) {
2004-09-18 22:06:54 -04:00
return true ;
2008-09-29 18:04:20 -04:00
}
2004-09-18 22:06:54 -04:00
}
return false ;
}
2009-08-17 22:41:45 -04: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 )
* /
2009-08-17 22:41:45 -04:00
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
2009-08-17 22:41:45 -04:00
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 .
2009-08-17 22:41:45 -04:00
* Note that a sheet could instead be
2008-09-08 13:43:31 -04:00
* 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 .
2009-08-17 22:41:45 -04:00
* This is different from the normal
* hidden flag
2008-09-08 13:43:31 -04:00
* ( { @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
2009-08-17 22:41:45 -04:00
*
2008-01-08 06:59:26 -05:00
* @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
}
2009-08-17 22:41:45 -04:00
2008-09-08 13:43:31 -04:00
/ * *
* Hide or unhide a sheet .
* 0 = not hidden
* 1 = hidden
* 2 = very hidden .
2009-08-17 22:41:45 -04:00
*
2008-09-08 13:43:31 -04:00
* @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 ) {
2008-09-27 22:04:31 -04:00
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 ) ;
2008-09-08 13:43:31 -04:00
}
2009-08-17 22:41:45 -04:00
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-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! " ) ;
}
2008-09-22 19:43:50 -04:00
BoundSheetRecord bsr = 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 ( ) ;
2010-06-09 18:56:16 -04:00
} else {
// Ensure we have enough tab IDs
// Can be a few short if new sheets were added
if ( records . getTabpos ( ) > 0 ) {
TabIdRecord tir = ( TabIdRecord ) records . get ( records . getTabpos ( ) ) ;
if ( tir . _tabids . length < boundsheets . size ( ) ) {
fixTabIdRecord ( ) ;
}
}
2002-01-30 21:22:28 -05:00
}
}
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 ( ) ;
}
2009-08-17 22:41:45 -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
2009-08-17 22:41:45 -04:00
// sheets.
2008-06-18 07:35:04 -04:00
// 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 ) ;
2009-08-17 22:41:45 -04:00
2008-08-11 17:24:19 -04:00
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 ) )
2009-10-08 18:29:41 -04:00
log . log ( DEBUG , " getNumSheets= " , Integer . valueOf ( 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 ) )
2009-10-08 18:29:41 -04:00
log . log ( DEBUG , " getXF= " , Integer . valueOf ( 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 ;
}
2009-08-17 22:41:45 -04:00
2008-07-15 17:38:38 -04:00
/ * *
* Removes the given ExtendedFormatRecord record from the
2009-08-17 22:41:45 -04:00
* file ' s list . This will make all
2008-07-15 17:38:38 -04:00
* 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 ;
}
2009-08-17 22:41:45 -04:00
2008-09-14 18:19:06 -04:00
/ * *
* Returns the StyleRecord for the given
* xfIndex , or null if that ExtendedFormat doesn ' t
* have a Style set .
* /
public StyleRecord getStyleRecord ( int xfIndex ) {
2009-08-17 22:41:45 -04:00
// Style records always follow after
2008-09-27 22:04:31 -04:00
// the ExtendedFormat records
2008-11-28 21:07:49 -05:00
for ( int i = records . getXfpos ( ) ; i < records . size ( ) ; i + + ) {
2008-09-27 22:04:31 -04:00
Record r = records . get ( i ) ;
if ( r instanceof ExtendedFormatRecord ) {
2008-11-28 21:07:49 -05:00
continue ;
}
if ( ! ( r instanceof StyleRecord ) ) {
2010-08-19 14:08:54 -04:00
continue ;
2008-11-28 21:07:49 -05:00
}
StyleRecord sr = ( StyleRecord ) r ;
if ( sr . getXFIndex ( ) = = xfIndex ) {
return sr ;
2008-09-27 22:04:31 -04:00
}
}
return null ;
2008-09-14 18:19:06 -04:00
}
/ * *
* Creates a new StyleRecord , for the given Extended
* Format index , and adds it onto the end of the
* records collection
* /
public StyleRecord createStyleRecord ( int xfIndex ) {
2009-08-17 22:41:45 -04:00
// Style records always follow after
2008-09-27 22:04:31 -04:00
// the ExtendedFormat records
StyleRecord newSR = new StyleRecord ( ) ;
2008-10-23 20:58:49 -04:00
newSR . setXFIndex ( xfIndex ) ;
2009-08-17 22:41:45 -04:00
2008-09-27 22:04:31 -04:00
// Find the spot
int addAt = - 1 ;
for ( int i = records . getXfpos ( ) ; i < records . size ( ) & &
addAt = = - 1 ; i + + ) {
Record r = records . get ( i ) ;
if ( r instanceof ExtendedFormatRecord | |
r instanceof StyleRecord ) {
// Keep going
} else {
addAt = i ;
}
}
if ( addAt = = - 1 ) {
throw new IllegalStateException ( " No XF Records found! " ) ;
}
records . add ( addAt , newSR ) ;
2009-08-17 22:41:45 -04:00
2008-09-27 22:04:31 -04:00
return newSR ;
2008-09-14 18:19:06 -04:00
}
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 ) )
2009-10-08 18:29:41 -04:00
log . log ( DEBUG , " Returning SST for index= " , Integer . valueOf ( 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 . . . .
2009-04-11 10:15:27 -04:00
* @see # createExtendedSST ( )
2002-01-30 21:22:28 -05:00
* @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! " ) ;
2008-11-28 19:46:33 -05:00
sst = new SSTRecord ( ) ;
2002-01-30 21:22:28 -05:00
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 ( ) )
{
2009-08-17 22:41:45 -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
}
2008-11-28 19:46:33 -05:00
private static BOFRecord 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 ) ;
2008-11-28 19:46:33 -05:00
retval . setType ( BOFRecord . TYPE_WORKBOOK ) ;
2002-01-30 21:22:28 -05:00
retval . setBuild ( ( short ) 0x10d3 ) ;
retval . setBuildYear ( ( short ) 1996 ) ;
retval . setHistoryBitMask ( 0x41 ) ; // was c1 before verify
retval . setRequiredVersion ( 0x6 ) ;
return retval ;
}
2002-07-29 09:25:46 -04:00
2008-11-28 19:46:33 -05:00
private static MMSRecord 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 WriteAccess record containing the logged in user ' s name
* /
2008-11-28 19:46:33 -05:00
private static WriteAccessRecord createWriteAccess ( ) {
2002-01-30 21:22:28 -05:00
WriteAccessRecord retval = new WriteAccessRecord ( ) ;
2002-07-29 09:25:46 -04:00
2008-11-28 19:46:33 -05:00
try {
2004-09-18 21:37:33 -04:00
retval . setUsername ( System . getProperty ( " user.name " ) ) ;
2008-11-28 19:46:33 -05:00
} catch ( AccessControlException e ) {
2004-09-18 21:37:33 -04:00
// 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
2008-11-28 19:46:33 -05:00
private static CodepageRecord 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
2008-11-28 19:46:33 -05:00
private static DSFRecord createDSF ( ) {
2008-11-19 14:09:05 -05:00
return new DSFRecord ( false ) ; // we don't even support double stream files
2002-01-30 21:22:28 -05:00
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
2009-08-17 22:41:45 -04:00
* creates the TabId record containing an array
2002-01-30 21:22:28 -05:00
* /
2008-11-18 19:06:06 -05:00
private static TabIdRecord createTabId ( ) {
return new TabIdRecord ( ) ;
2002-01-30 21:22:28 -05:00
}
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 .
* /
2008-11-28 19:46:33 -05:00
private static FnGroupCountRecord 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
/ * *
2008-11-19 14:09:05 -05:00
* @return a new WindowProtect record with protect set to false .
2002-01-30 21:22:28 -05:00
* /
2008-11-19 14:09:05 -05:00
private static WindowProtectRecord createWindowProtect ( ) {
// by default even when we support it we won't
// want it to be protected
return new WindowProtectRecord ( false ) ;
2002-01-30 21:22:28 -05:00
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
2008-11-19 14:09:05 -05:00
* @return a new Protect record with protect set to false .
2002-01-30 21:22:28 -05:00
* /
2008-11-19 14:09:05 -05:00
private static ProtectRecord createProtect ( ) {
2008-11-28 19:46:33 -05:00
// by default even when we support it we won't
// want it to be protected
2009-08-17 22:41:45 -04:00
return new ProtectRecord ( false ) ;
2002-01-30 21:22:28 -05:00
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
2008-11-19 14:09:05 -05:00
* @return a new Password record with password set to 0x0000 ( no password ) .
2002-01-30 21:22:28 -05:00
* /
2008-11-19 14:09:05 -05:00
private static PasswordRecord createPassword ( ) {
return new PasswordRecord ( 0x0000 ) ; // no password by default!
2002-01-30 21:22:28 -05:00
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
2008-11-19 14:09:05 -05:00
* @return a new ProtectionRev4 record with protect set to false .
2002-01-30 21:22:28 -05:00
* /
2008-11-19 14:09:05 -05:00
private static ProtectionRev4Record createProtectionRev4 ( ) {
return new ProtectionRev4Record ( false ) ;
2002-01-30 21:22:28 -05:00
}
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
/ * *
2008-11-19 14:09:05 -05:00
* @return a new PasswordRev4 record with password set to 0 .
2002-01-30 21:22:28 -05:00
* /
2008-11-19 14:09:05 -05:00
private static PasswordRev4Record createPasswordRev4 ( ) {
return new PasswordRev4Record ( 0x0000 ) ;
2002-01-30 21:22:28 -05:00
}
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 >
* /
2008-11-28 19:46:33 -05:00
private static WindowOneRecord 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 )
* /
2008-11-28 19:46:33 -05:00
private static BackupRecord createBackup ( ) {
2002-01-30 21:22:28 -05:00
BackupRecord retval = new BackupRecord ( ) ;
2002-07-29 09:25:46 -04:00
2008-11-28 19:46:33 -05:00
retval . setBackup ( ( 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 )
* /
2008-11-28 19:46:33 -05:00
private static HideObjRecord createHideObj ( ) {
2002-01-30 21:22:28 -05:00
HideObjRecord retval = new HideObjRecord ( ) ;
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 )
* /
2008-11-28 19:46:33 -05:00
private static DateWindow1904Record createDateWindow1904 ( ) {
2002-01-30 21:22:28 -05:00
DateWindow1904Record retval = new DateWindow1904Record ( ) ;
2002-07-29 09:25:46 -04:00
2008-11-28 19:46:33 -05:00
retval . setWindowing ( ( 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 )
* /
2008-11-28 19:46:33 -05:00
private static PrecisionRecord createPrecision ( ) {
2002-01-30 21:22:28 -05:00
PrecisionRecord retval = new PrecisionRecord ( ) ;
2008-11-28 19:46:33 -05:00
retval . setFullPrecision ( 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
/ * *
2008-11-19 14:09:05 -05:00
* @return a new RefreshAll record with refreshAll set to false . ( do not refresh all calcs )
2002-01-30 21:22:28 -05:00
* /
2008-11-19 14:09:05 -05:00
private static RefreshAllRecord createRefreshAll ( ) {
return new RefreshAllRecord ( false ) ;
2002-01-30 21:22:28 -05:00
}
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 )
* /
2008-11-28 19:46:33 -05:00
private static BookBoolRecord createBookBool ( ) {
2002-01-30 21:22:28 -05:00
BookBoolRecord retval = new BookBoolRecord ( ) ;
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 >
* /
2008-11-28 19:46:33 -05:00
private static FontRecord 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 . 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 . )
* /
2009-08-17 22:41:45 -04:00
private static FormatRecord createFormat ( int id ) {
2008-11-28 19:46:33 -05:00
// we'll need multiple editions for
2008-11-18 19:06:06 -05:00
// the different formats
2002-07-29 09:25:46 -04:00
2011-01-20 08:20:24 -05:00
2002-04-23 18:24:41 -04:00
switch ( id ) {
2011-01-20 08:20:24 -05:00
case 0 : return new FormatRecord ( 5 , BuiltinFormats . getBuiltinFormat ( 5 ) ) ;
case 1 : return new FormatRecord ( 6 , BuiltinFormats . getBuiltinFormat ( 6 ) ) ;
case 2 : return new FormatRecord ( 7 , BuiltinFormats . getBuiltinFormat ( 7 ) ) ;
case 3 : return new FormatRecord ( 8 , BuiltinFormats . getBuiltinFormat ( 8 ) ) ;
case 4 : return new FormatRecord ( 0x2a , BuiltinFormats . getBuiltinFormat ( 0x2a ) ) ;
case 5 : return new FormatRecord ( 0x29 , BuiltinFormats . getBuiltinFormat ( 0x29 ) ) ;
case 6 : return new FormatRecord ( 0x2c , BuiltinFormats . getBuiltinFormat ( 0x2c ) ) ;
case 7 : return new FormatRecord ( 0x2b , BuiltinFormats . getBuiltinFormat ( 0x2b ) ) ;
2002-01-30 21:22:28 -05:00
}
2008-11-18 19:06:06 -05:00
throw new IllegalArgumentException ( " Unexpected id " + id ) ;
2002-01-30 21:22:28 -05:00
}
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 . )
* /
2008-11-28 19:46:33 -05:00
private static ExtendedFormatRecord 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 )
* /
2008-11-28 19:46:33 -05:00
private static 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
* /
2008-11-28 19:46:33 -05:00
private static StyleRecord 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 :
2008-10-23 20:58:49 -04:00
retval . setXFIndex ( 0x010 ) ;
retval . setBuiltinStyle ( 3 ) ;
2002-01-30 21:22:28 -05:00
retval . setOutlineStyleLevel ( ( byte ) 0xffffffff ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 1 :
2008-10-23 20:58:49 -04:00
retval . setXFIndex ( 0x011 ) ;
retval . setBuiltinStyle ( 6 ) ;
2002-01-30 21:22:28 -05:00
retval . setOutlineStyleLevel ( ( byte ) 0xffffffff ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 2 :
2008-10-23 20:58:49 -04:00
retval . setXFIndex ( 0x012 ) ;
retval . setBuiltinStyle ( 4 ) ;
2002-01-30 21:22:28 -05:00
retval . setOutlineStyleLevel ( ( byte ) 0xffffffff ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 3 :
2008-10-23 20:58:49 -04:00
retval . setXFIndex ( 0x013 ) ;
retval . setBuiltinStyle ( 7 ) ;
2002-01-30 21:22:28 -05:00
retval . setOutlineStyleLevel ( ( byte ) 0xffffffff ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 4 :
2008-10-23 20:58:49 -04:00
retval . setXFIndex ( 0x000 ) ;
retval . setBuiltinStyle ( 0 ) ;
2002-01-30 21:22:28 -05:00
retval . setOutlineStyleLevel ( ( byte ) 0xffffffff ) ;
break ;
2002-07-29 09:25:46 -04:00
2002-01-30 21:22:28 -05:00
case 5 :
2008-10-23 20:58:49 -04:00
retval . setXFIndex ( 0x014 ) ;
retval . setBuiltinStyle ( 5 ) ;
2002-01-30 21:22:28 -05:00
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
* /
2008-11-28 19:46:33 -05:00
private static PaletteRecord createPalette ( ) {
2005-08-18 03:06:44 -04:00
return new PaletteRecord ( ) ;
2003-01-02 06:17:57 -05:00
}
2009-08-17 22:41:45 -04:00
2002-01-30 21:22:28 -05:00
/ * *
2008-11-19 14:09:05 -05:00
* @return a new UseSelFS object with the use natural language flag set to 0 ( false )
2002-01-30 21:22:28 -05:00
* /
2008-11-19 14:09:05 -05:00
private static UseSelFSRecord createUseSelFS ( ) {
return new UseSelFSRecord ( false ) ;
2002-01-30 21:22:28 -05:00
}
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
* /
2008-09-22 19:43:50 -04:00
private static BoundSheetRecord createBoundSheet ( int id ) {
return new BoundSheetRecord ( " Sheet " + ( id + 1 ) ) ;
2002-01-30 21:22:28 -05:00
}
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
* /
2008-11-28 19:46:33 -05:00
private static CountryRecord createCountry ( ) {
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 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
* /
2008-11-28 19:46:33 -05:00
private static ExtSSTRecord createExtendedSST ( ) {
2002-01-30 21:22:28 -05:00
ExtSSTRecord retval = new ExtSSTRecord ( ) ;
retval . setNumStringsPerBucket ( ( short ) 0x8 ) ;
return retval ;
}
2009-08-17 22:41:45 -04:00
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
2003-02-06 05:29:45 -05:00
/ * * finds the sheet name by his extern sheet index
2008-09-14 14:55:28 -04:00
* @param externSheetIndex extern sheet index
* @return sheet name .
2002-04-23 18:24:41 -04:00
* /
2008-09-14 14:55:28 -04:00
public String findSheetNameFromExternSheet ( int externSheetIndex ) {
2002-07-29 09:25:46 -04:00
2008-09-27 22:04:31 -04:00
int indexToSheet = linkTable . getIndexToInternalSheet ( externSheetIndex ) ;
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-09-14 14:55:28 -04:00
if ( indexToSheet > = boundsheets . size ( ) ) {
// Not sure if this can ever happen (See bug 45798)
return " " ; // Seems to be what excel would do in this case
}
2008-08-11 18:55:38 -04:00
return getSheetName ( indexToSheet ) ;
2002-04-23 18:24:41 -04:00
}
2008-09-27 22:04:31 -04:00
public ExternalSheet getExternalSheet ( int externSheetIndex ) {
String [ ] extNames = linkTable . getExternalBookAndSheetName ( externSheetIndex ) ;
if ( extNames = = null ) {
return null ;
}
return new ExternalSheet ( extNames [ 0 ] , extNames [ 1 ] ) ;
}
2010-06-10 13:07:06 -04:00
public ExternalName getExternalName ( int externSheetIndex , int externNameIndex ) {
String nameName = linkTable . resolveNameXText ( externSheetIndex , externNameIndex ) ;
if ( nameName = = null ) {
return null ;
}
int ix = linkTable . resolveNameXIx ( externSheetIndex , externNameIndex ) ;
return new ExternalName ( nameName , externNameIndex , ix ) ;
}
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-09-27 22:04:31 -04:00
return ( short ) getOrCreateLinkTable ( ) . checkExternSheet ( sheetNumber ) ;
2002-04-23 18:24:41 -04:00
}
2002-07-29 09:25:46 -04:00
2008-09-29 18:04:20 -04:00
public int getExternalSheetIndex ( String workbookName , String sheetName ) {
return getOrCreateLinkTable ( ) . getExternalSheetIndex ( workbookName , sheetName ) ;
}
2009-08-17 22:41:45 -04:00
2008-09-27 22:04:31 -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
2010-07-16 12:02:09 -04:00
/ * * gets the name comment record
* @param nameRecord name record who ' s comment is required .
* @return name comment record or < code > null < / code > if there isn ' t one for the given name .
* /
public NameCommentRecord getNameCommentRecord ( final NameRecord nameRecord ) {
return commentRecords . get ( nameRecord . getNameText ( ) ) ;
}
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 )
{
2009-08-17 22:41:45 -04:00
2008-07-10 17:49:37 -04:00
LinkTable linkTable = getOrCreateLinkTable ( ) ;
linkTable . addName ( name ) ;
2002-07-29 09:25:46 -04:00
2002-04-23 18:24:41 -04:00
return name ;
}
2009-08-17 22:41:45 -04:00
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 " ) ;
}
2009-08-17 22:41:45 -04:00
2008-08-11 17:24:19 -04:00
NameRecord name = new NameRecord ( builtInName , sheetNumber ) ;
2009-08-17 22:41:45 -04:00
2010-09-11 08:45:59 -04:00
if ( linkTable . nameAlreadyExists ( name ) ) {
2009-08-17 22:41:45 -04:00
throw new RuntimeException ( " Builtin ( " + builtInName
2008-08-11 17:24:19 -04:00
+ " ) 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 ) {
2009-08-17 22:41:45 -04: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
2010-07-16 12:02:09 -04:00
/ * *
* If a { @link NameCommentRecord } is added or the name it references
* is renamed , then this will update the lookup cache for it .
* /
public void updateNameCommentRecordCache ( final NameCommentRecord commentRecord ) {
if ( commentRecords . containsValue ( commentRecord ) ) {
for ( Entry < String , NameCommentRecord > entry : commentRecords . entrySet ( ) ) {
if ( entry . getValue ( ) . equals ( commentRecord ) ) {
commentRecords . remove ( entry . getKey ( ) ) ;
break ;
}
}
}
commentRecords . put ( commentRecord . getNameText ( ) , commentRecord ) ;
}
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 ) {
2010-05-27 12:22:46 -04:00
for ( FormatRecord r : formats ) {
2008-08-11 17:24:19 -04:00
if ( r . getFormatString ( ) . equals ( format ) ) {
2008-11-18 19:06:06 -05:00
return ( short ) r . getIndexCode ( ) ;
2008-08-11 17:24:19 -04:00
}
2010-05-27 12:22:46 -04:00
}
2002-08-15 10:13:34 -04:00
2010-05-27 12:22:46 -04:00
if ( createIfNotFound ) {
2008-11-18 19:06:06 -05:00
return ( short ) createFormat ( format ) ;
2010-05-27 12:22:46 -04:00
}
2002-08-15 10:13:34 -04:00
2010-05-27 12:22:46 -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
* /
2010-05-27 12:22:46 -04:00
public List < FormatRecord > getFormats ( ) {
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 .
2008-11-18 19:06:06 -05:00
* @param formatString the format string
2002-08-15 10:13:34 -04:00
* @return the index code of the format record .
* @see org . apache . poi . hssf . record . FormatRecord
* @see org . apache . poi . hssf . record . Record
* /
2008-11-18 19:06:06 -05:00
public int createFormat ( String formatString ) {
maxformatid = maxformatid > = 0xa4 ? maxformatid + 1 : 0xa4 ; //Starting value from M$ empircal study.
FormatRecord rec = new FormatRecord ( maxformatid , formatString ) ;
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
2009-08-17 22:41:45 -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 ) {
2010-05-27 12:22:46 -04:00
for ( Record record : records ) {
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 ;
2010-05-27 12:22:46 -04:00
for ( Record record : records ) {
2002-12-16 06:16:41 -05:00
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 ;
2010-05-27 12:22:46 -04:00
for ( Record record : records ) {
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
2010-05-27 12:22:46 -04:00
public List < HyperlinkRecord > getHyperlinks ( )
2008-02-01 11:52:58 -05:00
{
2008-08-11 17:24:19 -04:00
return hyperlinks ;
2008-02-01 11:52:58 -05:00
}
2009-08-17 22:41:45 -04:00
2008-11-28 19:46:33 -05:00
public List < Record > 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
/ * *
* 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 ;
}
2009-08-17 22:41:45 -04:00
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
}
2009-08-17 22:41:45 -04:00
2008-01-09 18:21:35 -05:00
/ * *
* Finds the primary drawing group , if one already exists
* /
public void findDrawingGroup ( ) {
2010-05-27 12:22:46 -04:00
if ( drawingManager ! = null ) {
// We already have it!
return ;
}
2008-08-11 17:24:19 -04:00
// Need to find a DrawingGroupRecord that
// contains a EscherDggRecord
2010-05-27 12:22:46 -04:00
for ( Record r : records ) {
2008-08-11 17:24:19 -04:00
if ( r instanceof DrawingGroupRecord ) {
2008-11-28 19:46:33 -05:00
DrawingGroupRecord dg = ( DrawingGroupRecord ) r ;
2008-08-11 17:24:19 -04:00
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 ;
2009-02-19 20:55:47 -05:00
for ( Iterator < EscherRecord > it = cr . getChildIterator ( ) ; it . hasNext ( ) ; ) {
2008-08-11 17:24:19 -04:00
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-11-28 19:46:33 -05:00
DrawingGroupRecord dg = ( DrawingGroupRecord ) records . get ( dgLoc ) ;
2008-08-11 17:24:19 -04:00
EscherDggRecord dgg = null ;
2010-05-27 12:22:46 -04:00
for ( EscherRecord er : dg . getEscherRecords ( ) ) {
2008-08-11 17:24:19 -04:00
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
/ * *
2009-08-17 22:41:45 -04:00
* Creates a primary drawing group record . If it already
2008-01-09 18:21:35 -05:00
* exists then it ' s modified .
2004-04-09 07:45:38 -04:00
* /
2008-11-28 19:46:33 -05:00
public void createDrawingGroup ( ) {
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 ) ) ;
2010-05-27 12:22:46 -04:00
for ( EscherRecord escherRecord : escherBSERecords ) {
2005-05-01 07:26:18 -04:00
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 ) ;
2008-11-28 19:46:33 -05:00
if ( dgLoc = = - 1 ) {
2005-05-01 07:26:18 -04:00
DrawingGroupRecord drawingGroup = new DrawingGroupRecord ( ) ;
drawingGroup . addEscherRecord ( dggContainer ) ;
int loc = findFirstRecordLocBySid ( CountryRecord . sid ) ;
getRecords ( ) . add ( loc + 1 , drawingGroup ) ;
2008-11-28 19:46:33 -05:00
} else {
2005-05-01 07:26:18 -04:00
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
}
2009-08-17 22:41:45 -04:00
2005-08-24 12:26:20 -04:00
public WindowOneRecord getWindowOne ( ) {
return windowOne ;
}
2007-10-01 14:07:32 -04:00
2008-11-28 19:46:33 -05:00
public EscherBSERecord getBSERecord ( int pictureIndex ) {
return escherBSERecords . get ( pictureIndex - 1 ) ;
2007-10-01 14:07:32 -04:00
}
2008-11-28 19:46:33 -05:00
public int addBSERecord ( EscherBSERecord e ) {
2005-05-01 07:26:18 -04:00
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 ) ;
2009-02-19 20:55:47 -05:00
List < EscherRecord > childRecords = dggContainer . getChildRecords ( ) ;
childRecords . add ( 1 , bstoreContainer ) ;
dggContainer . setChildRecords ( childRecords ) ;
2005-05-01 07:26:18 -04:00
}
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 ( ) {
2008-11-28 19:46:33 -05:00
if ( writeProtect = = null ) {
writeProtect = new WriteProtectRecord ( ) ;
2007-07-18 13:00:14 -04:00
int i = 0 ;
2009-08-17 22:41:45 -04:00
for ( i = 0 ;
i < records . size ( ) & & ! ( records . get ( i ) instanceof BOFRecord ) ;
2007-07-18 13:00:14 -04:00
i + + ) {
}
2008-11-28 19:46:33 -05:00
records . add ( i + 1 , writeProtect ) ;
2007-07-18 13:00:14 -04:00
}
return this . writeProtect ;
}
public WriteAccessRecord getWriteAccess ( ) {
2008-11-28 19:46:33 -05:00
if ( writeAccess = = null ) {
writeAccess = createWriteAccess ( ) ;
2007-07-18 13:00:14 -04:00
int i = 0 ;
2009-08-17 22:41:45 -04:00
for ( i = 0 ;
i < records . size ( ) & & ! ( records . get ( i ) instanceof InterfaceEndRecord ) ;
2007-07-18 13:00:14 -04:00
i + + ) {
}
2008-11-28 19:46:33 -05:00
records . add ( i + 1 , writeAccess ) ;
2007-07-18 13:00:14 -04:00
}
2008-11-28 19:46:33 -05:00
return writeAccess ;
2007-07-18 13:00:14 -04:00
}
public FileSharingRecord getFileSharing ( ) {
2008-11-28 19:46:33 -05:00
if ( fileShare = = null ) {
fileShare = new FileSharingRecord ( ) ;
2007-07-18 13:00:14 -04:00
int i = 0 ;
2009-08-17 22:41:45 -04:00
for ( i = 0 ;
i < records . size ( ) & & ! ( records . get ( i ) instanceof WriteAccessRecord ) ;
2007-07-18 13:00:14 -04:00
i + + ) {
}
2008-11-28 19:46:33 -05:00
records . add ( i + 1 , fileShare ) ;
2007-07-18 13:00:14 -04:00
}
2008-11-28 19:46:33 -05:00
return fileShare ;
2007-07-18 13:00:14 -04:00
}
2009-08-17 22:41:45 -04:00
2008-03-07 06:36:14 -05:00
/ * *
* is the workbook protected with a password ( not encrypted ) ?
* /
public boolean isWriteProtected ( ) {
2008-11-28 19:46:33 -05:00
if ( fileShare = = null ) {
2008-08-11 17:24:19 -04:00
return false ;
2008-03-07 06:36:14 -05:00
}
FileSharingRecord frec = getFileSharing ( ) ;
2008-11-28 19:46:33 -05:00
return frec . getReadOnly ( ) = = 1 ;
2008-03-07 06:36:14 -05:00
}
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 ) ;
}
2010-11-27 01:30:03 -05:00
/ * *
*
* @param name the name of an external function , typically a name of a UDF
* @param udf locator of user - defiend functions to resolve names of VBA and Add - In functions
* @return the external name or null
* /
public NameXPtg getNameXPtg ( String name , UDFFinder udf ) {
LinkTable lnk = getOrCreateLinkTable ( ) ;
NameXPtg xptg = lnk . getNameXPtg ( name ) ;
if ( xptg = = null & & udf . findFunction ( name ) ! = null ) {
// the name was not found in the list of external names
// check if the Workbook's UDFFinder is aware about it and register the name if it is
xptg = lnk . addNameXPtg ( name ) ;
}
return xptg ;
2008-08-11 18:55:38 -04:00
}
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
* /
2009-12-21 20:08:33 -05:00
public void cloneDrawings ( InternalSheet sheet ) {
2008-09-07 12:30:35 -04:00
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 ;
2009-02-19 20:55:47 -05:00
for ( Iterator < EscherRecord > it = escherContainer . getChildIterator ( ) ; it . hasNext ( ) ; ) {
EscherRecord er = it . next ( ) ;
2008-09-07 12:30:35 -04:00
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
2009-02-19 20:55:47 -05:00
List < EscherRecord > spRecords = new ArrayList < EscherRecord > ( ) ;
2008-09-07 12:30:35 -04:00
EscherContainerRecord cp = ( EscherContainerRecord ) er ;
cp . getRecordsById ( EscherSpRecord . RECORD_ID , spRecords ) ;
2009-02-19 20:55:47 -05:00
for ( Iterator < EscherRecord > spIt = spRecords . iterator ( ) ; spIt . hasNext ( ) ; ) {
2008-09-07 12:30:35 -04:00
EscherSpRecord sp = ( EscherSpRecord ) spIt . next ( ) ;
int shapeId = drawingManager . allocateShapeId ( ( short ) dgId , dg ) ;
2008-09-09 02:58:35 -04:00
//allocateShapeId increments the number of shapes. roll back to the previous value
dg . setNumShapes ( dg . getNumShapes ( ) - 1 ) ;
2008-09-07 12:30:35 -04:00
sp . setShapeId ( shapeId ) ;
}
}
}
}
}
2009-02-25 14:12:06 -05:00
/ * *
* Updates named ranges due to moving of cells
* /
public void updateNamesAfterCellShift ( FormulaShifter shifter ) {
for ( int i = 0 ; i < getNumNames ( ) ; + + i ) {
NameRecord nr = getNameRecord ( i ) ;
Ptg [ ] ptgs = nr . getNameDefinition ( ) ;
2009-02-26 04:10:35 -05:00
if ( shifter . adjustFormula ( ptgs , nr . getSheetNumber ( ) ) ) {
2009-02-25 14:12:06 -05:00
nr . setNameDefinition ( ptgs ) ;
}
}
}
2008-08-11 18:55:38 -04:00
}