2002-01-30 21:22:28 -05:00
|
|
|
/* ====================================================================
|
2004-04-09 09:05:39 -04:00
|
|
|
Copyright 2002-2004 Apache Software Foundation
|
|
|
|
|
|
|
|
Licensed 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
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
2004-09-18 21:37:33 -04:00
|
|
|
import org.apache.poi.ddf.*;
|
2002-12-16 06:16:41 -05:00
|
|
|
import org.apache.poi.hssf.record.*;
|
|
|
|
import org.apache.poi.hssf.util.HSSFColor;
|
|
|
|
import org.apache.poi.hssf.util.SheetReferences;
|
|
|
|
import org.apache.poi.util.POILogFactory;
|
|
|
|
import org.apache.poi.util.POILogger;
|
2005-04-28 10:04:22 -04:00
|
|
|
import org.apache.poi.util.StringUtil;
|
2002-01-30 21:22:28 -05:00
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Iterator;
|
2002-12-16 06:16:41 -05:00
|
|
|
import java.util.List;
|
2002-07-20 23:03:57 -04:00
|
|
|
import java.util.Locale;
|
2005-04-28 10:04:22 -04:00
|
|
|
import java.io.UnsupportedEncodingException;
|
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
|
|
|
*
|
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)
|
2002-02-10 23:23:11 -05:00
|
|
|
* @author Glen Stampoultzis (glens at apache.org)
|
2002-07-20 23:03:57 -04:00
|
|
|
* @author Sergei Kozello (sergeikozello at mail.ru)
|
2002-11-28 14:20:36 -05:00
|
|
|
* @author Luc Girardin (luc dot girardin at macrofocus dot com)
|
2002-11-28 14:32:52 -05:00
|
|
|
* @author Dan Sherman (dsherman at isisph.com)
|
2003-01-02 06:17:57 -05:00
|
|
|
* @author Brian Sanders (bsanders at risklabs dot com) - custom palette
|
2002-01-30 21:22:28 -05:00
|
|
|
* @see org.apache.poi.hssf.usermodel.HSSFWorkbook
|
|
|
|
* @version 1.0-pre
|
|
|
|
*/
|
|
|
|
|
2004-08-23 04:52:54 -04:00
|
|
|
public class Workbook implements Model
|
|
|
|
{
|
2002-01-30 21:22:28 -05:00
|
|
|
private static final int DEBUG = POILogger.DEBUG;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-07-14 20:14:40 -04:00
|
|
|
// public static Workbook currentBook = null;
|
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
|
|
|
|
* (which is duplciated in more than one record)
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
private final static short CODEPAGE = ( short ) 0x4b0;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* this contains the Worksheet record objects
|
|
|
|
*/
|
2003-02-06 05:29:45 -05:00
|
|
|
protected WorkbookRecordList records = new WorkbookRecordList();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* this contains a reference to the SSTRecord so that new stings can be added
|
|
|
|
* to it.
|
|
|
|
*/
|
|
|
|
protected SSTRecord sst = null;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
/**
|
2002-07-14 20:14:40 -04:00
|
|
|
* Holds the Extern Sheet with references to bound sheets
|
2002-04-23 18:24:41 -04:00
|
|
|
*/
|
|
|
|
protected ExternSheetRecord externSheet= null;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* holds the "boundsheet" records (aka bundlesheet) so that they can have their
|
|
|
|
* reference to their "BOF" marker
|
|
|
|
*/
|
|
|
|
protected ArrayList boundsheets = new ArrayList();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-08-15 10:13:34 -04:00
|
|
|
protected ArrayList formats = new ArrayList();
|
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected ArrayList names = new ArrayList();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-12-16 06:16:41 -05:00
|
|
|
protected int numxfs = 0; // hold the number of extended format records
|
2003-02-06 05:29:45 -05:00
|
|
|
protected int numfonts = 0; // hold the number of font records
|
2002-12-16 06:16:41 -05:00
|
|
|
private short maxformatid = -1; // holds the max format id
|
|
|
|
private boolean uses1904datewindowing = false; // whether 1904 date windowing is being used
|
2004-08-23 04:52:54 -04:00
|
|
|
private DrawingManager drawingManager;
|
2002-12-16 06:16:41 -05:00
|
|
|
|
|
|
|
private static POILogger log = POILogFactory.getLogger(Workbook.class);
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* Creates new Workbook with no intitialization --useless right now
|
2002-02-19 17:58:30 -05:00
|
|
|
* @see #createWorkbook(List)
|
2002-01-30 21:22:28 -05:00
|
|
|
*/
|
2002-04-23 18:24:41 -04:00
|
|
|
public Workbook() {
|
2002-01-30 21:22:28 -05:00
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* read support for low level
|
|
|
|
* API. Pass in an array of Record objects, A Workbook
|
|
|
|
* object is constructed and passed back with all of its initialization set
|
|
|
|
* to the passed in records and references to those records held. Unlike Sheet
|
|
|
|
* workbook does not use an offset (its assumed to be 0) since its first in a file.
|
|
|
|
* If you need an offset then construct a new array with a 0 offset or write your
|
|
|
|
* own ;-p.
|
|
|
|
*
|
|
|
|
* @param recs an array of Record objects
|
|
|
|
* @return Workbook object
|
|
|
|
*/
|
2002-04-23 18:24:41 -04:00
|
|
|
public static Workbook createWorkbook(List recs) {
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "Workbook (readfile) created with reclen=",
|
|
|
|
new Integer(recs.size()));
|
2002-01-30 21:22:28 -05:00
|
|
|
Workbook retval = new Workbook();
|
|
|
|
ArrayList records = new ArrayList(recs.size() / 3);
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
for (int k = 0; k < recs.size(); k++) {
|
2002-01-30 21:22:28 -05:00
|
|
|
Record rec = ( Record ) recs.get(k);
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
if (rec.getSid() == EOFRecord.sid) {
|
2002-01-30 21:22:28 -05:00
|
|
|
records.add(rec);
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "found workbook eof record at " + k);
|
2002-01-30 21:22:28 -05:00
|
|
|
break;
|
|
|
|
}
|
2002-04-23 18:24:41 -04:00
|
|
|
switch (rec.getSid()) {
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case BoundSheetRecord.sid :
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "found boundsheet record at " + k);
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.boundsheets.add(rec);
|
2003-02-06 05:29:45 -05:00
|
|
|
retval.records.setBspos( k );
|
2002-01-30 21:22:28 -05:00
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case SSTRecord.sid :
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "found sst record at " + k);
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.sst = ( SSTRecord ) rec;
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case FontRecord.sid :
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "found font record at " + k);
|
2003-02-06 05:29:45 -05:00
|
|
|
retval.records.setFontpos( k );
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.numfonts++;
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case ExtendedFormatRecord.sid :
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "found XF record at " + k);
|
2003-02-06 05:29:45 -05:00
|
|
|
retval.records.setXfpos( k );
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.numxfs++;
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case TabIdRecord.sid :
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "found tabid record at " + k);
|
2003-02-06 05:29:45 -05:00
|
|
|
retval.records.setTabpos( k );
|
2002-01-30 21:22:28 -05:00
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-12-16 06:16:41 -05:00
|
|
|
case ProtectRecord.sid :
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "found protect record at " + k);
|
2003-02-06 05:29:45 -05:00
|
|
|
retval.records.setProtpos( k );
|
2002-12-16 06:16:41 -05:00
|
|
|
break;
|
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case BackupRecord.sid :
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "found backup record at " + k);
|
2003-02-06 05:29:45 -05:00
|
|
|
retval.records.setBackuppos( k );
|
2002-01-30 21:22:28 -05:00
|
|
|
break;
|
2002-04-23 18:24:41 -04:00
|
|
|
case ExternSheetRecord.sid :
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "found extern sheet record at " + k);
|
2002-04-23 18:24:41 -04:00
|
|
|
retval.externSheet = ( ExternSheetRecord ) rec;
|
|
|
|
break;
|
|
|
|
case NameRecord.sid :
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "found name record at " + k);
|
2002-04-23 18:24:41 -04:00
|
|
|
retval.names.add(rec);
|
2004-06-20 06:18:50 -04:00
|
|
|
// retval.records.namepos = k;
|
2002-04-23 18:24:41 -04:00
|
|
|
break;
|
2003-02-06 05:29:45 -05:00
|
|
|
case SupBookRecord.sid :
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "found SupBook record at " + k);
|
|
|
|
// retval.records.supbookpos = k;
|
|
|
|
break;
|
|
|
|
case FormatRecord.sid :
|
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "found format record at " + k);
|
|
|
|
retval.formats.add(rec);
|
|
|
|
retval.maxformatid = retval.maxformatid >= ((FormatRecord)rec).getIndexCode() ? retval.maxformatid : ((FormatRecord)rec).getIndexCode();
|
2002-04-23 18:24:41 -04:00
|
|
|
break;
|
2002-11-28 14:32:52 -05:00
|
|
|
case DateWindow1904Record.sid :
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "found datewindow1904 record at " + k);
|
2002-11-28 14:32:52 -05:00
|
|
|
retval.uses1904datewindowing = ((DateWindow1904Record)rec).getWindowing() == 1;
|
|
|
|
break;
|
2003-01-02 06:17:57 -05:00
|
|
|
case PaletteRecord.sid:
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "found palette record at " + k);
|
2003-02-06 05:29:45 -05:00
|
|
|
retval.records.setPalettepos( k );
|
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;
|
|
|
|
// }
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2003-02-06 05:29:45 -05:00
|
|
|
retval.records.setRecords(records);
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "exit create workbook from existing file function");
|
2002-01-30 21:22:28 -05:00
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* Creates an empty workbook object with three blank sheets and all the empty
|
|
|
|
* fields. Use this to create a workbook from scratch.
|
|
|
|
*/
|
2002-12-16 06:16:41 -05:00
|
|
|
public static Workbook createWorkbook()
|
|
|
|
{
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log( DEBUG, "creating new workbook from scratch" );
|
2002-12-16 06:16:41 -05:00
|
|
|
Workbook retval = new Workbook();
|
|
|
|
ArrayList records = new ArrayList( 30 );
|
|
|
|
ArrayList formats = new ArrayList( 8 );
|
|
|
|
|
|
|
|
records.add( retval.createBOF() );
|
|
|
|
records.add( retval.createInterfaceHdr() );
|
|
|
|
records.add( retval.createMMS() );
|
|
|
|
records.add( retval.createInterfaceEnd() );
|
|
|
|
records.add( retval.createWriteAccess() );
|
|
|
|
records.add( retval.createCodepage() );
|
|
|
|
records.add( retval.createDSF() );
|
|
|
|
records.add( retval.createTabId() );
|
2003-02-06 05:29:45 -05:00
|
|
|
retval.records.setTabpos( records.size() - 1 );
|
2002-12-16 06:16:41 -05:00
|
|
|
records.add( retval.createFnGroupCount() );
|
|
|
|
records.add( retval.createWindowProtect() );
|
|
|
|
records.add( retval.createProtect() );
|
2003-02-06 05:29:45 -05:00
|
|
|
retval.records.setProtpos( records.size() - 1 );
|
2002-12-16 06:16:41 -05:00
|
|
|
records.add( retval.createPassword() );
|
|
|
|
records.add( retval.createProtectionRev4() );
|
|
|
|
records.add( retval.createPasswordRev4() );
|
|
|
|
records.add( retval.createWindowOne() );
|
|
|
|
records.add( retval.createBackup() );
|
2003-02-06 05:29:45 -05:00
|
|
|
retval.records.setBackuppos( records.size() - 1 );
|
2002-12-16 06:16:41 -05:00
|
|
|
records.add( retval.createHideObj() );
|
|
|
|
records.add( retval.createDateWindow1904() );
|
|
|
|
records.add( retval.createPrecision() );
|
|
|
|
records.add( retval.createRefreshAll() );
|
|
|
|
records.add( retval.createBookBool() );
|
|
|
|
records.add( retval.createFont() );
|
|
|
|
records.add( retval.createFont() );
|
|
|
|
records.add( retval.createFont() );
|
|
|
|
records.add( retval.createFont() );
|
2003-02-06 05:29:45 -05:00
|
|
|
retval.records.setFontpos( records.size() - 1 ); // last font record postion
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.numfonts = 4;
|
2002-08-15 10:13:34 -04:00
|
|
|
|
|
|
|
// set up format records
|
2002-12-16 06:16:41 -05:00
|
|
|
for ( int i = 0; i <= 7; i++ )
|
|
|
|
{
|
|
|
|
Record rec;
|
|
|
|
rec = retval.createFormat( i );
|
|
|
|
retval.maxformatid = retval.maxformatid >= ( (FormatRecord) rec ).getIndexCode() ? retval.maxformatid : ( (FormatRecord) rec ).getIndexCode();
|
|
|
|
formats.add( rec );
|
|
|
|
records.add( rec );
|
|
|
|
}
|
|
|
|
retval.formats = formats;
|
2002-08-15 10:13:34 -04:00
|
|
|
|
2002-12-16 06:16:41 -05:00
|
|
|
for ( int k = 0; k < 21; k++ )
|
|
|
|
{
|
|
|
|
records.add( retval.createExtendedFormat( k ) );
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.numxfs++;
|
|
|
|
}
|
2003-02-06 05:29:45 -05:00
|
|
|
retval.records.setXfpos( records.size() - 1 );
|
2002-12-16 06:16:41 -05:00
|
|
|
for ( int k = 0; k < 6; k++ )
|
|
|
|
{
|
|
|
|
records.add( retval.createStyle( k ) );
|
2002-01-30 21:22:28 -05:00
|
|
|
}
|
2002-12-16 06:16:41 -05:00
|
|
|
records.add( retval.createUseSelFS() );
|
|
|
|
for ( int k = 0; k < 1; k++ )
|
|
|
|
{ // now just do 1
|
2002-01-30 21:22:28 -05:00
|
|
|
BoundSheetRecord bsr =
|
2002-12-16 06:16:41 -05:00
|
|
|
(BoundSheetRecord) retval.createBoundSheet( k );
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-12-16 06:16:41 -05:00
|
|
|
records.add( bsr );
|
|
|
|
retval.boundsheets.add( bsr );
|
2003-02-06 05:29:45 -05:00
|
|
|
retval.records.setBspos( records.size() - 1 );
|
2002-01-30 21:22:28 -05:00
|
|
|
}
|
2003-02-06 05:29:45 -05:00
|
|
|
// retval.records.supbookpos = retval.records.bspos + 1;
|
|
|
|
// retval.records.namepos = retval.records.supbookpos + 2;
|
2002-12-16 06:16:41 -05:00
|
|
|
records.add( retval.createCountry() );
|
|
|
|
retval.sst = (SSTRecord) retval.createSST();
|
|
|
|
records.add( retval.sst );
|
|
|
|
records.add( retval.createExtendedSST() );
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-12-16 06:16:41 -05:00
|
|
|
records.add( retval.createEOF() );
|
2003-02-06 05:29:45 -05:00
|
|
|
retval.records.setRecords(records);
|
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
|
|
|
|
|
|
|
/**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
|
2003-03-07 16:52:37 -05:00
|
|
|
* @param sheetIndex Index to match
|
2003-03-06 15:41:17 -05:00
|
|
|
* @return null if no builtin NameRecord matches
|
|
|
|
*/
|
|
|
|
public NameRecord getSpecificBuiltinRecord(byte name, int sheetIndex)
|
|
|
|
{
|
|
|
|
Iterator iterator = names.iterator();
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
NameRecord record = ( NameRecord ) iterator.next();
|
|
|
|
|
|
|
|
//print areas are one based
|
|
|
|
if (record.getBuiltInName() == name && record.getIndexToSheet() == sheetIndex) {
|
|
|
|
return record;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2003-03-07 16:52:37 -05: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
|
|
|
|
*/
|
|
|
|
public void removeBuiltinRecord(byte name, int sheetIndex) {
|
|
|
|
//the name array is smaller so searching through it should be faster than
|
|
|
|
//using the findFirstXXXX methods
|
|
|
|
NameRecord record = getSpecificBuiltinRecord(name, sheetIndex);
|
|
|
|
if (record != null) {
|
|
|
|
names.remove(record);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
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;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates a new font record and adds it to the "font table". This causes the
|
|
|
|
* boundsheets to move down one, extended formats to move down (so this function moves
|
|
|
|
* those pointers as well)
|
|
|
|
*
|
|
|
|
* @return FontRecord that was just created
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
public FontRecord createNewFont() {
|
2002-01-30 21:22:28 -05:00
|
|
|
FontRecord rec = ( FontRecord ) createFont();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2003-02-06 05:29:45 -05:00
|
|
|
records.add(records.getFontpos()+1, rec);
|
|
|
|
records.setFontpos( records.getFontpos() + 1 );
|
2002-01-30 21:22:28 -05:00
|
|
|
numfonts++;
|
|
|
|
return rec;
|
|
|
|
}
|
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
|
|
|
|
*
|
|
|
|
* @param sheetnum the number of the sheet to set the positing of the bof for
|
|
|
|
* @param pos the actual bof position
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
public void setSheetBof(int sheetnum, int pos) {
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "setting bof for sheetnum =", new Integer(sheetnum),
|
|
|
|
" at pos=", new Integer(pos));
|
2002-01-30 21:22:28 -05:00
|
|
|
checkSheets(sheetnum);
|
|
|
|
(( BoundSheetRecord ) boundsheets.get(sheetnum))
|
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
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* Returns the position of the backup record.
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
public BackupRecord getBackupRecord() {
|
2003-02-06 05:29:45 -05:00
|
|
|
return ( BackupRecord ) records.get(records.getBackuppos());
|
2002-01-30 21:22:28 -05:00
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* sets the name for a given sheet. If the boundsheet record doesn't exist and
|
|
|
|
* its only one more than we have, go ahead and create it. If its > 1 more than
|
|
|
|
* we have, except
|
|
|
|
*
|
|
|
|
* @param sheetnum the sheet number (0 based)
|
|
|
|
* @param sheetname the name for the sheet
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2003-02-06 05:29:45 -05:00
|
|
|
// for compatibility
|
2002-07-20 23:03:57 -04:00
|
|
|
public void setSheetName(int sheetnum, String sheetname ) {
|
|
|
|
setSheetName( sheetnum, sheetname, (byte)0 );
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2004-09-18 22:06:54 -04:00
|
|
|
/**
|
|
|
|
* Determines whether a workbook contains the privided sheet name.
|
|
|
|
*
|
|
|
|
* @param name the name to test
|
|
|
|
* @param excludeSheetIdx the sheet to exclude from the check or -1 to include all sheets in the check.
|
|
|
|
* @return true if the sheet contains the name, false otherwise.
|
|
|
|
*/
|
|
|
|
public boolean doesContainsSheetName( String name, int excludeSheetIdx )
|
|
|
|
{
|
|
|
|
for ( int i = 0; i < boundsheets.size(); i++ )
|
|
|
|
{
|
|
|
|
BoundSheetRecord boundSheetRecord = (BoundSheetRecord) boundsheets.get( i );
|
|
|
|
if (excludeSheetIdx != i && name.equals(boundSheetRecord.getSheetname()))
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2002-07-20 23:03:57 -04:00
|
|
|
public void setSheetName(int sheetnum, String sheetname, short encoding ) {
|
2002-01-30 21:22:28 -05:00
|
|
|
checkSheets(sheetnum);
|
2002-07-20 23:03:57 -04:00
|
|
|
BoundSheetRecord sheet = (BoundSheetRecord)boundsheets.get( sheetnum );
|
|
|
|
sheet.setSheetname(sheetname);
|
|
|
|
sheet.setSheetnameLength( (byte)sheetname.length() );
|
|
|
|
sheet.setCompressedUnicodeFlag( (byte)encoding );
|
2002-01-30 21:22:28 -05:00
|
|
|
}
|
2003-03-01 12:32:26 -05:00
|
|
|
|
2004-09-18 22:06:54 -04:00
|
|
|
/**
|
2003-03-01 12:32:26 -05: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)
|
|
|
|
*/
|
|
|
|
|
|
|
|
public void setSheetOrder(String sheetname, int pos ) {
|
|
|
|
int sheetNumber = getSheetIndex(sheetname);
|
|
|
|
//remove the sheet that needs to be reordered and place it in the spot we want
|
|
|
|
boundsheets.add(pos, boundsheets.remove(sheetNumber));
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* gets the name for a given sheet.
|
|
|
|
*
|
|
|
|
* @param sheetnum the sheet number (0 based)
|
|
|
|
* @return sheetname the name for the sheet
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
public String getSheetName(int sheetnum) {
|
2002-01-30 21:22:28 -05:00
|
|
|
return (( BoundSheetRecord ) boundsheets.get(sheetnum))
|
2002-04-23 18:24:41 -04:00
|
|
|
.getSheetname();
|
2002-01-30 21:22:28 -05:00
|
|
|
}
|
2002-07-29 09:25:46 -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.
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
public int getSheetIndex(String name) {
|
|
|
|
int retval = -1;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
for (int k = 0; k < boundsheets.size(); k++) {
|
|
|
|
String sheet = getSheetName(k);
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2003-07-27 14:52:24 -04:00
|
|
|
if (sheet.equalsIgnoreCase(name)) {
|
2002-04-23 18:24:41 -04:00
|
|
|
retval = k;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* if we're trying to address one more sheet than we have, go ahead and add it! if we're
|
|
|
|
* trying to address >1 more than we have throw an exception!
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
private void checkSheets(int sheetnum) {
|
|
|
|
if ((boundsheets.size()) <= sheetnum) { // if we're short one add another..
|
|
|
|
if ((boundsheets.size() + 1) <= sheetnum) {
|
2002-01-30 21:22:28 -05:00
|
|
|
throw new RuntimeException("Sheet number out of bounds!");
|
|
|
|
}
|
2003-02-06 05:29:45 -05:00
|
|
|
BoundSheetRecord bsr = (BoundSheetRecord ) createBoundSheet(sheetnum);
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2003-02-06 05:29:45 -05:00
|
|
|
records.add(records.getBspos()+1, bsr);
|
|
|
|
records.setBspos( records.getBspos() + 1 );
|
2002-01-30 21:22:28 -05:00
|
|
|
boundsheets.add(bsr);
|
|
|
|
fixTabIdRecord();
|
|
|
|
}
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
public void removeSheet(int sheetnum) {
|
|
|
|
if (boundsheets.size() > sheetnum) {
|
2003-02-06 05:29:45 -05:00
|
|
|
records.remove(records.getBspos() - (boundsheets.size() - 1) + sheetnum);
|
|
|
|
// records.bspos--;
|
2002-01-30 21:22:28 -05:00
|
|
|
boundsheets.remove(sheetnum);
|
|
|
|
fixTabIdRecord();
|
|
|
|
}
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* make the tabid record look like the current situation.
|
|
|
|
*
|
|
|
|
*/
|
2002-04-23 18:24:41 -04:00
|
|
|
private void fixTabIdRecord() {
|
2003-02-06 05:29:45 -05:00
|
|
|
TabIdRecord tir = ( TabIdRecord ) records.get(records.getTabpos());
|
2002-01-30 21:22:28 -05:00
|
|
|
short[] tia = new short[ boundsheets.size() ];
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
for (short k = 0; k < tia.length; k++) {
|
2002-01-30 21:22:28 -05:00
|
|
|
tia[ k ] = k;
|
|
|
|
}
|
|
|
|
tir.setTabIdArray(tia);
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* returns the number of boundsheet objects contained in this workbook.
|
|
|
|
*
|
|
|
|
* @return number of BoundSheet records
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
public int getNumSheets() {
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "getNumSheets=", new Integer(boundsheets.size()));
|
2002-01-30 21:22:28 -05:00
|
|
|
return boundsheets.size();
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* get the number of ExtendedFormat records contained in this workbook.
|
|
|
|
*
|
|
|
|
* @return int count of ExtendedFormat records
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
public int getNumExFormats() {
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "getXF=", new Integer(numxfs));
|
2002-01-30 21:22:28 -05:00
|
|
|
return numxfs;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* gets the ExtendedFormatRecord at the given 0-based index
|
|
|
|
*
|
|
|
|
* @param index of the Extended format record (0-based)
|
|
|
|
* @return ExtendedFormatRecord at the given index
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
public ExtendedFormatRecord getExFormatAt(int index) {
|
2003-02-06 05:29:45 -05:00
|
|
|
int xfptr = records.getXfpos() - (numxfs - 1);
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
xfptr += index;
|
|
|
|
ExtendedFormatRecord retval =
|
2002-04-23 18:24:41 -04:00
|
|
|
( ExtendedFormatRecord ) records.get(xfptr);
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates a new Cell-type Extneded Format Record and adds it to the end of
|
|
|
|
* ExtendedFormatRecords collection
|
|
|
|
*
|
|
|
|
* @return ExtendedFormatRecord that was created
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
public ExtendedFormatRecord createCellXF() {
|
2002-01-30 21:22:28 -05:00
|
|
|
ExtendedFormatRecord xf = createExtendedFormat();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2003-02-06 05:29:45 -05:00
|
|
|
records.add(records.getXfpos()+1, xf);
|
|
|
|
records.setXfpos( records.getXfpos() + 1 );
|
2002-01-30 21:22:28 -05:00
|
|
|
numxfs++;
|
|
|
|
return xf;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* Adds a string to the SST table and returns its index (if its a duplicate
|
|
|
|
* just returns its index and update the counts)
|
|
|
|
*
|
|
|
|
* @param string the string to be added to the SSTRecord
|
|
|
|
* @param use16bits whether to use utf 16 or false for compressed unicode
|
|
|
|
* @return index of the string within the SSTRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
public int addSSTString(String string, boolean use16bits) {
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "insert to sst string='", string, "' and use16bits= ",
|
2002-04-23 18:24:41 -04:00
|
|
|
new Boolean(use16bits));
|
|
|
|
if (sst == null) {
|
2002-01-30 21:22:28 -05:00
|
|
|
insertSST();
|
|
|
|
}
|
|
|
|
return sst.addString(string, use16bits);
|
|
|
|
}
|
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
|
|
|
|
* just returns its index and update the counts) ASSUMES compressed unicode
|
|
|
|
* (meaning 8bit)
|
|
|
|
*
|
|
|
|
* @param string the string to be added to the SSTRecord
|
|
|
|
*
|
|
|
|
* @return index of the string within the SSTRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
public int addSSTString(String string) {
|
2002-01-30 21:22:28 -05:00
|
|
|
return addSSTString(string, false);
|
|
|
|
}
|
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
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
public String getSSTString(int str) {
|
|
|
|
if (sst == null) {
|
2002-01-30 21:22:28 -05:00
|
|
|
insertSST();
|
|
|
|
}
|
|
|
|
String retval = sst.getString(str);
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "Returning SST for index=", new Integer(str),
|
2004-08-23 04:52:54 -04:00
|
|
|
" String= ", retval);
|
2002-01-30 21:22:28 -05:00
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* use this function to add a Shared String Table to an existing sheet (say
|
|
|
|
* generated by a different java api) without an sst....
|
|
|
|
* @see #createSST()
|
|
|
|
* @see org.apache.poi.hssf.record.SSTRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
public void insertSST() {
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log(DEBUG, "creating new SST via insertSST!");
|
2002-01-30 21:22:28 -05:00
|
|
|
sst = ( SSTRecord ) createSST();
|
|
|
|
records.add(records.size() - 1, createExtendedSST());
|
|
|
|
records.add(records.size() - 2, sst);
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* Serializes all records int the worksheet section into a big byte array. Use
|
|
|
|
* this to write the Workbook out.
|
|
|
|
*
|
|
|
|
* @return byte array containing the HSSF-only portions of the POIFS file.
|
|
|
|
*/
|
2004-08-23 04:52:54 -04:00
|
|
|
// GJS: Not used so why keep it.
|
2003-06-26 09:33:47 -04:00
|
|
|
// public byte [] serialize() {
|
|
|
|
// log.log(DEBUG, "Serializing Workbook!");
|
|
|
|
// byte[] retval = null;
|
|
|
|
//
|
2004-08-23 04:52:54 -04:00
|
|
|
//// ArrayList bytes = new ArrayList(records.size());
|
2003-06-26 09:33:47 -04:00
|
|
|
// int arraysize = getSize();
|
|
|
|
// int pos = 0;
|
|
|
|
//
|
|
|
|
// retval = new byte[ arraysize ];
|
|
|
|
// for (int k = 0; k < records.size(); k++) {
|
|
|
|
//
|
|
|
|
// Record record = records.get(k);
|
2004-08-23 04:52:54 -04:00
|
|
|
//// Let's skip RECALCID records, as they are only use for optimization
|
2003-06-26 09:33:47 -04:00
|
|
|
// if(record.getSid() != RecalcIdRecord.sid || ((RecalcIdRecord)record).isNeeded()) {
|
|
|
|
// pos += record.serialize(pos, retval); // rec.length;
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// 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;
|
|
|
|
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() )
|
|
|
|
{
|
|
|
|
if (record instanceof SSTRecord)
|
|
|
|
{
|
|
|
|
sst = (SSTRecord)record;
|
|
|
|
sstPos = pos;
|
|
|
|
}
|
|
|
|
if (record.getSid() == ExtSSTRecord.sid && sst != null)
|
|
|
|
{
|
|
|
|
record = sst.createExtSSTRecord(sstPos + offset);
|
|
|
|
}
|
|
|
|
pos += record.serialize( pos + offset, data ); // rec.length;
|
2002-11-28 14:20:36 -05:00
|
|
|
}
|
2002-01-30 21:22:28 -05:00
|
|
|
}
|
2004-06-20 06:18:50 -04:00
|
|
|
if (log.check( POILogger.DEBUG ))
|
|
|
|
log.log( DEBUG, "Exiting serialize workbook" );
|
2002-01-30 21:22:28 -05:00
|
|
|
return pos;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2003-06-26 09:33:47 -04:00
|
|
|
public int getSize()
|
|
|
|
{
|
2002-01-30 21:22:28 -05:00
|
|
|
int retval = 0;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2003-06-26 09:33:47 -04:00
|
|
|
SSTRecord sst = null;
|
|
|
|
for ( int k = 0; k < records.size(); k++ )
|
|
|
|
{
|
|
|
|
Record record = records.get( k );
|
2002-11-28 14:20:36 -05:00
|
|
|
// Let's skip RECALCID records, as they are only use for optimization
|
2003-06-26 09:33:47 -04:00
|
|
|
if ( record.getSid() != RecalcIdRecord.sid || ( (RecalcIdRecord) record ).isNeeded() )
|
|
|
|
{
|
|
|
|
if (record instanceof SSTRecord)
|
|
|
|
sst = (SSTRecord)record;
|
|
|
|
if (record.getSid() == ExtSSTRecord.sid && sst != null)
|
|
|
|
retval += sst.calcExtSSTRecordSize();
|
|
|
|
else
|
|
|
|
retval += record.getRecordSize();
|
2002-11-28 14:20:36 -05:00
|
|
|
}
|
2002-01-30 21:22:28 -05:00
|
|
|
}
|
|
|
|
return retval;
|
2004-08-23 04:52:54 -04:00
|
|
|
}
|
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates the BOF record
|
|
|
|
* @see org.apache.poi.hssf.record.BOFRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a BOFRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createBOF() {
|
2002-01-30 21:22:28 -05:00
|
|
|
BOFRecord retval = new BOFRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setVersion(( short ) 0x600);
|
|
|
|
retval.setType(( short ) 5);
|
|
|
|
retval.setBuild(( short ) 0x10d3);
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
// retval.setBuild((short)0x0dbb);
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setBuildYear(( short ) 1996);
|
|
|
|
retval.setHistoryBitMask(0x41); // was c1 before verify
|
|
|
|
retval.setRequiredVersion(0x6);
|
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates the InterfaceHdr record
|
|
|
|
* @see org.apache.poi.hssf.record.InterfaceHdrRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a InterfaceHdrRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createInterfaceHdr() {
|
2002-01-30 21:22:28 -05:00
|
|
|
InterfaceHdrRecord retval = new InterfaceHdrRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setCodepage(CODEPAGE);
|
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates an MMS record
|
|
|
|
* @see org.apache.poi.hssf.record.MMSRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a MMSRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createMMS() {
|
2002-01-30 21:22:28 -05:00
|
|
|
MMSRecord retval = new MMSRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setAddMenuCount(( byte ) 0);
|
|
|
|
retval.setDelMenuCount(( byte ) 0);
|
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates the InterfaceEnd record
|
|
|
|
* @see org.apache.poi.hssf.record.InterfaceEndRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a InterfaceEndRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createInterfaceEnd() {
|
2002-01-30 21:22:28 -05:00
|
|
|
return new InterfaceEndRecord();
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates the WriteAccess record containing the logged in user's name
|
|
|
|
* @see org.apache.poi.hssf.record.WriteAccessRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a WriteAccessRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createWriteAccess() {
|
2002-01-30 21:22:28 -05:00
|
|
|
WriteAccessRecord retval = new WriteAccessRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2004-09-18 21:37:33 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
retval.setUsername(System.getProperty("user.name"));
|
|
|
|
}
|
|
|
|
catch (java.security.AccessControlException e)
|
|
|
|
{
|
|
|
|
// AccessControlException can occur in a restricted context
|
|
|
|
// (client applet/jws application or restricted security server)
|
|
|
|
retval.setUsername("POI");
|
|
|
|
}
|
2002-01-30 21:22:28 -05:00
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates the Codepage record containing the constant stored in CODEPAGE
|
|
|
|
* @see org.apache.poi.hssf.record.CodepageRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a CodepageRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createCodepage() {
|
2002-01-30 21:22:28 -05:00
|
|
|
CodepageRecord retval = new CodepageRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setCodepage(CODEPAGE);
|
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates the DSF record containing a 0 since HSSF can't even create Dual Stream Files
|
|
|
|
* @see org.apache.poi.hssf.record.DSFRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a DSFRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createDSF() {
|
2002-01-30 21:22:28 -05:00
|
|
|
DSFRecord retval = new DSFRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setDsf(
|
2002-04-23 18:24:41 -04:00
|
|
|
( short ) 0); // we don't even support double stream files
|
2002-01-30 21:22:28 -05:00
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates the TabId record containing an array of 0,1,2. This release of HSSF
|
|
|
|
* always has the default three sheets, no less, no more.
|
|
|
|
* @see org.apache.poi.hssf.record.TabIdRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a TabIdRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createTabId() {
|
2002-01-30 21:22:28 -05:00
|
|
|
TabIdRecord retval = new TabIdRecord();
|
2002-04-23 18:24:41 -04:00
|
|
|
short[] tabidarray = {
|
2002-01-30 21:22:28 -05:00
|
|
|
0
|
|
|
|
};
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setTabIdArray(tabidarray);
|
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates the FnGroupCount record containing the Magic number constant of 14.
|
|
|
|
* @see org.apache.poi.hssf.record.FnGroupCountRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a FnGroupCountRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createFnGroupCount() {
|
2002-01-30 21:22:28 -05:00
|
|
|
FnGroupCountRecord retval = new FnGroupCountRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setCount(( short ) 14);
|
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates the WindowProtect record with protect set to false.
|
|
|
|
* @see org.apache.poi.hssf.record.WindowProtectRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a WindowProtectRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createWindowProtect() {
|
2002-01-30 21:22:28 -05:00
|
|
|
WindowProtectRecord retval = new WindowProtectRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setProtect(
|
2002-04-23 18:24:41 -04:00
|
|
|
false); // by default even when we support it we won't
|
2002-01-30 21:22:28 -05:00
|
|
|
return retval; // want it to be protected
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates the Protect record with protect set to false.
|
|
|
|
* @see org.apache.poi.hssf.record.ProtectRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a ProtectRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createProtect() {
|
2002-01-30 21:22:28 -05:00
|
|
|
ProtectRecord retval = new ProtectRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setProtect(
|
2002-04-23 18:24:41 -04:00
|
|
|
false); // by default even when we support it we won't
|
2002-01-30 21:22:28 -05:00
|
|
|
return retval; // want it to be protected
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates the Password record with password set to 0.
|
|
|
|
* @see org.apache.poi.hssf.record.PasswordRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a PasswordRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createPassword() {
|
2002-01-30 21:22:28 -05:00
|
|
|
PasswordRecord retval = new PasswordRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setPassword(( short ) 0); // no password by default!
|
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates the ProtectionRev4 record with protect set to false.
|
|
|
|
* @see org.apache.poi.hssf.record.ProtectionRev4Record
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a ProtectionRev4Record
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createProtectionRev4() {
|
2002-01-30 21:22:28 -05:00
|
|
|
ProtectionRev4Record retval = new ProtectionRev4Record();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setProtect(false);
|
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates the PasswordRev4 record with password set to 0.
|
|
|
|
* @see org.apache.poi.hssf.record.PasswordRev4Record
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a PasswordRev4Record
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createPasswordRev4() {
|
2002-01-30 21:22:28 -05:00
|
|
|
PasswordRev4Record retval = new PasswordRev4Record();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setPassword(( short ) 0); // no password by default!
|
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates the WindowOne record with the following magic values: <P>
|
|
|
|
* horizontal hold - 0x168 <P>
|
|
|
|
* vertical hold - 0x10e <P>
|
|
|
|
* width - 0x3a5c <P>
|
|
|
|
* height - 0x23be <P>
|
|
|
|
* options - 0x38 <P>
|
|
|
|
* selected tab - 0 <P>
|
|
|
|
* displayed tab - 0 <P>
|
|
|
|
* num selected tab- 0 <P>
|
|
|
|
* tab width ratio - 0x258 <P>
|
|
|
|
* @see org.apache.poi.hssf.record.WindowOneRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a WindowOneRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createWindowOne() {
|
2002-01-30 21:22:28 -05:00
|
|
|
WindowOneRecord retval = new WindowOneRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setHorizontalHold(( short ) 0x168);
|
|
|
|
retval.setVerticalHold(( short ) 0x10e);
|
|
|
|
retval.setWidth(( short ) 0x3a5c);
|
|
|
|
retval.setHeight(( short ) 0x23be);
|
|
|
|
retval.setOptions(( short ) 0x38);
|
|
|
|
retval.setSelectedTab(( short ) 0x0);
|
|
|
|
retval.setDisplayedTab(( short ) 0x0);
|
|
|
|
retval.setNumSelectedTabs(( short ) 1);
|
|
|
|
retval.setTabWidthRatio(( short ) 0x258);
|
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates the Backup record with backup set to 0. (loose the data, who cares)
|
|
|
|
* @see org.apache.poi.hssf.record.BackupRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a BackupRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createBackup() {
|
2002-01-30 21:22:28 -05:00
|
|
|
BackupRecord retval = new BackupRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setBackup(
|
2002-04-23 18:24:41 -04:00
|
|
|
( short ) 0); // by default DONT save backups of files...just loose data
|
2002-01-30 21:22:28 -05:00
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates the HideObj record with hide object set to 0. (don't hide)
|
|
|
|
* @see org.apache.poi.hssf.record.HideObjRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a HideObjRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createHideObj() {
|
2002-01-30 21:22:28 -05:00
|
|
|
HideObjRecord retval = new HideObjRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setHideObj(( short ) 0); // by default set hide object off
|
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates the DateWindow1904 record with windowing set to 0. (don't window)
|
|
|
|
* @see org.apache.poi.hssf.record.DateWindow1904Record
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a DateWindow1904Record
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createDateWindow1904() {
|
2002-01-30 21:22:28 -05:00
|
|
|
DateWindow1904Record retval = new DateWindow1904Record();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setWindowing(
|
2002-04-23 18:24:41 -04:00
|
|
|
( short ) 0); // don't EVER use 1904 date windowing...tick tock..
|
2002-01-30 21:22:28 -05:00
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates the Precision record with precision set to true. (full precision)
|
|
|
|
* @see org.apache.poi.hssf.record.PrecisionRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a PrecisionRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createPrecision() {
|
2002-01-30 21:22:28 -05:00
|
|
|
PrecisionRecord retval = new PrecisionRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setFullPrecision(
|
2002-04-23 18:24:41 -04:00
|
|
|
true); // always use real numbers in calculations!
|
2002-01-30 21:22:28 -05:00
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates the RefreshAll record with refreshAll set to true. (refresh all calcs)
|
|
|
|
* @see org.apache.poi.hssf.record.RefreshAllRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a RefreshAllRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createRefreshAll() {
|
2002-01-30 21:22:28 -05:00
|
|
|
RefreshAllRecord retval = new RefreshAllRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setRefreshAll(false);
|
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates the BookBool record with saveLinkValues set to 0. (don't save link values)
|
|
|
|
* @see org.apache.poi.hssf.record.BookBoolRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a BookBoolRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createBookBool() {
|
2002-01-30 21:22:28 -05:00
|
|
|
BookBoolRecord retval = new BookBoolRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setSaveLinkValues(( short ) 0);
|
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates a Font record with the following magic values: <P>
|
|
|
|
* fontheight = 0xc8<P>
|
|
|
|
* attributes = 0x0<P>
|
|
|
|
* color palette index = 0x7fff<P>
|
|
|
|
* bold weight = 0x190<P>
|
|
|
|
* Font Name Length = 5 <P>
|
|
|
|
* Font Name = Arial <P>
|
|
|
|
*
|
|
|
|
* @see org.apache.poi.hssf.record.FontRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a FontRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createFont() {
|
2002-01-30 21:22:28 -05:00
|
|
|
FontRecord retval = new FontRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setFontHeight(( short ) 0xc8);
|
|
|
|
retval.setAttributes(( short ) 0x0);
|
|
|
|
retval.setColorPaletteIndex(( short ) 0x7fff);
|
|
|
|
retval.setBoldWeight(( short ) 0x190);
|
|
|
|
retval.setFontNameLength(( byte ) 5);
|
|
|
|
retval.setFontName("Arial");
|
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* Creates a FormatRecord object
|
2002-02-19 17:58:30 -05:00
|
|
|
* @param id the number of the format record to create (meaning its position in
|
2002-01-30 21:22:28 -05:00
|
|
|
* a file as M$ Excel would create it.)
|
|
|
|
* @return record containing a FormatRecord
|
|
|
|
* @see org.apache.poi.hssf.record.FormatRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createFormat(int id) { // we'll need multiple editions for
|
2002-01-30 21:22:28 -05:00
|
|
|
FormatRecord retval = new FormatRecord(); // the differnt formats
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
switch (id) {
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 0 :
|
|
|
|
retval.setIndexCode(( short ) 5);
|
|
|
|
retval.setFormatStringLength(( byte ) 0x17);
|
|
|
|
retval.setFormatString("\"$\"#,##0_);\\(\"$\"#,##0\\)");
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 1 :
|
|
|
|
retval.setIndexCode(( short ) 6);
|
|
|
|
retval.setFormatStringLength(( byte ) 0x1c);
|
|
|
|
retval.setFormatString("\"$\"#,##0_);[Red]\\(\"$\"#,##0\\)");
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 2 :
|
|
|
|
retval.setIndexCode(( short ) 7);
|
|
|
|
retval.setFormatStringLength(( byte ) 0x1d);
|
|
|
|
retval.setFormatString("\"$\"#,##0.00_);\\(\"$\"#,##0.00\\)");
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 3 :
|
|
|
|
retval.setIndexCode(( short ) 8);
|
|
|
|
retval.setFormatStringLength(( byte ) 0x22);
|
|
|
|
retval.setFormatString(
|
2002-04-23 18:24:41 -04:00
|
|
|
"\"$\"#,##0.00_);[Red]\\(\"$\"#,##0.00\\)");
|
2002-01-30 21:22:28 -05:00
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 4 :
|
|
|
|
retval.setIndexCode(( short ) 0x2a);
|
|
|
|
retval.setFormatStringLength(( byte ) 0x32);
|
|
|
|
retval.setFormatString(
|
2002-04-23 18:24:41 -04:00
|
|
|
"_(\"$\"* #,##0_);_(\"$\"* \\(#,##0\\);_(\"$\"* \"-\"_);_(@_)");
|
2002-01-30 21:22:28 -05:00
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 5 :
|
|
|
|
retval.setIndexCode(( short ) 0x29);
|
|
|
|
retval.setFormatStringLength(( byte ) 0x29);
|
|
|
|
retval.setFormatString(
|
2002-04-23 18:24:41 -04:00
|
|
|
"_(* #,##0_);_(* \\(#,##0\\);_(* \"-\"_);_(@_)");
|
2002-01-30 21:22:28 -05:00
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 6 :
|
|
|
|
retval.setIndexCode(( short ) 0x2c);
|
|
|
|
retval.setFormatStringLength(( byte ) 0x3a);
|
|
|
|
retval.setFormatString(
|
2002-04-23 18:24:41 -04:00
|
|
|
"_(\"$\"* #,##0.00_);_(\"$\"* \\(#,##0.00\\);_(\"$\"* \"-\"??_);_(@_)");
|
2002-01-30 21:22:28 -05:00
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 7 :
|
|
|
|
retval.setIndexCode(( short ) 0x2b);
|
|
|
|
retval.setFormatStringLength(( byte ) 0x31);
|
|
|
|
retval.setFormatString(
|
2002-04-23 18:24:41 -04:00
|
|
|
"_(* #,##0.00_);_(* \\(#,##0.00\\);_(* \"-\"??_);_(@_)");
|
2002-01-30 21:22:28 -05:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* Creates an ExtendedFormatRecord object
|
2002-02-19 17:58:30 -05:00
|
|
|
* @param id the number of the extended format record to create (meaning its position in
|
2002-01-30 21:22:28 -05:00
|
|
|
* a file as MS Excel would create it.)
|
|
|
|
*
|
|
|
|
* @return record containing an ExtendedFormatRecord
|
|
|
|
* @see org.apache.poi.hssf.record.ExtendedFormatRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createExtendedFormat(int id) { // we'll need multiple editions
|
2002-01-30 21:22:28 -05:00
|
|
|
ExtendedFormatRecord retval = new ExtendedFormatRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
switch (id) {
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 0 :
|
|
|
|
retval.setFontIndex(( short ) 0);
|
|
|
|
retval.setFormatIndex(( short ) 0);
|
|
|
|
retval.setCellOptions(( short ) 0xfffffff5);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 1 :
|
|
|
|
retval.setFontIndex(( short ) 1);
|
|
|
|
retval.setFormatIndex(( short ) 0);
|
|
|
|
retval.setCellOptions(( short ) 0xfffffff5);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0xfffff400);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 2 :
|
|
|
|
retval.setFontIndex(( short ) 1);
|
|
|
|
retval.setFormatIndex(( short ) 0);
|
|
|
|
retval.setCellOptions(( short ) 0xfffffff5);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0xfffff400);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 3 :
|
|
|
|
retval.setFontIndex(( short ) 2);
|
|
|
|
retval.setFormatIndex(( short ) 0);
|
|
|
|
retval.setCellOptions(( short ) 0xfffffff5);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0xfffff400);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 4 :
|
|
|
|
retval.setFontIndex(( short ) 2);
|
|
|
|
retval.setFormatIndex(( short ) 0);
|
|
|
|
retval.setCellOptions(( short ) 0xfffffff5);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0xfffff400);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 5 :
|
|
|
|
retval.setFontIndex(( short ) 0);
|
|
|
|
retval.setFormatIndex(( short ) 0);
|
|
|
|
retval.setCellOptions(( short ) 0xfffffff5);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0xfffff400);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 6 :
|
|
|
|
retval.setFontIndex(( short ) 0);
|
|
|
|
retval.setFormatIndex(( short ) 0);
|
|
|
|
retval.setCellOptions(( short ) 0xfffffff5);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0xfffff400);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 7 :
|
|
|
|
retval.setFontIndex(( short ) 0);
|
|
|
|
retval.setFormatIndex(( short ) 0);
|
|
|
|
retval.setCellOptions(( short ) 0xfffffff5);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0xfffff400);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 8 :
|
|
|
|
retval.setFontIndex(( short ) 0);
|
|
|
|
retval.setFormatIndex(( short ) 0);
|
|
|
|
retval.setCellOptions(( short ) 0xfffffff5);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0xfffff400);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 9 :
|
|
|
|
retval.setFontIndex(( short ) 0);
|
|
|
|
retval.setFormatIndex(( short ) 0);
|
|
|
|
retval.setCellOptions(( short ) 0xfffffff5);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0xfffff400);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 10 :
|
|
|
|
retval.setFontIndex(( short ) 0);
|
|
|
|
retval.setFormatIndex(( short ) 0);
|
|
|
|
retval.setCellOptions(( short ) 0xfffffff5);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0xfffff400);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 11 :
|
|
|
|
retval.setFontIndex(( short ) 0);
|
|
|
|
retval.setFormatIndex(( short ) 0);
|
|
|
|
retval.setCellOptions(( short ) 0xfffffff5);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0xfffff400);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 12 :
|
|
|
|
retval.setFontIndex(( short ) 0);
|
|
|
|
retval.setFormatIndex(( short ) 0);
|
|
|
|
retval.setCellOptions(( short ) 0xfffffff5);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0xfffff400);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 13 :
|
|
|
|
retval.setFontIndex(( short ) 0);
|
|
|
|
retval.setFormatIndex(( short ) 0);
|
|
|
|
retval.setCellOptions(( short ) 0xfffffff5);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0xfffff400);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 14 :
|
|
|
|
retval.setFontIndex(( short ) 0);
|
|
|
|
retval.setFormatIndex(( short ) 0);
|
|
|
|
retval.setCellOptions(( short ) 0xfffffff5);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0xfffff400);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
// cell records
|
2002-01-30 21:22:28 -05:00
|
|
|
case 15 :
|
|
|
|
retval.setFontIndex(( short ) 0);
|
|
|
|
retval.setFormatIndex(( short ) 0);
|
|
|
|
retval.setCellOptions(( short ) 0x1);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0x0);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
// style
|
2002-01-30 21:22:28 -05:00
|
|
|
case 16 :
|
|
|
|
retval.setFontIndex(( short ) 1);
|
|
|
|
retval.setFormatIndex(( short ) 0x2b);
|
|
|
|
retval.setCellOptions(( short ) 0xfffffff5);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0xfffff800);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 17 :
|
|
|
|
retval.setFontIndex(( short ) 1);
|
|
|
|
retval.setFormatIndex(( short ) 0x29);
|
|
|
|
retval.setCellOptions(( short ) 0xfffffff5);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0xfffff800);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 18 :
|
|
|
|
retval.setFontIndex(( short ) 1);
|
|
|
|
retval.setFormatIndex(( short ) 0x2c);
|
|
|
|
retval.setCellOptions(( short ) 0xfffffff5);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0xfffff800);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 19 :
|
|
|
|
retval.setFontIndex(( short ) 1);
|
|
|
|
retval.setFormatIndex(( short ) 0x2a);
|
|
|
|
retval.setCellOptions(( short ) 0xfffffff5);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0xfffff800);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 20 :
|
|
|
|
retval.setFontIndex(( short ) 1);
|
|
|
|
retval.setFormatIndex(( short ) 0x9);
|
|
|
|
retval.setCellOptions(( short ) 0xfffffff5);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0xfffff800);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
// unused from this point down
|
2002-01-30 21:22:28 -05:00
|
|
|
case 21 :
|
|
|
|
retval.setFontIndex(( short ) 5);
|
|
|
|
retval.setFormatIndex(( short ) 0x0);
|
|
|
|
retval.setCellOptions(( short ) 0x1);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0x800);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 22 :
|
|
|
|
retval.setFontIndex(( short ) 6);
|
|
|
|
retval.setFormatIndex(( short ) 0x0);
|
|
|
|
retval.setCellOptions(( short ) 0x1);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0x5c00);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 23 :
|
|
|
|
retval.setFontIndex(( short ) 0);
|
|
|
|
retval.setFormatIndex(( short ) 0x31);
|
|
|
|
retval.setCellOptions(( short ) 0x1);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0x5c00);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 24 :
|
|
|
|
retval.setFontIndex(( short ) 0);
|
|
|
|
retval.setFormatIndex(( short ) 0x8);
|
|
|
|
retval.setCellOptions(( short ) 0x1);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0x5c00);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 25 :
|
|
|
|
retval.setFontIndex(( short ) 6);
|
|
|
|
retval.setFormatIndex(( short ) 0x8);
|
|
|
|
retval.setCellOptions(( short ) 0x1);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0x5c00);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates an default cell type ExtendedFormatRecord object.
|
|
|
|
* @return ExtendedFormatRecord with intial defaults (cell-type)
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected ExtendedFormatRecord createExtendedFormat() {
|
2002-01-30 21:22:28 -05:00
|
|
|
ExtendedFormatRecord retval = new ExtendedFormatRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setFontIndex(( short ) 0);
|
|
|
|
retval.setFormatIndex(( short ) 0x0);
|
|
|
|
retval.setCellOptions(( short ) 0x1);
|
|
|
|
retval.setAlignmentOptions(( short ) 0x20);
|
|
|
|
retval.setIndentionOptions(( short ) 0);
|
|
|
|
retval.setBorderOptions(( short ) 0);
|
|
|
|
retval.setPaletteOptions(( short ) 0);
|
|
|
|
retval.setAdtlPaletteOptions(( short ) 0);
|
|
|
|
retval.setFillPaletteOptions(( short ) 0x20c0);
|
2002-07-20 10:10:57 -04:00
|
|
|
retval.setTopBorderPaletteIdx(HSSFColor.BLACK.index);
|
|
|
|
retval.setBottomBorderPaletteIdx(HSSFColor.BLACK.index);
|
|
|
|
retval.setLeftBorderPaletteIdx(HSSFColor.BLACK.index);
|
|
|
|
retval.setRightBorderPaletteIdx(HSSFColor.BLACK.index);
|
2002-01-30 21:22:28 -05:00
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* Creates a StyleRecord object
|
2002-02-19 17:58:30 -05:00
|
|
|
* @param id the number of the style record to create (meaning its position in
|
|
|
|
* a file as MS Excel would create it.
|
2002-01-30 21:22:28 -05:00
|
|
|
* @return record containing a StyleRecord
|
|
|
|
* @see org.apache.poi.hssf.record.StyleRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createStyle(int id) { // we'll need multiple editions
|
2002-01-30 21:22:28 -05:00
|
|
|
StyleRecord retval = new StyleRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
switch (id) {
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 0 :
|
|
|
|
retval.setIndex(( short ) 0xffff8010);
|
|
|
|
retval.setBuiltin(( byte ) 3);
|
|
|
|
retval.setOutlineStyleLevel(( byte ) 0xffffffff);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 1 :
|
|
|
|
retval.setIndex(( short ) 0xffff8011);
|
|
|
|
retval.setBuiltin(( byte ) 6);
|
|
|
|
retval.setOutlineStyleLevel(( byte ) 0xffffffff);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 2 :
|
|
|
|
retval.setIndex(( short ) 0xffff8012);
|
|
|
|
retval.setBuiltin(( byte ) 4);
|
|
|
|
retval.setOutlineStyleLevel(( byte ) 0xffffffff);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 3 :
|
|
|
|
retval.setIndex(( short ) 0xffff8013);
|
|
|
|
retval.setBuiltin(( byte ) 7);
|
|
|
|
retval.setOutlineStyleLevel(( byte ) 0xffffffff);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 4 :
|
|
|
|
retval.setIndex(( short ) 0xffff8000);
|
|
|
|
retval.setBuiltin(( byte ) 0);
|
|
|
|
retval.setOutlineStyleLevel(( byte ) 0xffffffff);
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 5 :
|
|
|
|
retval.setIndex(( short ) 0xffff8014);
|
|
|
|
retval.setBuiltin(( byte ) 5);
|
|
|
|
retval.setOutlineStyleLevel(( byte ) 0xffffffff);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2003-01-02 06:17:57 -05:00
|
|
|
/**
|
|
|
|
* Creates a palette record initialized to the default palette
|
|
|
|
* @return a PaletteRecord instance populated with the default colors
|
|
|
|
* @see org.apache.poi.hssf.record.PaletteRecord
|
|
|
|
*/
|
|
|
|
protected PaletteRecord createPalette()
|
|
|
|
{
|
|
|
|
return new PaletteRecord(PaletteRecord.sid);
|
|
|
|
}
|
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* Creates the UseSelFS object with the use natural language flag set to 0 (false)
|
|
|
|
* @return record containing a UseSelFSRecord
|
|
|
|
* @see org.apache.poi.hssf.record.UseSelFSRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createUseSelFS() {
|
2002-01-30 21:22:28 -05:00
|
|
|
UseSelFSRecord retval = new UseSelFSRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setFlag(( short ) 0);
|
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* create a "bound sheet" or "bundlesheet" (depending who you ask) record
|
|
|
|
* Always sets the sheet's bof to 0. You'll need to set that yourself.
|
|
|
|
* @param id either sheet 0,1 or 2.
|
|
|
|
* @return record containing a BoundSheetRecord
|
|
|
|
* @see org.apache.poi.hssf.record.BoundSheetRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createBoundSheet(int id) { // 1,2,3 sheets
|
2002-01-30 21:22:28 -05:00
|
|
|
BoundSheetRecord retval = new BoundSheetRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
switch (id) {
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 0 :
|
|
|
|
retval.setPositionOfBof(0x0); // should be set later
|
|
|
|
retval.setOptionFlags(( short ) 0);
|
|
|
|
retval.setSheetnameLength(( byte ) 0x6);
|
|
|
|
retval.setCompressedUnicodeFlag(( byte ) 0);
|
|
|
|
retval.setSheetname("Sheet1");
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 1 :
|
|
|
|
retval.setPositionOfBof(0x0); // should be set later
|
|
|
|
retval.setOptionFlags(( short ) 0);
|
|
|
|
retval.setSheetnameLength(( byte ) 0x6);
|
|
|
|
retval.setCompressedUnicodeFlag(( byte ) 0);
|
|
|
|
retval.setSheetname("Sheet2");
|
|
|
|
break;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
case 2 :
|
|
|
|
retval.setPositionOfBof(0x0); // should be set later
|
|
|
|
retval.setOptionFlags(( short ) 0);
|
|
|
|
retval.setSheetnameLength(( byte ) 0x6);
|
|
|
|
retval.setCompressedUnicodeFlag(( byte ) 0);
|
|
|
|
retval.setSheetname("Sheet3");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
2002-07-20 23:03:57 -04:00
|
|
|
* Creates the Country record with the default country set to 1
|
|
|
|
* and current country set to 7 in case of russian locale ("ru_RU") and 1 otherwise
|
2002-01-30 21:22:28 -05:00
|
|
|
* @return record containing a CountryRecord
|
|
|
|
* @see org.apache.poi.hssf.record.CountryRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createCountry() { // what a novel idea, create your own!
|
2002-01-30 21:22:28 -05:00
|
|
|
CountryRecord retval = new CountryRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setDefaultCountry(( short ) 1);
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-07-20 23:03:57 -04:00
|
|
|
// from Russia with love ;)
|
|
|
|
if ( Locale.getDefault().toString().equals( "ru_RU" ) ) {
|
|
|
|
retval.setCurrentCountry(( short ) 7);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
retval.setCurrentCountry(( short ) 1);
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* Creates the SST record with no strings and the unique/num string set to 0
|
|
|
|
* @return record containing a SSTRecord
|
|
|
|
* @see org.apache.poi.hssf.record.SSTRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createSST() {
|
2002-01-30 21:22:28 -05:00
|
|
|
return new SSTRecord();
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* Creates the ExtendedSST record with numstrings per bucket set to 0x8. HSSF
|
|
|
|
* doesn't yet know what to do with this thing, but we create it with nothing in
|
|
|
|
* it hardly just to make Excel happy and our sheets look like Excel's
|
|
|
|
*
|
|
|
|
* @return record containing an ExtSSTRecord
|
|
|
|
* @see org.apache.poi.hssf.record.ExtSSTRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createExtendedSST() {
|
2002-01-30 21:22:28 -05:00
|
|
|
ExtSSTRecord retval = new ExtSSTRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
retval.setNumStringsPerBucket(( short ) 0x8);
|
|
|
|
return retval;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* creates the EOF record
|
|
|
|
* @see org.apache.poi.hssf.record.EOFRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
* @return record containing a EOFRecord
|
|
|
|
*/
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
protected Record createEOF() {
|
2002-01-30 21:22:28 -05:00
|
|
|
return new EOFRecord();
|
2002-07-14 20:14:40 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
public SheetReferences getSheetReferences() {
|
2003-07-27 15:15:16 -04:00
|
|
|
SheetReferences refs = new SheetReferences();
|
|
|
|
|
|
|
|
if (externSheet != null) {
|
|
|
|
for (int k = 0; k < externSheet.getNumOfREFStructures(); k++) {
|
|
|
|
|
|
|
|
String sheetName = findSheetNameFromExternSheet((short)k);
|
|
|
|
refs.addSheetReference(sheetName, k);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return refs;
|
2002-01-30 21:22:28 -05:00
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2003-02-06 05:29:45 -05:00
|
|
|
/** finds the sheet name by his extern sheet index
|
2002-04-23 18:24:41 -04:00
|
|
|
* @param num extern sheet index
|
|
|
|
* @return sheet name
|
|
|
|
*/
|
|
|
|
public String findSheetNameFromExternSheet(short num){
|
2003-07-27 15:15:16 -04:00
|
|
|
String result="";
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
short indexToSheet = externSheet.getREFRecordAt(num).getIndexToFirstSupBook();
|
2003-07-27 15:15:16 -04:00
|
|
|
if (indexToSheet>-1) { //error check, bail out gracefully!
|
|
|
|
result = getSheetName(indexToSheet);
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
return result;
|
|
|
|
}
|
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)
|
|
|
|
{
|
|
|
|
if (externSheetNumber >= externSheet.getNumOfREFStructures())
|
|
|
|
return -1;
|
|
|
|
else
|
|
|
|
return externSheet.getREFRecordAt(externSheetNumber).getIndexToFirstSupBook();
|
|
|
|
}
|
|
|
|
|
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){
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
int i = 0;
|
|
|
|
boolean flag = false;
|
|
|
|
short result = 0;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
if (externSheet == null) {
|
|
|
|
externSheet = createExternSheet();
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
//Trying to find reference to this sheet
|
|
|
|
while (i < externSheet.getNumOfREFStructures() && !flag){
|
|
|
|
ExternSheetSubRecord record = externSheet.getREFRecordAt(i);
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
if (record.getIndexToFirstSupBook() == sheetNumber &&
|
|
|
|
record.getIndexToLastSupBook() == sheetNumber){
|
|
|
|
flag = true;
|
|
|
|
result = (short) i;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
++i;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
//We Havent found reference to this sheet
|
|
|
|
if (!flag) {
|
|
|
|
result = addSheetIndexToExternSheet((short) sheetNumber);
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
return result;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
private short addSheetIndexToExternSheet(short sheetNumber){
|
|
|
|
short result;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
ExternSheetSubRecord record = new ExternSheetSubRecord();
|
|
|
|
record.setIndexToFirstSupBook(sheetNumber);
|
|
|
|
record.setIndexToLastSupBook(sheetNumber);
|
|
|
|
externSheet.addREFRecord(record);
|
|
|
|
externSheet.setNumOfREFStructures((short)(externSheet.getNumOfREFStructures() + 1));
|
|
|
|
result = (short)(externSheet.getNumOfREFStructures() - 1);
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
return result;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
/** gets the total number of names
|
|
|
|
* @return number of names
|
|
|
|
*/
|
|
|
|
public int getNumNames(){
|
|
|
|
int result = names.size();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
return result;
|
|
|
|
}
|
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){
|
|
|
|
NameRecord result = (NameRecord) names.get(index);
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
return result;
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
/** creates new name
|
|
|
|
* @return new name record
|
|
|
|
*/
|
|
|
|
public NameRecord createName(){
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
NameRecord name = new NameRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2003-02-06 05:29:45 -05:00
|
|
|
// Not the most efficient way but the other way was causing too many bugs
|
|
|
|
int idx = findFirstRecordLocBySid(ExternSheetRecord.sid);
|
|
|
|
if (idx == -1) idx = findFirstRecordLocBySid(SupBookRecord.sid);
|
|
|
|
if (idx == -1) idx = findFirstRecordLocBySid(CountryRecord.sid);
|
|
|
|
|
|
|
|
records.add(idx+names.size()+1, name);
|
|
|
|
names.add(name);
|
|
|
|
|
|
|
|
return name;
|
|
|
|
}
|
|
|
|
|
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)
|
|
|
|
{
|
|
|
|
// Not the most efficient way but the other way was causing too many bugs
|
|
|
|
int idx = findFirstRecordLocBySid(ExternSheetRecord.sid);
|
|
|
|
if (idx == -1) idx = findFirstRecordLocBySid(SupBookRecord.sid);
|
|
|
|
if (idx == -1) idx = findFirstRecordLocBySid(CountryRecord.sid);
|
|
|
|
records.add(idx+names.size()+1, name);
|
2002-04-23 18:24:41 -04:00
|
|
|
names.add(name);
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
return name;
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2003-03-06 15:41:17 -05:00
|
|
|
/**Generates a NameRecord to represent a built-in region
|
|
|
|
* @return a new NameRecord unless the index is invalid
|
|
|
|
*/
|
|
|
|
public NameRecord createBuiltInName(byte builtInName, int index)
|
|
|
|
{
|
|
|
|
if (index == -1 || index+1 > (int)Short.MAX_VALUE)
|
|
|
|
throw new IllegalArgumentException("Index is not valid ["+index+"]");
|
|
|
|
|
|
|
|
NameRecord name = new NameRecord(builtInName, (short)(index));
|
|
|
|
|
|
|
|
addName(name);
|
|
|
|
|
|
|
|
return name;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
/** removes the name
|
|
|
|
* @param namenum name index
|
|
|
|
*/
|
|
|
|
public void removeName(int namenum){
|
|
|
|
if (names.size() > namenum) {
|
2003-02-06 05:29:45 -05:00
|
|
|
int idx = findFirstRecordLocBySid(NameRecord.sid);
|
|
|
|
records.remove(idx + namenum);
|
2002-04-23 18:24:41 -04:00
|
|
|
names.remove(namenum);
|
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
/** creates a new extern sheet record
|
|
|
|
* @return the new extern sheet record
|
|
|
|
*/
|
|
|
|
protected ExternSheetRecord createExternSheet(){
|
2003-02-06 05:29:45 -05:00
|
|
|
ExternSheetRecord externSheet = new ExternSheetRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2003-02-06 05:29:45 -05:00
|
|
|
int idx = findFirstRecordLocBySid(CountryRecord.sid);
|
|
|
|
|
|
|
|
records.add(idx+1, externSheet);
|
|
|
|
// records.add(records.supbookpos + 1 , rec);
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
//We also adds the supBook for internal reference
|
|
|
|
SupBookRecord supbook = new SupBookRecord();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
supbook.setNumberOfSheets((short)getNumSheets());
|
2002-05-06 19:25:35 -04:00
|
|
|
//supbook.setFlag();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2003-02-06 05:29:45 -05:00
|
|
|
records.add(idx+1, supbook);
|
|
|
|
// records.add(records.supbookpos + 1 , supbook);
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2003-02-06 05:29:45 -05:00
|
|
|
return externSheet;
|
2002-04-23 18:24:41 -04:00
|
|
|
}
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-08-15 10:13:34 -04:00
|
|
|
/**
|
|
|
|
* Returns a format index that matches the passed in format. It does not tie into HSSFDataFormat.
|
|
|
|
* @param format the format string
|
|
|
|
* @param createIfNotFound creates a new format if format not found
|
|
|
|
* @return the format id of a format that matches or -1 if none found and createIfNotFound
|
|
|
|
*/
|
|
|
|
public short getFormat(String format, boolean createIfNotFound) {
|
|
|
|
Iterator iterator;
|
|
|
|
for (iterator = formats.iterator(); iterator.hasNext();) {
|
|
|
|
FormatRecord r = (FormatRecord)iterator.next();
|
|
|
|
if (r.getFormatString().equals(format)) {
|
|
|
|
return r.getIndexCode();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (createIfNotFound) {
|
|
|
|
return createFormat(format);
|
|
|
|
}
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2002-09-06 00:08:30 -04:00
|
|
|
/**
|
|
|
|
* Returns the list of FormatRecords in the workbook.
|
|
|
|
* @return ArrayList of FormatRecords in the notebook
|
|
|
|
*/
|
|
|
|
public ArrayList getFormats() {
|
|
|
|
return formats;
|
|
|
|
}
|
|
|
|
|
2002-08-15 10:13:34 -04:00
|
|
|
/**
|
|
|
|
* Creates a FormatRecord, inserts it, and returns the index code.
|
|
|
|
* @param format the format string
|
|
|
|
* @return the index code of the format record.
|
|
|
|
* @see org.apache.poi.hssf.record.FormatRecord
|
|
|
|
* @see org.apache.poi.hssf.record.Record
|
|
|
|
*/
|
2002-12-16 06:16:41 -05:00
|
|
|
public short createFormat( String format )
|
|
|
|
{
|
2003-02-06 05:29:45 -05:00
|
|
|
// ++xfpos; //These are to ensure that positions are updated properly
|
|
|
|
// ++palettepos;
|
|
|
|
// ++bspos;
|
2002-12-16 06:16:41 -05:00
|
|
|
FormatRecord rec = new FormatRecord();
|
|
|
|
maxformatid = maxformatid >= (short) 0xa4 ? (short) ( maxformatid + 1 ) : (short) 0xa4; //Starting value from M$ empiracle study.
|
|
|
|
rec.setIndexCode( maxformatid );
|
|
|
|
rec.setFormatStringLength( (byte) format.length() );
|
2005-04-28 10:04:22 -04:00
|
|
|
rec.setUnicodeFlag(StringUtil.isUnicodeFormat(format));
|
2002-12-16 06:16:41 -05:00
|
|
|
rec.setFormatString( format );
|
2002-08-15 10:13:34 -04:00
|
|
|
|
2002-12-16 06:16:41 -05:00
|
|
|
int pos = 0;
|
2003-02-06 05:29:45 -05:00
|
|
|
while ( pos < records.size() && records.get( pos ).getSid() != FormatRecord.sid )
|
2002-12-16 06:16:41 -05:00
|
|
|
pos++;
|
|
|
|
pos += formats.size();
|
|
|
|
formats.add( rec );
|
|
|
|
records.add( pos, rec );
|
|
|
|
return maxformatid;
|
|
|
|
}
|
2002-08-15 10:13:34 -04:00
|
|
|
|
2005-04-28 10:04:22 -04:00
|
|
|
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
/**
|
|
|
|
* Returns the first occurance of a record matching a particular sid.
|
|
|
|
*/
|
2002-04-23 18:24:41 -04:00
|
|
|
public Record findFirstRecordBySid(short sid) {
|
|
|
|
for (Iterator iterator = records.iterator(); iterator.hasNext(); ) {
|
2002-01-30 21:22:28 -05:00
|
|
|
Record record = ( Record ) iterator.next();
|
2002-08-15 10:13:34 -04:00
|
|
|
|
|
|
|
if (record.getSid() == sid) {
|
|
|
|
return record;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2002-12-16 06:16:41 -05:00
|
|
|
/**
|
|
|
|
* Returns the index of a record matching a particular sid.
|
|
|
|
* @param sid The sid of the record to match
|
|
|
|
* @return The index of -1 if no match made.
|
|
|
|
*/
|
|
|
|
public int findFirstRecordLocBySid(short sid) {
|
|
|
|
int index = 0;
|
|
|
|
for (Iterator iterator = records.iterator(); iterator.hasNext(); ) {
|
|
|
|
Record record = ( Record ) iterator.next();
|
|
|
|
|
|
|
|
if (record.getSid() == sid) {
|
|
|
|
return index;
|
|
|
|
}
|
|
|
|
index ++;
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2002-08-15 10:13:34 -04:00
|
|
|
/**
|
|
|
|
* Returns the next occurance of a record matching a particular sid.
|
|
|
|
*/
|
|
|
|
public Record findNextRecordBySid(short sid, int pos) {
|
2003-02-06 05:29:45 -05:00
|
|
|
int matches = 0;
|
|
|
|
for (Iterator iterator = records.iterator(); iterator.hasNext(); ) {
|
2002-08-15 10:13:34 -04:00
|
|
|
Record record = ( Record ) iterator.next();
|
2002-07-29 09:25:46 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
if (record.getSid() == sid) {
|
2003-02-06 05:29:45 -05:00
|
|
|
if (matches++ == pos)
|
|
|
|
return record;
|
2002-01-30 21:22:28 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
2002-04-29 07:10:29 -04:00
|
|
|
|
|
|
|
public List getRecords()
|
|
|
|
{
|
2003-02-06 05:29:45 -05:00
|
|
|
return records.getRecords();
|
2002-04-29 07:10:29 -04:00
|
|
|
}
|
2002-11-28 14:32:52 -05:00
|
|
|
|
2002-12-16 06:16:41 -05:00
|
|
|
// public void insertChartRecords( List chartRecords )
|
|
|
|
// {
|
|
|
|
// backuppos += chartRecords.size();
|
|
|
|
// fontpos += chartRecords.size();
|
2003-01-02 06:17:57 -05:00
|
|
|
// palettepos += chartRecords.size();
|
2002-12-16 06:16:41 -05:00
|
|
|
// bspos += chartRecords.size();
|
|
|
|
// xfpos += chartRecords.size();
|
|
|
|
//
|
|
|
|
// records.addAll(protpos, chartRecords);
|
|
|
|
// }
|
|
|
|
|
2002-11-28 14:32:52 -05:00
|
|
|
/**
|
|
|
|
* Whether date windowing is based on 1/2/1904 or 1/1/1900.
|
|
|
|
* Some versions of Excel (Mac) can save workbooks using 1904 date windowing.
|
|
|
|
*
|
|
|
|
* @return true if using 1904 date windowing
|
|
|
|
*/
|
|
|
|
public boolean isUsing1904DateWindowing() {
|
|
|
|
return uses1904datewindowing;
|
|
|
|
}
|
2003-01-02 06:17:57 -05:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the custom palette in use for this workbook; if a custom palette record
|
|
|
|
* does not exist, then it is created.
|
|
|
|
*/
|
|
|
|
public PaletteRecord getCustomPalette()
|
|
|
|
{
|
2004-08-23 04:52:54 -04:00
|
|
|
PaletteRecord palette;
|
2003-10-14 18:50:48 -04:00
|
|
|
int palettePos = records.getPalettepos();
|
|
|
|
if (palettePos != -1) {
|
|
|
|
Record rec = records.get(palettePos);
|
|
|
|
if (rec instanceof PaletteRecord) {
|
2004-08-23 04:52:54 -04:00
|
|
|
palette = (PaletteRecord) rec;
|
2003-10-14 18:50:48 -04:00
|
|
|
} else throw new RuntimeException("InternalError: Expected PaletteRecord but got a '"+rec+"'");
|
2004-08-23 04:52:54 -04:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
palette = createPalette();
|
2003-10-14 18:50:48 -04:00
|
|
|
//Add the palette record after the bof which is always the first record
|
|
|
|
records.add(1, palette);
|
2003-10-14 19:18:03 -04:00
|
|
|
records.setPalettepos(1);
|
2004-08-23 04:52:54 -04:00
|
|
|
}
|
|
|
|
return palette;
|
2003-01-02 06:17:57 -05:00
|
|
|
}
|
2004-08-23 04:52:54 -04:00
|
|
|
|
2004-04-09 07:45:38 -04:00
|
|
|
/**
|
|
|
|
* Creates a drawing group record. If it already exists then it's left
|
|
|
|
* alone.
|
|
|
|
*/
|
|
|
|
public void createDrawingGroup()
|
|
|
|
{
|
|
|
|
int dggLoc = findFirstRecordLocBySid(EscherContainerRecord.DGG_CONTAINER);
|
|
|
|
if (dggLoc == -1)
|
|
|
|
{
|
|
|
|
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[] {} );
|
|
|
|
drawingManager = new DrawingManager(dgg);
|
|
|
|
opt.setRecordId((short) 0xF00B);
|
|
|
|
opt.setOptions((short) 0x0033);
|
|
|
|
opt.addEscherProperty( new EscherBoolProperty(EscherProperties.TEXT__SIZE_TEXT_TO_FIT_SHAPE, 524296) );
|
|
|
|
opt.addEscherProperty( new EscherRGBProperty(EscherProperties.FILL__FILLCOLOR, 134217737) );
|
|
|
|
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);
|
|
|
|
dggContainer.addChildRecord(opt);
|
|
|
|
dggContainer.addChildRecord(splitMenuColors);
|
|
|
|
|
|
|
|
DrawingGroupRecord drawingGroup = new DrawingGroupRecord();
|
|
|
|
drawingGroup.addEscherRecord(dggContainer);
|
|
|
|
int loc = findFirstRecordLocBySid(CountryRecord.sid);
|
|
|
|
getRecords().add(loc+1, drawingGroup);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public DrawingManager getDrawingManager()
|
|
|
|
{
|
|
|
|
return drawingManager;
|
|
|
|
}
|
2004-08-23 04:52:54 -04:00
|
|
|
|
2002-01-30 21:22:28 -05:00
|
|
|
}
|
2003-03-06 15:41:17 -05:00
|
|
|
|