*
*@author Andrew C. Oliver (acoliver at apache dot org)
*@author Glen Stampoultzis (glens at apache.org)
- *@created May 10, 2002
*@see #main
*/
*@param data Description of the Parameter
*@exception IOException Description of the Exception
*/
- private static void dump(short rectype, short recsize, byte[] data) throws IOException {
-// System.out
-// .println("fixing to recordize the following");
- System.out.print("rectype = 0x"
- + Integer.toHexString(rectype));
- System.out.println(", recsize = 0x"
- + Integer.toHexString(recsize));
+ private static void dump( short rectype, short recsize, byte[] data ) throws IOException
+ {
+ // System.out
+ // .println("fixing to recordize the following");
+ System.out.print( "rectype = 0x"
+ + Integer.toHexString( rectype ) );
+ System.out.println( ", recsize = 0x"
+ + Integer.toHexString( recsize ) );
System.out.println(
- "-BEGIN DUMP---------------------------------");
- if (data.length > 0) {
- HexDump.dump(data, 0, System.out, 0);
- } else {
- System.out.println("**NO RECORD DATA**");
+ "-BEGIN DUMP---------------------------------" );
+ if ( data.length > 0 )
+ {
+ HexDump.dump( data, 0, System.out, 0 );
+ }
+ else
+ {
+ System.out.println( "**NO RECORD DATA**" );
}
-// System.out.println();
+ // System.out.println();
System.out.println(
- "-END DUMP-----------------------------------");
+ "-END DUMP-----------------------------------" );
}
*@return Description of the Return Value
*/
- private static Record[] createRecord(short rectype, short size,
- byte[] data) {
+ private static Record[] createRecord( short rectype, short size,
+ byte[] data )
+ {
Record retval = null;
Record[] realretval = null;
// int irectype = rectype;
- switch (rectype) {
+ switch ( rectype )
+ {
case ChartRecord.sid:
- retval = new ChartRecord(rectype, size, data);
+ retval = new ChartRecord( rectype, size, data );
break;
case ChartFormatRecord.sid:
- retval = new ChartFormatRecord(rectype, size, data);
+ retval = new ChartFormatRecord( rectype, size, data );
break;
case SeriesRecord.sid:
- retval = new SeriesRecord(rectype, size, data);
+ retval = new SeriesRecord( rectype, size, data );
break;
case BeginRecord.sid:
- retval = new BeginRecord(rectype, size, data);
+ retval = new BeginRecord( rectype, size, data );
break;
case EndRecord.sid:
- retval = new EndRecord(rectype, size, data);
+ retval = new EndRecord( rectype, size, data );
break;
case BOFRecord.sid:
- retval = new BOFRecord(rectype, size, data);
+ retval = new BOFRecord( rectype, size, data );
break;
case InterfaceHdrRecord.sid:
- retval = new InterfaceHdrRecord(rectype, size, data);
+ retval = new InterfaceHdrRecord( rectype, size, data );
break;
case MMSRecord.sid:
- retval = new MMSRecord(rectype, size, data);
+ retval = new MMSRecord( rectype, size, data );
break;
case InterfaceEndRecord.sid:
- retval = new InterfaceEndRecord(rectype, size, data);
+ retval = new InterfaceEndRecord( rectype, size, data );
break;
case WriteAccessRecord.sid:
- retval = new WriteAccessRecord(rectype, size, data);
+ retval = new WriteAccessRecord( rectype, size, data );
break;
case CodepageRecord.sid:
- retval = new CodepageRecord(rectype, size, data);
+ retval = new CodepageRecord( rectype, size, data );
break;
case DSFRecord.sid:
- retval = new DSFRecord(rectype, size, data);
+ retval = new DSFRecord( rectype, size, data );
break;
case TabIdRecord.sid:
- retval = new TabIdRecord(rectype, size, data);
+ retval = new TabIdRecord( rectype, size, data );
break;
case FnGroupCountRecord.sid:
- retval = new FnGroupCountRecord(rectype, size, data);
+ retval = new FnGroupCountRecord( rectype, size, data );
break;
case WindowProtectRecord.sid:
- retval = new WindowProtectRecord(rectype, size, data);
+ retval = new WindowProtectRecord( rectype, size, data );
break;
case ProtectRecord.sid:
- retval = new ProtectRecord(rectype, size, data);
+ retval = new ProtectRecord( rectype, size, data );
break;
case PasswordRecord.sid:
- retval = new PasswordRecord(rectype, size, data);
+ retval = new PasswordRecord( rectype, size, data );
break;
case ProtectionRev4Record.sid:
- retval = new ProtectionRev4Record(rectype, size, data);
+ retval = new ProtectionRev4Record( rectype, size, data );
break;
case PasswordRev4Record.sid:
- retval = new PasswordRev4Record(rectype, size, data);
+ retval = new PasswordRev4Record( rectype, size, data );
break;
case WindowOneRecord.sid:
- retval = new WindowOneRecord(rectype, size, data);
+ retval = new WindowOneRecord( rectype, size, data );
break;
case BackupRecord.sid:
- retval = new BackupRecord(rectype, size, data);
+ retval = new BackupRecord( rectype, size, data );
break;
case HideObjRecord.sid:
- retval = new HideObjRecord(rectype, size, data);
+ retval = new HideObjRecord( rectype, size, data );
break;
case DateWindow1904Record.sid:
- retval = new DateWindow1904Record(rectype, size, data);
+ retval = new DateWindow1904Record( rectype, size, data );
break;
case PrecisionRecord.sid:
- retval = new PrecisionRecord(rectype, size, data);
+ retval = new PrecisionRecord( rectype, size, data );
break;
case RefreshAllRecord.sid:
- retval = new RefreshAllRecord(rectype, size, data);
+ retval = new RefreshAllRecord( rectype, size, data );
break;
case BookBoolRecord.sid:
- retval = new BookBoolRecord(rectype, size, data);
+ retval = new BookBoolRecord( rectype, size, data );
break;
case FontRecord.sid:
- retval = new FontRecord(rectype, size, data);
+ retval = new FontRecord( rectype, size, data );
break;
case FormatRecord.sid:
- retval = new FormatRecord(rectype, size, data);
+ retval = new FormatRecord( rectype, size, data );
break;
case ExtendedFormatRecord.sid:
- retval = new ExtendedFormatRecord(rectype, size, data);
+ retval = new ExtendedFormatRecord( rectype, size, data );
break;
case StyleRecord.sid:
- retval = new StyleRecord(rectype, size, data);
+ retval = new StyleRecord( rectype, size, data );
break;
case UseSelFSRecord.sid:
- retval = new UseSelFSRecord(rectype, size, data);
+ retval = new UseSelFSRecord( rectype, size, data );
break;
case BoundSheetRecord.sid:
- retval = new BoundSheetRecord(rectype, size, data);
+ retval = new BoundSheetRecord( rectype, size, data );
break;
case CountryRecord.sid:
- retval = new CountryRecord(rectype, size, data);
+ retval = new CountryRecord( rectype, size, data );
break;
case SSTRecord.sid:
- retval = new SSTRecord(rectype, size, data);
+ retval = new SSTRecord( rectype, size, data );
break;
case ExtSSTRecord.sid:
- retval = new ExtSSTRecord(rectype, size, data);
+ retval = new ExtSSTRecord( rectype, size, data );
break;
case EOFRecord.sid:
- retval = new EOFRecord(rectype, size, data);
+ retval = new EOFRecord( rectype, size, data );
break;
case IndexRecord.sid:
- retval = new IndexRecord(rectype, size, data);
+ retval = new IndexRecord( rectype, size, data );
break;
case CalcModeRecord.sid:
- retval = new CalcModeRecord(rectype, size, data);
+ retval = new CalcModeRecord( rectype, size, data );
break;
case CalcCountRecord.sid:
- retval = new CalcCountRecord(rectype, size, data);
+ retval = new CalcCountRecord( rectype, size, data );
break;
case RefModeRecord.sid:
- retval = new RefModeRecord(rectype, size, data);
+ retval = new RefModeRecord( rectype, size, data );
break;
case IterationRecord.sid:
- retval = new IterationRecord(rectype, size, data);
+ retval = new IterationRecord( rectype, size, data );
break;
case DeltaRecord.sid:
- retval = new DeltaRecord(rectype, size, data);
+ retval = new DeltaRecord( rectype, size, data );
break;
case SaveRecalcRecord.sid:
- retval = new SaveRecalcRecord(rectype, size, data);
+ retval = new SaveRecalcRecord( rectype, size, data );
break;
case PrintHeadersRecord.sid:
- retval = new PrintHeadersRecord(rectype, size, data);
+ retval = new PrintHeadersRecord( rectype, size, data );
break;
case PrintGridlinesRecord.sid:
- retval = new PrintGridlinesRecord(rectype, size, data);
+ retval = new PrintGridlinesRecord( rectype, size, data );
break;
case GridsetRecord.sid:
- retval = new GridsetRecord(rectype, size, data);
+ retval = new GridsetRecord( rectype, size, data );
break;
case GutsRecord.sid:
- retval = new GutsRecord(rectype, size, data);
+ retval = new GutsRecord( rectype, size, data );
break;
case DefaultRowHeightRecord.sid:
- retval = new DefaultRowHeightRecord(rectype, size, data);
+ retval = new DefaultRowHeightRecord( rectype, size, data );
break;
case WSBoolRecord.sid:
- retval = new WSBoolRecord(rectype, size, data);
+ retval = new WSBoolRecord( rectype, size, data );
break;
case HeaderRecord.sid:
- retval = new HeaderRecord(rectype, size, data);
+ retval = new HeaderRecord( rectype, size, data );
break;
case FooterRecord.sid:
- retval = new FooterRecord(rectype, size, data);
+ retval = new FooterRecord( rectype, size, data );
break;
case HCenterRecord.sid:
- retval = new HCenterRecord(rectype, size, data);
+ retval = new HCenterRecord( rectype, size, data );
break;
case VCenterRecord.sid:
- retval = new VCenterRecord(rectype, size, data);
+ retval = new VCenterRecord( rectype, size, data );
break;
case PrintSetupRecord.sid:
- retval = new PrintSetupRecord(rectype, size, data);
+ retval = new PrintSetupRecord( rectype, size, data );
break;
case DefaultColWidthRecord.sid:
- retval = new DefaultColWidthRecord(rectype, size, data);
+ retval = new DefaultColWidthRecord( rectype, size, data );
break;
case DimensionsRecord.sid:
- retval = new DimensionsRecord(rectype, size, data);
+ retval = new DimensionsRecord( rectype, size, data );
break;
case RowRecord.sid:
- retval = new RowRecord(rectype, size, data);
+ retval = new RowRecord( rectype, size, data );
break;
case LabelSSTRecord.sid:
- retval = new LabelSSTRecord(rectype, size, data);
+ retval = new LabelSSTRecord( rectype, size, data );
break;
case RKRecord.sid:
- retval = new RKRecord(rectype, size, data);
+ retval = new RKRecord( rectype, size, data );
break;
case NumberRecord.sid:
- retval = new NumberRecord(rectype, size, data);
+ retval = new NumberRecord( rectype, size, data );
break;
case DBCellRecord.sid:
- retval = new DBCellRecord(rectype, size, data);
+ retval = new DBCellRecord( rectype, size, data );
break;
case WindowTwoRecord.sid:
- retval = new WindowTwoRecord(rectype, size, data);
+ retval = new WindowTwoRecord( rectype, size, data );
break;
case SelectionRecord.sid:
- retval = new SelectionRecord(rectype, size, data);
+ retval = new SelectionRecord( rectype, size, data );
break;
case ContinueRecord.sid:
- retval = new ContinueRecord(rectype, size, data);
+ retval = new ContinueRecord( rectype, size, data );
break;
case LabelRecord.sid:
- retval = new LabelRecord(rectype, size, data);
+ retval = new LabelRecord( rectype, size, data );
break;
case MulRKRecord.sid:
- retval = new MulRKRecord(rectype, size, data);
+ retval = new MulRKRecord( rectype, size, data );
break;
case MulBlankRecord.sid:
- retval = new MulBlankRecord(rectype, size, data);
+ retval = new MulBlankRecord( rectype, size, data );
break;
case BlankRecord.sid:
- retval = new BlankRecord(rectype, size, data);
+ retval = new BlankRecord( rectype, size, data );
break;
case BoolErrRecord.sid:
- retval = new BoolErrRecord(rectype, size, data);
+ retval = new BoolErrRecord( rectype, size, data );
break;
case ColumnInfoRecord.sid:
- retval = new ColumnInfoRecord(rectype, size, data);
+ retval = new ColumnInfoRecord( rectype, size, data );
break;
case MergeCellsRecord.sid:
- retval = new MergeCellsRecord(rectype, size, data);
+ retval = new MergeCellsRecord( rectype, size, data );
break;
case AreaRecord.sid:
- retval = new AreaRecord(rectype, size, data);
+ retval = new AreaRecord( rectype, size, data );
break;
case DataFormatRecord.sid:
- retval = new DataFormatRecord(rectype, size, data);
+ retval = new DataFormatRecord( rectype, size, data );
break;
case BarRecord.sid:
- retval = new BarRecord(rectype, size, data);
+ retval = new BarRecord( rectype, size, data );
break;
case DatRecord.sid:
- retval = new DatRecord(rectype, size, data);
+ retval = new DatRecord( rectype, size, data );
break;
case PlotGrowthRecord.sid:
- retval = new PlotGrowthRecord(rectype, size, data);
+ retval = new PlotGrowthRecord( rectype, size, data );
break;
case UnitsRecord.sid:
- retval = new UnitsRecord(rectype, size, data);
+ retval = new UnitsRecord( rectype, size, data );
break;
case FrameRecord.sid:
- retval = new FrameRecord(rectype, size, data);
+ retval = new FrameRecord( rectype, size, data );
break;
case ValueRangeRecord.sid:
- retval = new ValueRangeRecord(rectype, size, data);
+ retval = new ValueRangeRecord( rectype, size, data );
break;
case SeriesListRecord.sid:
- retval = new SeriesListRecord(rectype, size, data);
+ retval = new SeriesListRecord( rectype, size, data );
break;
case FontBasisRecord.sid:
- retval = new FontBasisRecord(rectype, size, data);
+ retval = new FontBasisRecord( rectype, size, data );
break;
case FontIndexRecord.sid:
- retval = new FontIndexRecord(rectype, size, data);
+ retval = new FontIndexRecord( rectype, size, data );
break;
case LineFormatRecord.sid:
- retval = new LineFormatRecord(rectype, size, data);
+ retval = new LineFormatRecord( rectype, size, data );
break;
case AreaFormatRecord.sid:
- retval = new AreaFormatRecord(rectype, size, data);
+ retval = new AreaFormatRecord( rectype, size, data );
break;
case LinkedDataRecord.sid:
- retval = new LinkedDataRecord(rectype, size, data);
+ retval = new LinkedDataRecord( rectype, size, data );
break;
case FormulaRecord.sid:
- retval = new FormulaRecord(rectype, size, data);
+ retval = new FormulaRecord( rectype, size, data );
break;
case SheetPropertiesRecord.sid:
- retval = new SheetPropertiesRecord(rectype, size, data);
+ retval = new SheetPropertiesRecord( rectype, size, data );
break;
case DefaultDataLabelTextPropertiesRecord.sid:
- retval = new DefaultDataLabelTextPropertiesRecord(rectype, size, data);
+ retval = new DefaultDataLabelTextPropertiesRecord( rectype, size, data );
break;
case TextRecord.sid:
- retval = new TextRecord(rectype, size, data);
+ retval = new TextRecord( rectype, size, data );
break;
case AxisParentRecord.sid:
- retval = new AxisParentRecord(rectype, size, data);
+ retval = new AxisParentRecord( rectype, size, data );
break;
case AxisLineFormatRecord.sid:
- retval = new AxisLineFormatRecord(rectype, size, data);
+ retval = new AxisLineFormatRecord( rectype, size, data );
break;
case SupBookRecord.sid:
- retval = new SupBookRecord(rectype, size, data);
+ retval = new SupBookRecord( rectype, size, data );
break;
case ExternSheetRecord.sid:
- retval = new ExternSheetRecord(rectype, size, data);
+ retval = new ExternSheetRecord( rectype, size, data );
break;
case SCLRecord.sid:
- retval = new SCLRecord(rectype, size, data);
+ retval = new SCLRecord( rectype, size, data );
break;
case SeriesToChartGroupRecord.sid:
- retval = new SeriesToChartGroupRecord(rectype, size, data);
+ retval = new SeriesToChartGroupRecord( rectype, size, data );
break;
case AxisUsedRecord.sid:
- retval = new AxisUsedRecord(rectype, size, data);
+ retval = new AxisUsedRecord( rectype, size, data );
break;
case AxisRecord.sid:
- retval = new AxisRecord(rectype, size, data);
+ retval = new AxisRecord( rectype, size, data );
break;
case CategorySeriesAxisRecord.sid:
- retval = new CategorySeriesAxisRecord(rectype, size, data);
- break;
+ retval = new CategorySeriesAxisRecord( rectype, size, data );
+ break;
case AxisOptionsRecord.sid:
- retval = new AxisOptionsRecord(rectype, size, data);
+ retval = new AxisOptionsRecord( rectype, size, data );
break;
case TickRecord.sid:
- retval = new TickRecord(rectype, size, data);
+ retval = new TickRecord( rectype, size, data );
break;
case SeriesTextRecord.sid:
- retval = new SeriesTextRecord(rectype, size, data);
+ retval = new SeriesTextRecord( rectype, size, data );
break;
case ObjectLinkRecord.sid:
- retval = new ObjectLinkRecord(rectype, size, data);
+ retval = new ObjectLinkRecord( rectype, size, data );
break;
case PlotAreaRecord.sid:
- retval = new PlotAreaRecord(rectype, size, data);
+ retval = new PlotAreaRecord( rectype, size, data );
break;
case SeriesIndexRecord.sid:
- retval = new SeriesIndexRecord(rectype, size, data);
+ retval = new SeriesIndexRecord( rectype, size, data );
break;
case LegendRecord.sid:
- retval = new LegendRecord(rectype, size, data);
- break;
- case LeftMarginRecord.sid:
- retval = new LeftMarginRecord(rectype, size, data);
- break;
- case RightMarginRecord.sid:
- retval = new RightMarginRecord(rectype, size, data);
- break;
- case TopMarginRecord.sid:
- retval = new TopMarginRecord(rectype, size, data);
- break;
- case BottomMarginRecord.sid:
- retval = new BottomMarginRecord(rectype, size, data);
- break;
- case PaletteRecord.sid:
- retval = new PaletteRecord(rectype, size, data);
- break;
-
+ retval = new LegendRecord( rectype, size, data );
+ break;
+ case LeftMarginRecord.sid:
+ retval = new LeftMarginRecord( rectype, size, data );
+ break;
+ case LeftMarginRecord.sid:
+ retval = new LeftMarginRecord( rectype, size, data );
+ break;
+ case RightMarginRecord.sid:
+ retval = new RightMarginRecord( rectype, size, data );
+ break;
+ case TopMarginRecord.sid:
+ retval = new TopMarginRecord( rectype, size, data );
+ break;
+ case BottomMarginRecord.sid:
+ retval = new BottomMarginRecord( rectype, size, data );
+ break;
+ case PaletteRecord.sid:
+ retval = new PaletteRecord( rectype, size, data );
+ break;
+ case StringRecord.sid:
+ retval = new StringRecord( rectype, size, data );
+ break;
default:
- retval = new UnknownRecord(rectype, size, data);
+ retval = new UnknownRecord( rectype, size, data );
}
- if (realretval == null) {
+ if ( realretval == null )
+ {
realretval = new Record[1];
realretval[0] = retval;
- System.out.println("recordid = 0x" + Integer.toHexString(rectype) + ", size =" + size);
- System.out.println(realretval[0].toString());
+ System.out.println( "recordid = 0x" + Integer.toHexString( rectype ) + ", size =" + size );
+ System.out.println( realretval[0].toString() );
}
return realretval;
}
public class Workbook {
private static final int DEBUG = POILogger.DEBUG;
-
+
// public static Workbook currentBook = null;
-
+
/**
* constant used to set the "codepage" wherever "codepage" is set in records
* (which is duplciated in more than one record)
*/
-
+
private final static short CODEPAGE = ( short ) 0x4b0;
-
+
/**
* this contains the Worksheet record objects
*/
-
+
protected ArrayList records = null;
-
+
/**
* this contains a reference to the SSTRecord so that new stings can be added
* to it.
*/
-
+
protected SSTRecord sst = null;
-
+
/**
* Holds the Extern Sheet with references to bound sheets
*/
-
+
protected ExternSheetRecord externSheet= null;
-
+
/**
* holds the "boundsheet" records (aka bundlesheet) so that they can have their
* reference to their "BOF" marker
*/
-
-
+
+
protected ArrayList boundsheets = new ArrayList();
-
+
protected ArrayList names = new ArrayList();
-
+
protected int bspos =
0; // holds the position of the last bound sheet.
protected int tabpos =
0; // holds the position of last name record
private int supbookpos =
0; // holds the position of sup book
-
+
private static POILogger log =
POILogFactory.getLogger(Workbook.class);
-
+
/**
* Creates new Workbook with no intitialization --useless right now
* @see #createWorkbook(List)
*/
-
+
public Workbook() {
}
-
+
/**
* read support for low level
* API. Pass in an array of Record objects, A Workbook
* @param recs an array of Record objects
* @return Workbook object
*/
-
+
public static Workbook createWorkbook(List recs) {
log.log(DEBUG, "Workbook (readfile) created with reclen=",
new Integer(recs.size()));
Workbook retval = new Workbook();
ArrayList records = new ArrayList(recs.size() / 3);
-
+
for (int k = 0; k < recs.size(); k++) {
Record rec = ( Record ) recs.get(k);
-
+
if (rec.getSid() == EOFRecord.sid) {
records.add(rec);
log.log(DEBUG, "found workbook eof record at " + k);
break;
}
switch (rec.getSid()) {
-
+
case BoundSheetRecord.sid :
log.log(DEBUG, "found boundsheet record at " + k);
retval.boundsheets.add(rec);
retval.bspos = k;
break;
-
+
case SSTRecord.sid :
log.log(DEBUG, "found sst record at " + k);
retval.sst = ( SSTRecord ) rec;
break;
-
+
case FontRecord.sid :
log.log(DEBUG, "found font record at " + k);
retval.fontpos = k;
retval.numfonts++;
break;
-
+
case ExtendedFormatRecord.sid :
log.log(DEBUG, "found XF record at " + k);
retval.xfpos = k;
retval.numxfs++;
break;
-
+
case TabIdRecord.sid :
log.log(DEBUG, "found tabid record at " + k);
retval.tabpos = k;
break;
-
+
case BackupRecord.sid :
log.log(DEBUG, "found backup record at " + k);
retval.backuppos = k;
log.log(DEBUG, "found SupBook record at " + k);
retval.supbookpos = k;
break;
-
+
default :
}
records.add(rec);
retval.supbookpos = retval.bspos + 1;
retval.namepos = retval.supbookpos + 1;
}
-
+
retval.records = records;
log.log(DEBUG, "exit create workbook from existing file function");
return retval;
}
-
+
/**
* Creates an empty workbook object with three blank sheets and all the empty
* fields. Use this to create a workbook from scratch.
*/
-
+
public static Workbook createWorkbook() {
log.log(DEBUG, "creating new workbook from scratch");
Workbook retval = new Workbook();
ArrayList records = new ArrayList(30);
-
+
records.add(retval.createBOF());
records.add(retval.createInterfaceHdr());
records.add(retval.createMMS());
for (int k = 0; k < 1; k++) { // now just do 1
BoundSheetRecord bsr =
( BoundSheetRecord ) retval.createBoundSheet(k);
-
+
records.add(bsr);
retval.boundsheets.add(bsr);
retval.bspos = records.size() - 1;
retval.sst = ( SSTRecord ) retval.createSST();
records.add(retval.sst);
records.add(retval.createExtendedSST());
-
+
// TODO
records.add(retval.createEOF());
retval.records = records;
log.log(DEBUG, "exit create new workbook from scratch");
return retval;
}
-
+
public int getNumRecords() {
return records.size();
}
-
+
/**
* 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
* @param idx the index to look at (0 or greater but NOT 4)
* @return FontRecord located at the given index
*/
-
+
public FontRecord getFontRecordAt(int idx) {
int index = idx;
-
+
if (index > 4) {
index -= 1; // adjust for "There is no 4"
}
}
FontRecord retval =
( FontRecord ) records.get((fontpos - (numfonts - 1)) + index);
-
+
return retval;
}
-
+
/**
* 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
*
* @return FontRecord that was just created
*/
-
+
public FontRecord createNewFont() {
FontRecord rec = ( FontRecord ) createFont();
-
+
++fontpos;
++bspos;
++xfpos;
numfonts++;
return rec;
}
-
+
/**
* gets the number of font records
*
* @return number of font records in the "font table"
*/
-
+
public int getNumberOfFontRecords() {
return numfonts;
}
-
+
/**
* 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
*/
-
+
public void setSheetBof(int sheetnum, int pos) {
log.log(DEBUG, "setting bof for sheetnum =", new Integer(sheetnum),
" at pos=", new Integer(pos));
(( BoundSheetRecord ) boundsheets.get(sheetnum))
.setPositionOfBof(pos);
}
-
+
/**
* Returns the position of the backup record.
*/
-
+
public BackupRecord getBackupRecord() {
return ( BackupRecord ) records.get(backuppos);
}
-
-
+
+
/**
* 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
* @param sheetnum the sheet number (0 based)
* @param sheetname the name for the sheet
*/
-
+
// for compartibility
public void setSheetName(int sheetnum, String sheetname ) {
setSheetName( sheetnum, sheetname, (byte)0 );
}
-
+
public void setSheetName(int sheetnum, String sheetname, short encoding ) {
checkSheets(sheetnum);
-
BoundSheetRecord sheet = (BoundSheetRecord)boundsheets.get( sheetnum );
sheet.setSheetname(sheetname);
sheet.setSheetnameLength( (byte)sheetname.length() );
sheet.setCompressedUnicodeFlag( (byte)encoding );
}
-
+
/**
* gets the name for a given sheet.
*
* @param sheetnum the sheet number (0 based)
* @return sheetname the name for the sheet
*/
-
+
public String getSheetName(int sheetnum) {
return (( BoundSheetRecord ) boundsheets.get(sheetnum))
.getSheetname();
}
-
+
/**
* get the sheet's index
* @param name sheet name
* @return sheet index or -1 if it was not found.
*/
-
+
public int getSheetIndex(String name) {
int retval = -1;
-
+
for (int k = 0; k < boundsheets.size(); k++) {
String sheet = getSheetName(k);
-
+
if (sheet.equals(name)) {
retval = k;
break;
}
return retval;
}
-
+
/**
* 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!
*/
-
+
private void checkSheets(int sheetnum) {
if ((boundsheets.size()) <= sheetnum) { // if we're short one add another..
if ((boundsheets.size() + 1) <= sheetnum) {
}
BoundSheetRecord bsr =
( BoundSheetRecord ) createBoundSheet(sheetnum);
-
+
records.add(++bspos, bsr);
boundsheets.add(bsr);
fixTabIdRecord();
}
}
-
+
public void removeSheet(int sheetnum) {
if (boundsheets.size() > sheetnum) {
records.remove(bspos - (boundsheets.size() - 1) + sheetnum);
fixTabIdRecord();
}
}
-
+
/**
* make the tabid record look like the current situation.
*
*/
-
+
private void fixTabIdRecord() {
TabIdRecord tir = ( TabIdRecord ) records.get(tabpos);
short[] tia = new short[ boundsheets.size() ];
-
+
for (short k = 0; k < tia.length; k++) {
tia[ k ] = k;
}
tir.setTabIdArray(tia);
}
-
+
/**
* returns the number of boundsheet objects contained in this workbook.
*
* @return number of BoundSheet records
*/
-
+
public int getNumSheets() {
log.log(DEBUG, "getNumSheets=", new Integer(boundsheets.size()));
return boundsheets.size();
}
-
+
/**
* get the number of ExtendedFormat records contained in this workbook.
*
* @return int count of ExtendedFormat records
*/
-
+
public int getNumExFormats() {
log.log(DEBUG, "getXF=", new Integer(boundsheets.size()));
return numxfs;
}
-
+
/**
* gets the ExtendedFormatRecord at the given 0-based index
*
* @param index of the Extended format record (0-based)
* @return ExtendedFormatRecord at the given index
*/
-
+
public ExtendedFormatRecord getExFormatAt(int index) {
int xfptr = xfpos - (numxfs - 1);
-
+
xfptr += index;
ExtendedFormatRecord retval =
( ExtendedFormatRecord ) records.get(xfptr);
-
+
return retval;
}
-
+
/**
* creates a new Cell-type Extneded Format Record and adds it to the end of
* ExtendedFormatRecords collection
*
* @return ExtendedFormatRecord that was created
*/
-
+
public ExtendedFormatRecord createCellXF() {
ExtendedFormatRecord xf = createExtendedFormat();
-
+
++xfpos;
++bspos;
records.add(xfpos, xf);
numxfs++;
return xf;
}
-
+
/**
* Adds a string to the SST table and returns its index (if its a duplicate
* just returns its index and update the counts)
* @param use16bits whether to use utf 16 or false for compressed unicode
* @return index of the string within the SSTRecord
*/
-
+
public int addSSTString(String string, boolean use16bits) {
log.log(DEBUG, "insert to sst string='", string, "' and use16bits= ",
new Boolean(use16bits));
}
return sst.addString(string, use16bits);
}
-
+
/**
* 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
*
* @return index of the string within the SSTRecord
*/
-
+
public int addSSTString(String string) {
return addSSTString(string, false);
}
-
+
/**
* given an index into the SST table, this function returns the corresponding String value
* @return String containing the SST String
*/
-
+
public String getSSTString(int str) {
if (sst == null) {
insertSST();
}
String retval = sst.getString(str);
-
+
log.log(DEBUG, "Returning SST for index=", new Integer(str),
" String= ", retval);
return retval;
}
-
+
/**
* 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
*/
-
+
public void insertSST() {
log.log(DEBUG, "creating new SST via insertSST!");
sst = ( SSTRecord ) createSST();
records.add(records.size() - 1, createExtendedSST());
records.add(records.size() - 2, sst);
}
-
+
/**
* 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.
*/
-
+
public byte [] serialize() {
log.log(DEBUG, "Serializing Workbook!");
byte[] retval = null;
-
+
// ArrayList bytes = new ArrayList(records.size());
int arraysize = getSize();
int pos = 0;
-
+
// for (int k = 0; k < records.size(); k++)
// {
// bytes.add((( Record ) records.get(k)).serialize());
// }
retval = new byte[ arraysize ];
for (int k = 0; k < records.size(); k++) {
-
+
// byte[] rec = (( byte [] ) bytes.get(k));
// System.arraycopy(rec, 0, retval, pos, rec.length);
pos += (( Record ) records.get(k)).serialize(pos,
log.log(DEBUG, "Exiting serialize workbook");
return retval;
}
-
+
/**
* 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
*/
-
+
public int serialize(int offset, byte [] data) {
log.log(DEBUG, "Serializing Workbook with offsets");
// arraysize += (( byte [] ) bytes.get(k)).length;
// }
for (int k = 0; k < records.size(); k++) {
-
+
// byte[] rec = (( byte [] ) bytes.get(k));
// System.arraycopy(rec, 0, data, offset + pos, rec.length);
pos += (( Record ) records.get(k)).serialize(pos + offset,
log.log(DEBUG, "Exiting serialize workbook");
return pos;
}
-
+
public int getSize() {
int retval = 0;
-
+
for (int k = 0; k < records.size(); k++) {
retval += (( Record ) records.get(k)).getRecordSize();
}
return retval;
}
-
+
/**
* creates the BOF record
* @see org.apache.poi.hssf.record.BOFRecord
* @see org.apache.poi.hssf.record.Record
* @return record containing a BOFRecord
*/
-
+
protected Record createBOF() {
BOFRecord retval = new BOFRecord();
-
+
retval.setVersion(( short ) 0x600);
retval.setType(( short ) 5);
retval.setBuild(( short ) 0x10d3);
-
+
// retval.setBuild((short)0x0dbb);
retval.setBuildYear(( short ) 1996);
retval.setHistoryBitMask(0x41); // was c1 before verify
retval.setRequiredVersion(0x6);
return retval;
}
-
+
/**
* creates the InterfaceHdr record
* @see org.apache.poi.hssf.record.InterfaceHdrRecord
* @see org.apache.poi.hssf.record.Record
* @return record containing a InterfaceHdrRecord
*/
-
+
protected Record createInterfaceHdr() {
InterfaceHdrRecord retval = new InterfaceHdrRecord();
-
+
retval.setCodepage(CODEPAGE);
return retval;
}
-
+
/**
* creates an MMS record
* @see org.apache.poi.hssf.record.MMSRecord
* @see org.apache.poi.hssf.record.Record
* @return record containing a MMSRecord
*/
-
+
protected Record createMMS() {
MMSRecord retval = new MMSRecord();
-
+
retval.setAddMenuCount(( byte ) 0);
retval.setDelMenuCount(( byte ) 0);
return retval;
}
-
+
/**
* creates the InterfaceEnd record
* @see org.apache.poi.hssf.record.InterfaceEndRecord
* @see org.apache.poi.hssf.record.Record
* @return record containing a InterfaceEndRecord
*/
-
+
protected Record createInterfaceEnd() {
return new InterfaceEndRecord();
}
-
+
/**
* 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
*/
-
+
protected Record createWriteAccess() {
WriteAccessRecord retval = new WriteAccessRecord();
-
+
retval.setUsername(System.getProperty("user.name"));
return retval;
}
-
+
/**
* 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
*/
-
+
protected Record createCodepage() {
CodepageRecord retval = new CodepageRecord();
-
+
retval.setCodepage(CODEPAGE);
return retval;
}
-
+
/**
* 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
*/
-
+
protected Record createDSF() {
DSFRecord retval = new DSFRecord();
-
+
retval.setDsf(
( short ) 0); // we don't even support double stream files
return retval;
}
-
+
/**
* 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.Record
* @return record containing a TabIdRecord
*/
-
+
protected Record createTabId() {
TabIdRecord retval = new TabIdRecord();
short[] tabidarray = {
0
};
-
+
retval.setTabIdArray(tabidarray);
return retval;
}
-
+
/**
* 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
*/
-
+
protected Record createFnGroupCount() {
FnGroupCountRecord retval = new FnGroupCountRecord();
-
+
retval.setCount(( short ) 14);
return retval;
}
-
+
/**
* 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
*/
-
+
protected Record createWindowProtect() {
WindowProtectRecord retval = new WindowProtectRecord();
-
+
retval.setProtect(
false); // by default even when we support it we won't
return retval; // want it to be protected
}
-
+
/**
* 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
*/
-
+
protected Record createProtect() {
ProtectRecord retval = new ProtectRecord();
-
+
retval.setProtect(
false); // by default even when we support it we won't
return retval; // want it to be protected
}
-
+
/**
* 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
*/
-
+
protected Record createPassword() {
PasswordRecord retval = new PasswordRecord();
-
+
retval.setPassword(( short ) 0); // no password by default!
return retval;
}
-
+
/**
* 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
*/
-
+
protected Record createProtectionRev4() {
ProtectionRev4Record retval = new ProtectionRev4Record();
-
+
retval.setProtect(false);
return retval;
}
-
+
/**
* 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
*/
-
+
protected Record createPasswordRev4() {
PasswordRev4Record retval = new PasswordRev4Record();
-
+
retval.setPassword(( short ) 0); // no password by default!
return retval;
}
-
+
/**
* creates the WindowOne record with the following magic values: <P>
* horizontal hold - 0x168 <P>
* @see org.apache.poi.hssf.record.Record
* @return record containing a WindowOneRecord
*/
-
+
protected Record createWindowOne() {
WindowOneRecord retval = new WindowOneRecord();
-
+
retval.setHorizontalHold(( short ) 0x168);
retval.setVerticalHold(( short ) 0x10e);
retval.setWidth(( short ) 0x3a5c);
retval.setTabWidthRatio(( short ) 0x258);
return retval;
}
-
+
/**
* 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
*/
-
+
protected Record createBackup() {
BackupRecord retval = new BackupRecord();
-
+
retval.setBackup(
( short ) 0); // by default DONT save backups of files...just loose data
return retval;
}
-
+
/**
* 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
*/
-
+
protected Record createHideObj() {
HideObjRecord retval = new HideObjRecord();
-
+
retval.setHideObj(( short ) 0); // by default set hide object off
return retval;
}
-
+
/**
* 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
*/
-
+
protected Record createDateWindow1904() {
DateWindow1904Record retval = new DateWindow1904Record();
-
+
retval.setWindowing(
( short ) 0); // don't EVER use 1904 date windowing...tick tock..
return retval;
}
-
+
/**
* 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
*/
-
+
protected Record createPrecision() {
PrecisionRecord retval = new PrecisionRecord();
-
+
retval.setFullPrecision(
true); // always use real numbers in calculations!
return retval;
}
-
+
/**
* 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
*/
-
+
protected Record createRefreshAll() {
RefreshAllRecord retval = new RefreshAllRecord();
-
+
retval.setRefreshAll(false);
return retval;
}
-
+
/**
* 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
*/
-
+
protected Record createBookBool() {
BookBoolRecord retval = new BookBoolRecord();
-
+
retval.setSaveLinkValues(( short ) 0);
return retval;
}
-
+
/**
* creates a Font record with the following magic values: <P>
* fontheight = 0xc8<P>
* @see org.apache.poi.hssf.record.Record
* @return record containing a FontRecord
*/
-
+
protected Record createFont() {
FontRecord retval = new FontRecord();
-
+
retval.setFontHeight(( short ) 0xc8);
retval.setAttributes(( short ) 0x0);
retval.setColorPaletteIndex(( short ) 0x7fff);
retval.setFontName("Arial");
return retval;
}
-
+
/**
* Creates a FormatRecord object
* @param id the number of the format record to create (meaning its position in
* @see org.apache.poi.hssf.record.FormatRecord
* @see org.apache.poi.hssf.record.Record
*/
-
+
protected Record createFormat(int id) { // we'll need multiple editions for
FormatRecord retval = new FormatRecord(); // the differnt formats
-
+
switch (id) {
-
+
case 0 :
retval.setIndexCode(( short ) 5);
retval.setFormatStringLength(( byte ) 0x17);
retval.setFormatString("\"$\"#,##0_);\\(\"$\"#,##0\\)");
break;
-
+
case 1 :
retval.setIndexCode(( short ) 6);
retval.setFormatStringLength(( byte ) 0x1c);
retval.setFormatString("\"$\"#,##0_);[Red]\\(\"$\"#,##0\\)");
break;
-
+
case 2 :
retval.setIndexCode(( short ) 7);
retval.setFormatStringLength(( byte ) 0x1d);
retval.setFormatString("\"$\"#,##0.00_);\\(\"$\"#,##0.00\\)");
break;
-
+
case 3 :
retval.setIndexCode(( short ) 8);
retval.setFormatStringLength(( byte ) 0x22);
retval.setFormatString(
"\"$\"#,##0.00_);[Red]\\(\"$\"#,##0.00\\)");
break;
-
+
case 4 :
retval.setIndexCode(( short ) 0x2a);
retval.setFormatStringLength(( byte ) 0x32);
retval.setFormatString(
"_(\"$\"* #,##0_);_(\"$\"* \\(#,##0\\);_(\"$\"* \"-\"_);_(@_)");
break;
-
+
case 5 :
retval.setIndexCode(( short ) 0x29);
retval.setFormatStringLength(( byte ) 0x29);
retval.setFormatString(
"_(* #,##0_);_(* \\(#,##0\\);_(* \"-\"_);_(@_)");
break;
-
+
case 6 :
retval.setIndexCode(( short ) 0x2c);
retval.setFormatStringLength(( byte ) 0x3a);
retval.setFormatString(
"_(\"$\"* #,##0.00_);_(\"$\"* \\(#,##0.00\\);_(\"$\"* \"-\"??_);_(@_)");
break;
-
+
case 7 :
retval.setIndexCode(( short ) 0x2b);
retval.setFormatStringLength(( byte ) 0x31);
}
return retval;
}
-
+
/**
* Creates an ExtendedFormatRecord object
* @param id the number of the extended format record to create (meaning its position in
* @see org.apache.poi.hssf.record.ExtendedFormatRecord
* @see org.apache.poi.hssf.record.Record
*/
-
+
protected Record createExtendedFormat(int id) { // we'll need multiple editions
ExtendedFormatRecord retval = new ExtendedFormatRecord();
-
+
switch (id) {
-
+
case 0 :
retval.setFontIndex(( short ) 0);
retval.setFormatIndex(( short ) 0);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 1 :
retval.setFontIndex(( short ) 1);
retval.setFormatIndex(( short ) 0);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 2 :
retval.setFontIndex(( short ) 1);
retval.setFormatIndex(( short ) 0);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 3 :
retval.setFontIndex(( short ) 2);
retval.setFormatIndex(( short ) 0);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 4 :
retval.setFontIndex(( short ) 2);
retval.setFormatIndex(( short ) 0);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 5 :
retval.setFontIndex(( short ) 0);
retval.setFormatIndex(( short ) 0);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 6 :
retval.setFontIndex(( short ) 0);
retval.setFormatIndex(( short ) 0);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 7 :
retval.setFontIndex(( short ) 0);
retval.setFormatIndex(( short ) 0);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 8 :
retval.setFontIndex(( short ) 0);
retval.setFormatIndex(( short ) 0);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 9 :
retval.setFontIndex(( short ) 0);
retval.setFormatIndex(( short ) 0);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 10 :
retval.setFontIndex(( short ) 0);
retval.setFormatIndex(( short ) 0);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 11 :
retval.setFontIndex(( short ) 0);
retval.setFormatIndex(( short ) 0);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 12 :
retval.setFontIndex(( short ) 0);
retval.setFormatIndex(( short ) 0);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 13 :
retval.setFontIndex(( short ) 0);
retval.setFormatIndex(( short ) 0);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 14 :
retval.setFontIndex(( short ) 0);
retval.setFormatIndex(( short ) 0);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
// cell records
case 15 :
retval.setFontIndex(( short ) 0);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
// style
case 16 :
retval.setFontIndex(( short ) 1);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 17 :
retval.setFontIndex(( short ) 1);
retval.setFormatIndex(( short ) 0x29);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 18 :
retval.setFontIndex(( short ) 1);
retval.setFormatIndex(( short ) 0x2c);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 19 :
retval.setFontIndex(( short ) 1);
retval.setFormatIndex(( short ) 0x2a);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 20 :
retval.setFontIndex(( short ) 1);
retval.setFormatIndex(( short ) 0x9);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
// unused from this point down
case 21 :
retval.setFontIndex(( short ) 5);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 22 :
retval.setFontIndex(( short ) 6);
retval.setFormatIndex(( short ) 0x0);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 23 :
retval.setFontIndex(( short ) 0);
retval.setFormatIndex(( short ) 0x31);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 24 :
retval.setFontIndex(( short ) 0);
retval.setFormatIndex(( short ) 0x8);
retval.setAdtlPaletteOptions(( short ) 0);
retval.setFillPaletteOptions(( short ) 0x20c0);
break;
-
+
case 25 :
retval.setFontIndex(( short ) 6);
retval.setFormatIndex(( short ) 0x8);
}
return retval;
}
-
+
/**
* creates an default cell type ExtendedFormatRecord object.
* @return ExtendedFormatRecord with intial defaults (cell-type)
*/
-
+
protected ExtendedFormatRecord createExtendedFormat() {
ExtendedFormatRecord retval = new ExtendedFormatRecord();
-
+
retval.setFontIndex(( short ) 0);
retval.setFormatIndex(( short ) 0x0);
retval.setCellOptions(( short ) 0x1);
retval.setRightBorderPaletteIdx(HSSFColor.BLACK.index);
return retval;
}
-
+
/**
* Creates a StyleRecord object
* @param id the number of the style record to create (meaning its position in
* @see org.apache.poi.hssf.record.StyleRecord
* @see org.apache.poi.hssf.record.Record
*/
-
+
protected Record createStyle(int id) { // we'll need multiple editions
StyleRecord retval = new StyleRecord();
-
+
switch (id) {
-
+
case 0 :
retval.setIndex(( short ) 0xffff8010);
retval.setBuiltin(( byte ) 3);
retval.setOutlineStyleLevel(( byte ) 0xffffffff);
break;
-
+
case 1 :
retval.setIndex(( short ) 0xffff8011);
retval.setBuiltin(( byte ) 6);
retval.setOutlineStyleLevel(( byte ) 0xffffffff);
break;
-
+
case 2 :
retval.setIndex(( short ) 0xffff8012);
retval.setBuiltin(( byte ) 4);
retval.setOutlineStyleLevel(( byte ) 0xffffffff);
break;
-
+
case 3 :
retval.setIndex(( short ) 0xffff8013);
retval.setBuiltin(( byte ) 7);
retval.setOutlineStyleLevel(( byte ) 0xffffffff);
break;
-
+
case 4 :
retval.setIndex(( short ) 0xffff8000);
retval.setBuiltin(( byte ) 0);
retval.setOutlineStyleLevel(( byte ) 0xffffffff);
break;
-
+
case 5 :
retval.setIndex(( short ) 0xffff8014);
retval.setBuiltin(( byte ) 5);
}
return retval;
}
-
+
/**
* 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
*/
-
+
protected Record createUseSelFS() {
UseSelFSRecord retval = new UseSelFSRecord();
-
+
retval.setFlag(( short ) 0);
return retval;
}
-
+
/**
* 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.
* @see org.apache.poi.hssf.record.BoundSheetRecord
* @see org.apache.poi.hssf.record.Record
*/
-
+
protected Record createBoundSheet(int id) { // 1,2,3 sheets
BoundSheetRecord retval = new BoundSheetRecord();
-
+
switch (id) {
-
+
case 0 :
retval.setPositionOfBof(0x0); // should be set later
retval.setOptionFlags(( short ) 0);
retval.setCompressedUnicodeFlag(( byte ) 0);
retval.setSheetname("Sheet1");
break;
-
+
case 1 :
retval.setPositionOfBof(0x0); // should be set later
retval.setOptionFlags(( short ) 0);
retval.setCompressedUnicodeFlag(( byte ) 0);
retval.setSheetname("Sheet2");
break;
-
+
case 2 :
retval.setPositionOfBof(0x0); // should be set later
retval.setOptionFlags(( short ) 0);
}
return retval;
}
-
+
/**
* 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
* @see org.apache.poi.hssf.record.CountryRecord
* @see org.apache.poi.hssf.record.Record
*/
-
+
protected Record createCountry() { // what a novel idea, create your own!
CountryRecord retval = new CountryRecord();
-
+
retval.setDefaultCountry(( short ) 1);
-
+
// from Russia with love ;)
if ( Locale.getDefault().toString().equals( "ru_RU" ) ) {
retval.setCurrentCountry(( short ) 7);
else {
retval.setCurrentCountry(( short ) 1);
}
-
+
return retval;
}
-
+
/**
* 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
*/
-
+
protected Record createSST() {
return new SSTRecord();
}
-
+
/**
* 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
* @see org.apache.poi.hssf.record.ExtSSTRecord
* @see org.apache.poi.hssf.record.Record
*/
-
+
protected Record createExtendedSST() {
ExtSSTRecord retval = new ExtSSTRecord();
-
+
retval.setNumStringsPerBucket(( short ) 0x8);
return retval;
}
-
+
/**
* creates the EOF record
* @see org.apache.poi.hssf.record.EOFRecord
* @see org.apache.poi.hssf.record.Record
* @return record containing a EOFRecord
*/
-
+
protected Record createEOF() {
return new EOFRecord();
}
}
return refs;
}
-
+
/** fins the sheet name by his extern sheet index
* @param num extern sheet index
* @return sheet name
*/
public String findSheetNameFromExternSheet(short num){
String result;
-
+
short indexToSheet = externSheet.getREFRecordAt(num).getIndexToFirstSupBook();
result = getSheetName(indexToSheet);
-
+
return result;
}
-
+
/** 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){
-
+
int i = 0;
boolean flag = false;
short result = 0;
-
+
if (externSheet == null) {
externSheet = createExternSheet();
}
-
+
//Trying to find reference to this sheet
while (i < externSheet.getNumOfREFStructures() && !flag){
ExternSheetSubRecord record = externSheet.getREFRecordAt(i);
-
+
if (record.getIndexToFirstSupBook() == sheetNumber &&
record.getIndexToLastSupBook() == sheetNumber){
flag = true;
result = (short) i;
}
-
+
++i;
}
-
+
//We Havent found reference to this sheet
if (!flag) {
result = addSheetIndexToExternSheet((short) sheetNumber);
}
-
+
return result;
}
-
+
private short addSheetIndexToExternSheet(short sheetNumber){
short result;
-
+
ExternSheetSubRecord record = new ExternSheetSubRecord();
record.setIndexToFirstSupBook(sheetNumber);
record.setIndexToLastSupBook(sheetNumber);
externSheet.addREFRecord(record);
externSheet.setNumOfREFStructures((short)(externSheet.getNumOfREFStructures() + 1));
result = (short)(externSheet.getNumOfREFStructures() - 1);
-
+
return result;
}
-
-
-
+
+
+
/** gets the total number of names
* @return number of names
*/
public int getNumNames(){
int result = names.size();
-
+
return result;
}
-
+
/** gets the name record
* @param index name index
* @return name record
*/
public NameRecord getNameRecord(int index){
NameRecord result = (NameRecord) names.get(index);
-
+
return result;
-
+
}
-
+
/** creates new name
* @return new name record
*/
public NameRecord createName(){
-
+
NameRecord name = new NameRecord();
-
+
records.add(++namepos, name);
names.add(name);
-
+
return name;
}
-
+
/** removes the name
* @param namenum name index
*/
namepos--;
names.remove(namenum);
}
-
+
}
-
+
/** creates a new extern sheet record
* @return the new extern sheet record
*/
protected ExternSheetRecord createExternSheet(){
ExternSheetRecord rec = new ExternSheetRecord();
-
+
records.add(supbookpos + 1 , rec);
-
+
//We also adds the supBook for internal reference
SupBookRecord supbook = new SupBookRecord();
-
+
supbook.setNumberOfSheets((short)getNumSheets());
//supbook.setFlag();
-
+
records.add(supbookpos + 1 , supbook);
-
+
return rec;
}
-
-
+
+
/**
* Returns the first occurance of a record matching a particular sid.
*/
-
+
public Record findFirstRecordBySid(short sid) {
for (Iterator iterator = records.iterator(); iterator.hasNext(); ) {
Record record = ( Record ) iterator.next();
-
+
if (record.getSid() == sid) {
return record;
}
public abstract int serialize(int offset, byte [] data);
/**
- * gives the current serialized size of the record.
+ * gives the current serialized size of the record. Should include the sid and reclength (4 bytes).
*/
public int getRecordSize()
{
private static int NUM_RECORDS = 10000;
private static final Class[] records;
-
+
static {
if (FormulaRecord.EXPERIMENTAL_FORMULA_SUPPORT_ENABLED) {
records = new Class[]
LabelRecord.class, BlankRecord.class, ColumnInfoRecord.class,
MulRKRecord.class, MulBlankRecord.class, MergeCellsRecord.class,
FormulaRecord.class, BoolErrRecord.class, ExternSheetRecord.class,
- NameRecord.class, LeftMarginRecord.class, RightMarginRecord.class,
- TopMarginRecord.class, BottomMarginRecord.class,
- PaletteRecord.class
+ NameRecord.class, LeftMarginRecord.class, RightMarginRecord.class,
+ TopMarginRecord.class, BottomMarginRecord.class,
+ PaletteRecord.class, StringRecord.class
};
} else {
records = new Class[]
LabelRecord.class, BlankRecord.class, ColumnInfoRecord.class,
MulRKRecord.class, MulBlankRecord.class, MergeCellsRecord.class,
BoolErrRecord.class, ExternSheetRecord.class, NameRecord.class,
- LeftMarginRecord.class, RightMarginRecord.class,
- TopMarginRecord.class, BottomMarginRecord.class,
- PaletteRecord.class
+ LeftMarginRecord.class, RightMarginRecord.class,
+ TopMarginRecord.class, BottomMarginRecord.class,
+ PaletteRecord.class, StringRecord.class
};
-
+
}
}
private static Map recordsMap = recordsToMap(records);
--- /dev/null
+/* ====================================================================
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2002 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Apache" and "Apache Software Foundation" and
+ * "Apache POI" must not be used to endorse or promote products
+ * derived from this software without prior written permission. For
+ * written permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * "Apache POI", nor may "Apache" appear in their name, without
+ * prior written permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package org.apache.poi.hssf.record;
+
+import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.StringUtil;
+
+/**
+ * Supports the STRING record structure.
+ *
+ * @author Glen Stampoultzis (glens at apache.org)
+ */
+public class StringRecord
+ extends Record
+{
+ public final static short sid = 0x207;
+ private int field_1_string_length;
+ private byte field_2_unicode_flag;
+ private String field_3_string;
+
+
+ public StringRecord()
+ {
+ }
+
+ /**
+ * Constructs a String record and sets its fields appropriately.
+ *
+ * @param id id must be 0x204 or an exception will be throw upon validation
+ * @param size the size of the data area of the record
+ * @param data data of the record (should not contain sid/len)
+ */
+ public StringRecord( short id, short size, byte[] data )
+ {
+ super( id, size, data );
+ }
+
+ /**
+ * Constructs an String record and sets its fields appropriately.
+ *
+ * @param id id must be 0x204 or an exception will be throw upon validation
+ * @param size the size of the data area of the record
+ * @param data data of the record (should not contain sid/len)
+ * @param offset of the record
+ */
+ public StringRecord( short id, short size, byte[] data, int offset )
+ {
+ super( id, size, data, offset );
+ }
+
+
+ /**
+ * Throw a runtime exception in the event of a
+ * record passed with a differing ID.
+ *
+ * @param id alleged id for this record
+ */
+ protected void validateSid( short id )
+ {
+ if (id != this.sid)
+ {
+ throw new RecordFormatException("Not a valid StringRecord");
+ }
+ }
+
+ /**
+ * called by the constructor, should set class level fields. Should throw
+ * runtime exception for bad/icomplete data.
+ *
+ * @param data raw data
+ * @param size size of data
+ * @param offset of the record's data (provided a big array of the file)
+ */
+
+ protected void fillFields( byte[] data, short size, int offset )
+ {
+ field_1_string_length = LittleEndian.getUShort(data, 0 + offset);
+ field_2_unicode_flag = data[ 2 + offset ];
+ if (isUnCompressedUnicode())
+ {
+ field_3_string = StringUtil.getFromUnicode(data, 3 + offset, field_1_string_length );
+ }
+ else
+ {
+ field_3_string = new String(data, 3 + offset, getStringLength());
+ }
+ }
+
+ private int getStringLength()
+ {
+ return field_1_string_length;
+ }
+
+ private int getStringByteLength()
+ {
+ return isUnCompressedUnicode() ? field_1_string_length * 2 : field_1_string_length;
+ }
+
+ /**
+ * gives the current serialized size of the record. Should include the sid and reclength (4 bytes).
+ */
+ public int getRecordSize()
+ {
+ return 4 + 2 + 1 + getStringByteLength();
+ }
+
+
+ /**
+ * is this uncompressed unicode (16bit)? Or just 8-bit compressed?
+ * @return isUnicode - True for 16bit- false for 8bit
+ */
+ public boolean isUnCompressedUnicode()
+ {
+ return (field_2_unicode_flag == 1);
+ }
+
+ /**
+ * called by the class that is responsible for writing this sucker.
+ * Subclasses should implement this so that their data is passed back in a
+ * byte array.
+ *
+ * @param offset to begin writing at
+ * @param data byte array containing instance data
+ * @return number of bytes written
+ */
+ public int serialize( int offset, byte[] data )
+ {
+ LittleEndian.putShort(data, 0 + offset, sid);
+ LittleEndian.putShort(data, 2 + offset, ( short ) (2 + getStringByteLength()));
+ LittleEndian.putUShort(data, 4 + offset, field_1_string_length);
+ data[6 + offset] = field_2_unicode_flag;
+ if (isUnCompressedUnicode())
+ {
+ StringUtil.putUncompressedUnicode(field_3_string, data, 7 + offset);
+ }
+ else
+ {
+ StringUtil.putCompressedUnicode(field_3_string, data, 7 + offset);
+ }
+ return getRecordSize();
+ }
+
+ /**
+ * return the non static version of the id for this record.
+ */
+ public short getSid()
+ {
+ return sid;
+ }
+
+ /**
+ * @return The string represented by this record.
+ */
+ public String getString()
+ {
+ return field_3_string;
+ }
+
+ /**
+ * Sets whether the string is compressed or not
+ * @param unicode_flag 1 = uncompressed, 0 = compressed
+ */
+ public void setCompressedFlag( byte unicode_flag )
+ {
+ this.field_2_unicode_flag = unicode_flag;
+ }
+
+ /**
+ * Sets the string represented by this record.
+ */
+ public void setString( String string )
+ {
+ this.field_1_string_length = string.length();
+ this.field_3_string = string;
+ }
+
+
+
+ public String toString()
+ {
+ StringBuffer buffer = new StringBuffer();
+
+ buffer.append("[STRING]\n");
+ buffer.append(" .string = ")
+ .append(field_3_string).append("\n");
+ buffer.append("[/STRING]\n");
+ return buffer.toString();
+ }
+
+}
--- /dev/null
+
+/* ====================================================================
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2002 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Apache" and "Apache Software Foundation" and
+ * "Apache POI" must not be used to endorse or promote products
+ * derived from this software without prior written permission. For
+ * written permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * "Apache POI", nor may "Apache" appear in their name, without
+ * prior written permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+
+package org.apache.poi.hssf.record;
+
+
+import junit.framework.TestCase;
+
+/**
+ * Tests the serialization and deserialization of the StringRecord
+ * class works correctly. Test data taken directly from a real
+ * Excel file.
+ *
+ * @author Glen Stampoultzis (glens at apache.org)
+ */
+public class TestStringRecord
+ extends TestCase
+{
+ byte[] data = new byte[] {
+ (byte)0x0B,(byte)0x00, // length
+ (byte)0x00, // option
+ // string
+ (byte)0x46,(byte)0x61,(byte)0x68,(byte)0x72,(byte)0x7A,(byte)0x65,(byte)0x75,(byte)0x67,(byte)0x74,(byte)0x79,(byte)0x70
+ };
+
+ public TestStringRecord(String name)
+ {
+ super(name);
+ }
+
+ public void testLoad()
+ throws Exception
+ {
+
+ StringRecord record = new StringRecord((short)0x207, (short)data.length, data);
+ assertEquals( "Fahrzeugtyp", record.getString());
+
+ assertEquals( 18, record.getRecordSize() );
+
+ record.validateSid((short)0x207);
+ }
+
+ public void testStore()
+ {
+ StringRecord record = new StringRecord();
+ record.setString("Fahrzeugtyp");
+
+ byte [] recordBytes = record.serialize();
+ assertEquals(recordBytes.length - 4, data.length);
+ for (int i = 0; i < data.length; i++)
+ assertEquals("At offset " + i, data[i], recordBytes[i+4]);
+ }
+}