String record added

git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@352815 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Glen Stampoultzis 2002-07-29 13:25:46 +00:00
parent bcf6cea52c
commit 4d7e207efd
6 changed files with 783 additions and 425 deletions

View File

@ -74,7 +74,6 @@ import java.util.ArrayList;
* *
*@author Andrew C. Oliver (acoliver at apache dot org) *@author Andrew C. Oliver (acoliver at apache dot org)
*@author Glen Stampoultzis (glens at apache.org) *@author Glen Stampoultzis (glens at apache.org)
*@created May 10, 2002
*@see #main *@see #main
*/ */
@ -256,23 +255,27 @@ public class BiffViewer {
*@param data Description of the Parameter *@param data Description of the Parameter
*@exception IOException Description of the Exception *@exception IOException Description of the Exception
*/ */
private static void dump(short rectype, short recsize, byte[] data) throws IOException { private static void dump( short rectype, short recsize, byte[] data ) throws IOException
// System.out {
// .println("fixing to recordize the following"); // System.out
System.out.print("rectype = 0x" // .println("fixing to recordize the following");
+ Integer.toHexString(rectype)); System.out.print( "rectype = 0x"
System.out.println(", recsize = 0x" + Integer.toHexString( rectype ) );
+ Integer.toHexString(recsize)); System.out.println( ", recsize = 0x"
+ Integer.toHexString( recsize ) );
System.out.println( System.out.println(
"-BEGIN DUMP---------------------------------"); "-BEGIN DUMP---------------------------------" );
if (data.length > 0) { if ( data.length > 0 )
HexDump.dump(data, 0, System.out, 0); {
} else { HexDump.dump( data, 0, System.out, 0 );
System.out.println("**NO RECORD DATA**");
} }
// System.out.println(); else
{
System.out.println( "**NO RECORD DATA**" );
}
// System.out.println();
System.out.println( System.out.println(
"-END DUMP-----------------------------------"); "-END DUMP-----------------------------------" );
} }
@ -286,353 +289,361 @@ public class BiffViewer {
*@return Description of the Return Value *@return Description of the Return Value
*/ */
private static Record[] createRecord(short rectype, short size, private static Record[] createRecord( short rectype, short size,
byte[] data) { byte[] data )
{
Record retval = null; Record retval = null;
Record[] realretval = null; Record[] realretval = null;
// int irectype = rectype; // int irectype = rectype;
switch (rectype) { switch ( rectype )
{
case ChartRecord.sid: case ChartRecord.sid:
retval = new ChartRecord(rectype, size, data); retval = new ChartRecord( rectype, size, data );
break; break;
case ChartFormatRecord.sid: case ChartFormatRecord.sid:
retval = new ChartFormatRecord(rectype, size, data); retval = new ChartFormatRecord( rectype, size, data );
break; break;
case SeriesRecord.sid: case SeriesRecord.sid:
retval = new SeriesRecord(rectype, size, data); retval = new SeriesRecord( rectype, size, data );
break; break;
case BeginRecord.sid: case BeginRecord.sid:
retval = new BeginRecord(rectype, size, data); retval = new BeginRecord( rectype, size, data );
break; break;
case EndRecord.sid: case EndRecord.sid:
retval = new EndRecord(rectype, size, data); retval = new EndRecord( rectype, size, data );
break; break;
case BOFRecord.sid: case BOFRecord.sid:
retval = new BOFRecord(rectype, size, data); retval = new BOFRecord( rectype, size, data );
break; break;
case InterfaceHdrRecord.sid: case InterfaceHdrRecord.sid:
retval = new InterfaceHdrRecord(rectype, size, data); retval = new InterfaceHdrRecord( rectype, size, data );
break; break;
case MMSRecord.sid: case MMSRecord.sid:
retval = new MMSRecord(rectype, size, data); retval = new MMSRecord( rectype, size, data );
break; break;
case InterfaceEndRecord.sid: case InterfaceEndRecord.sid:
retval = new InterfaceEndRecord(rectype, size, data); retval = new InterfaceEndRecord( rectype, size, data );
break; break;
case WriteAccessRecord.sid: case WriteAccessRecord.sid:
retval = new WriteAccessRecord(rectype, size, data); retval = new WriteAccessRecord( rectype, size, data );
break; break;
case CodepageRecord.sid: case CodepageRecord.sid:
retval = new CodepageRecord(rectype, size, data); retval = new CodepageRecord( rectype, size, data );
break; break;
case DSFRecord.sid: case DSFRecord.sid:
retval = new DSFRecord(rectype, size, data); retval = new DSFRecord( rectype, size, data );
break; break;
case TabIdRecord.sid: case TabIdRecord.sid:
retval = new TabIdRecord(rectype, size, data); retval = new TabIdRecord( rectype, size, data );
break; break;
case FnGroupCountRecord.sid: case FnGroupCountRecord.sid:
retval = new FnGroupCountRecord(rectype, size, data); retval = new FnGroupCountRecord( rectype, size, data );
break; break;
case WindowProtectRecord.sid: case WindowProtectRecord.sid:
retval = new WindowProtectRecord(rectype, size, data); retval = new WindowProtectRecord( rectype, size, data );
break; break;
case ProtectRecord.sid: case ProtectRecord.sid:
retval = new ProtectRecord(rectype, size, data); retval = new ProtectRecord( rectype, size, data );
break; break;
case PasswordRecord.sid: case PasswordRecord.sid:
retval = new PasswordRecord(rectype, size, data); retval = new PasswordRecord( rectype, size, data );
break; break;
case ProtectionRev4Record.sid: case ProtectionRev4Record.sid:
retval = new ProtectionRev4Record(rectype, size, data); retval = new ProtectionRev4Record( rectype, size, data );
break; break;
case PasswordRev4Record.sid: case PasswordRev4Record.sid:
retval = new PasswordRev4Record(rectype, size, data); retval = new PasswordRev4Record( rectype, size, data );
break; break;
case WindowOneRecord.sid: case WindowOneRecord.sid:
retval = new WindowOneRecord(rectype, size, data); retval = new WindowOneRecord( rectype, size, data );
break; break;
case BackupRecord.sid: case BackupRecord.sid:
retval = new BackupRecord(rectype, size, data); retval = new BackupRecord( rectype, size, data );
break; break;
case HideObjRecord.sid: case HideObjRecord.sid:
retval = new HideObjRecord(rectype, size, data); retval = new HideObjRecord( rectype, size, data );
break; break;
case DateWindow1904Record.sid: case DateWindow1904Record.sid:
retval = new DateWindow1904Record(rectype, size, data); retval = new DateWindow1904Record( rectype, size, data );
break; break;
case PrecisionRecord.sid: case PrecisionRecord.sid:
retval = new PrecisionRecord(rectype, size, data); retval = new PrecisionRecord( rectype, size, data );
break; break;
case RefreshAllRecord.sid: case RefreshAllRecord.sid:
retval = new RefreshAllRecord(rectype, size, data); retval = new RefreshAllRecord( rectype, size, data );
break; break;
case BookBoolRecord.sid: case BookBoolRecord.sid:
retval = new BookBoolRecord(rectype, size, data); retval = new BookBoolRecord( rectype, size, data );
break; break;
case FontRecord.sid: case FontRecord.sid:
retval = new FontRecord(rectype, size, data); retval = new FontRecord( rectype, size, data );
break; break;
case FormatRecord.sid: case FormatRecord.sid:
retval = new FormatRecord(rectype, size, data); retval = new FormatRecord( rectype, size, data );
break; break;
case ExtendedFormatRecord.sid: case ExtendedFormatRecord.sid:
retval = new ExtendedFormatRecord(rectype, size, data); retval = new ExtendedFormatRecord( rectype, size, data );
break; break;
case StyleRecord.sid: case StyleRecord.sid:
retval = new StyleRecord(rectype, size, data); retval = new StyleRecord( rectype, size, data );
break; break;
case UseSelFSRecord.sid: case UseSelFSRecord.sid:
retval = new UseSelFSRecord(rectype, size, data); retval = new UseSelFSRecord( rectype, size, data );
break; break;
case BoundSheetRecord.sid: case BoundSheetRecord.sid:
retval = new BoundSheetRecord(rectype, size, data); retval = new BoundSheetRecord( rectype, size, data );
break; break;
case CountryRecord.sid: case CountryRecord.sid:
retval = new CountryRecord(rectype, size, data); retval = new CountryRecord( rectype, size, data );
break; break;
case SSTRecord.sid: case SSTRecord.sid:
retval = new SSTRecord(rectype, size, data); retval = new SSTRecord( rectype, size, data );
break; break;
case ExtSSTRecord.sid: case ExtSSTRecord.sid:
retval = new ExtSSTRecord(rectype, size, data); retval = new ExtSSTRecord( rectype, size, data );
break; break;
case EOFRecord.sid: case EOFRecord.sid:
retval = new EOFRecord(rectype, size, data); retval = new EOFRecord( rectype, size, data );
break; break;
case IndexRecord.sid: case IndexRecord.sid:
retval = new IndexRecord(rectype, size, data); retval = new IndexRecord( rectype, size, data );
break; break;
case CalcModeRecord.sid: case CalcModeRecord.sid:
retval = new CalcModeRecord(rectype, size, data); retval = new CalcModeRecord( rectype, size, data );
break; break;
case CalcCountRecord.sid: case CalcCountRecord.sid:
retval = new CalcCountRecord(rectype, size, data); retval = new CalcCountRecord( rectype, size, data );
break; break;
case RefModeRecord.sid: case RefModeRecord.sid:
retval = new RefModeRecord(rectype, size, data); retval = new RefModeRecord( rectype, size, data );
break; break;
case IterationRecord.sid: case IterationRecord.sid:
retval = new IterationRecord(rectype, size, data); retval = new IterationRecord( rectype, size, data );
break; break;
case DeltaRecord.sid: case DeltaRecord.sid:
retval = new DeltaRecord(rectype, size, data); retval = new DeltaRecord( rectype, size, data );
break; break;
case SaveRecalcRecord.sid: case SaveRecalcRecord.sid:
retval = new SaveRecalcRecord(rectype, size, data); retval = new SaveRecalcRecord( rectype, size, data );
break; break;
case PrintHeadersRecord.sid: case PrintHeadersRecord.sid:
retval = new PrintHeadersRecord(rectype, size, data); retval = new PrintHeadersRecord( rectype, size, data );
break; break;
case PrintGridlinesRecord.sid: case PrintGridlinesRecord.sid:
retval = new PrintGridlinesRecord(rectype, size, data); retval = new PrintGridlinesRecord( rectype, size, data );
break; break;
case GridsetRecord.sid: case GridsetRecord.sid:
retval = new GridsetRecord(rectype, size, data); retval = new GridsetRecord( rectype, size, data );
break; break;
case GutsRecord.sid: case GutsRecord.sid:
retval = new GutsRecord(rectype, size, data); retval = new GutsRecord( rectype, size, data );
break; break;
case DefaultRowHeightRecord.sid: case DefaultRowHeightRecord.sid:
retval = new DefaultRowHeightRecord(rectype, size, data); retval = new DefaultRowHeightRecord( rectype, size, data );
break; break;
case WSBoolRecord.sid: case WSBoolRecord.sid:
retval = new WSBoolRecord(rectype, size, data); retval = new WSBoolRecord( rectype, size, data );
break; break;
case HeaderRecord.sid: case HeaderRecord.sid:
retval = new HeaderRecord(rectype, size, data); retval = new HeaderRecord( rectype, size, data );
break; break;
case FooterRecord.sid: case FooterRecord.sid:
retval = new FooterRecord(rectype, size, data); retval = new FooterRecord( rectype, size, data );
break; break;
case HCenterRecord.sid: case HCenterRecord.sid:
retval = new HCenterRecord(rectype, size, data); retval = new HCenterRecord( rectype, size, data );
break; break;
case VCenterRecord.sid: case VCenterRecord.sid:
retval = new VCenterRecord(rectype, size, data); retval = new VCenterRecord( rectype, size, data );
break; break;
case PrintSetupRecord.sid: case PrintSetupRecord.sid:
retval = new PrintSetupRecord(rectype, size, data); retval = new PrintSetupRecord( rectype, size, data );
break; break;
case DefaultColWidthRecord.sid: case DefaultColWidthRecord.sid:
retval = new DefaultColWidthRecord(rectype, size, data); retval = new DefaultColWidthRecord( rectype, size, data );
break; break;
case DimensionsRecord.sid: case DimensionsRecord.sid:
retval = new DimensionsRecord(rectype, size, data); retval = new DimensionsRecord( rectype, size, data );
break; break;
case RowRecord.sid: case RowRecord.sid:
retval = new RowRecord(rectype, size, data); retval = new RowRecord( rectype, size, data );
break; break;
case LabelSSTRecord.sid: case LabelSSTRecord.sid:
retval = new LabelSSTRecord(rectype, size, data); retval = new LabelSSTRecord( rectype, size, data );
break; break;
case RKRecord.sid: case RKRecord.sid:
retval = new RKRecord(rectype, size, data); retval = new RKRecord( rectype, size, data );
break; break;
case NumberRecord.sid: case NumberRecord.sid:
retval = new NumberRecord(rectype, size, data); retval = new NumberRecord( rectype, size, data );
break; break;
case DBCellRecord.sid: case DBCellRecord.sid:
retval = new DBCellRecord(rectype, size, data); retval = new DBCellRecord( rectype, size, data );
break; break;
case WindowTwoRecord.sid: case WindowTwoRecord.sid:
retval = new WindowTwoRecord(rectype, size, data); retval = new WindowTwoRecord( rectype, size, data );
break; break;
case SelectionRecord.sid: case SelectionRecord.sid:
retval = new SelectionRecord(rectype, size, data); retval = new SelectionRecord( rectype, size, data );
break; break;
case ContinueRecord.sid: case ContinueRecord.sid:
retval = new ContinueRecord(rectype, size, data); retval = new ContinueRecord( rectype, size, data );
break; break;
case LabelRecord.sid: case LabelRecord.sid:
retval = new LabelRecord(rectype, size, data); retval = new LabelRecord( rectype, size, data );
break; break;
case MulRKRecord.sid: case MulRKRecord.sid:
retval = new MulRKRecord(rectype, size, data); retval = new MulRKRecord( rectype, size, data );
break; break;
case MulBlankRecord.sid: case MulBlankRecord.sid:
retval = new MulBlankRecord(rectype, size, data); retval = new MulBlankRecord( rectype, size, data );
break; break;
case BlankRecord.sid: case BlankRecord.sid:
retval = new BlankRecord(rectype, size, data); retval = new BlankRecord( rectype, size, data );
break; break;
case BoolErrRecord.sid: case BoolErrRecord.sid:
retval = new BoolErrRecord(rectype, size, data); retval = new BoolErrRecord( rectype, size, data );
break; break;
case ColumnInfoRecord.sid: case ColumnInfoRecord.sid:
retval = new ColumnInfoRecord(rectype, size, data); retval = new ColumnInfoRecord( rectype, size, data );
break; break;
case MergeCellsRecord.sid: case MergeCellsRecord.sid:
retval = new MergeCellsRecord(rectype, size, data); retval = new MergeCellsRecord( rectype, size, data );
break; break;
case AreaRecord.sid: case AreaRecord.sid:
retval = new AreaRecord(rectype, size, data); retval = new AreaRecord( rectype, size, data );
break; break;
case DataFormatRecord.sid: case DataFormatRecord.sid:
retval = new DataFormatRecord(rectype, size, data); retval = new DataFormatRecord( rectype, size, data );
break; break;
case BarRecord.sid: case BarRecord.sid:
retval = new BarRecord(rectype, size, data); retval = new BarRecord( rectype, size, data );
break; break;
case DatRecord.sid: case DatRecord.sid:
retval = new DatRecord(rectype, size, data); retval = new DatRecord( rectype, size, data );
break; break;
case PlotGrowthRecord.sid: case PlotGrowthRecord.sid:
retval = new PlotGrowthRecord(rectype, size, data); retval = new PlotGrowthRecord( rectype, size, data );
break; break;
case UnitsRecord.sid: case UnitsRecord.sid:
retval = new UnitsRecord(rectype, size, data); retval = new UnitsRecord( rectype, size, data );
break; break;
case FrameRecord.sid: case FrameRecord.sid:
retval = new FrameRecord(rectype, size, data); retval = new FrameRecord( rectype, size, data );
break; break;
case ValueRangeRecord.sid: case ValueRangeRecord.sid:
retval = new ValueRangeRecord(rectype, size, data); retval = new ValueRangeRecord( rectype, size, data );
break; break;
case SeriesListRecord.sid: case SeriesListRecord.sid:
retval = new SeriesListRecord(rectype, size, data); retval = new SeriesListRecord( rectype, size, data );
break; break;
case FontBasisRecord.sid: case FontBasisRecord.sid:
retval = new FontBasisRecord(rectype, size, data); retval = new FontBasisRecord( rectype, size, data );
break; break;
case FontIndexRecord.sid: case FontIndexRecord.sid:
retval = new FontIndexRecord(rectype, size, data); retval = new FontIndexRecord( rectype, size, data );
break; break;
case LineFormatRecord.sid: case LineFormatRecord.sid:
retval = new LineFormatRecord(rectype, size, data); retval = new LineFormatRecord( rectype, size, data );
break; break;
case AreaFormatRecord.sid: case AreaFormatRecord.sid:
retval = new AreaFormatRecord(rectype, size, data); retval = new AreaFormatRecord( rectype, size, data );
break; break;
case LinkedDataRecord.sid: case LinkedDataRecord.sid:
retval = new LinkedDataRecord(rectype, size, data); retval = new LinkedDataRecord( rectype, size, data );
break; break;
case FormulaRecord.sid: case FormulaRecord.sid:
retval = new FormulaRecord(rectype, size, data); retval = new FormulaRecord( rectype, size, data );
break; break;
case SheetPropertiesRecord.sid: case SheetPropertiesRecord.sid:
retval = new SheetPropertiesRecord(rectype, size, data); retval = new SheetPropertiesRecord( rectype, size, data );
break; break;
case DefaultDataLabelTextPropertiesRecord.sid: case DefaultDataLabelTextPropertiesRecord.sid:
retval = new DefaultDataLabelTextPropertiesRecord(rectype, size, data); retval = new DefaultDataLabelTextPropertiesRecord( rectype, size, data );
break; break;
case TextRecord.sid: case TextRecord.sid:
retval = new TextRecord(rectype, size, data); retval = new TextRecord( rectype, size, data );
break; break;
case AxisParentRecord.sid: case AxisParentRecord.sid:
retval = new AxisParentRecord(rectype, size, data); retval = new AxisParentRecord( rectype, size, data );
break; break;
case AxisLineFormatRecord.sid: case AxisLineFormatRecord.sid:
retval = new AxisLineFormatRecord(rectype, size, data); retval = new AxisLineFormatRecord( rectype, size, data );
break; break;
case SupBookRecord.sid: case SupBookRecord.sid:
retval = new SupBookRecord(rectype, size, data); retval = new SupBookRecord( rectype, size, data );
break; break;
case ExternSheetRecord.sid: case ExternSheetRecord.sid:
retval = new ExternSheetRecord(rectype, size, data); retval = new ExternSheetRecord( rectype, size, data );
break; break;
case SCLRecord.sid: case SCLRecord.sid:
retval = new SCLRecord(rectype, size, data); retval = new SCLRecord( rectype, size, data );
break; break;
case SeriesToChartGroupRecord.sid: case SeriesToChartGroupRecord.sid:
retval = new SeriesToChartGroupRecord(rectype, size, data); retval = new SeriesToChartGroupRecord( rectype, size, data );
break; break;
case AxisUsedRecord.sid: case AxisUsedRecord.sid:
retval = new AxisUsedRecord(rectype, size, data); retval = new AxisUsedRecord( rectype, size, data );
break; break;
case AxisRecord.sid: case AxisRecord.sid:
retval = new AxisRecord(rectype, size, data); retval = new AxisRecord( rectype, size, data );
break; break;
case CategorySeriesAxisRecord.sid: case CategorySeriesAxisRecord.sid:
retval = new CategorySeriesAxisRecord(rectype, size, data); retval = new CategorySeriesAxisRecord( rectype, size, data );
break; break;
case AxisOptionsRecord.sid: case AxisOptionsRecord.sid:
retval = new AxisOptionsRecord(rectype, size, data); retval = new AxisOptionsRecord( rectype, size, data );
break; break;
case TickRecord.sid: case TickRecord.sid:
retval = new TickRecord(rectype, size, data); retval = new TickRecord( rectype, size, data );
break; break;
case SeriesTextRecord.sid: case SeriesTextRecord.sid:
retval = new SeriesTextRecord(rectype, size, data); retval = new SeriesTextRecord( rectype, size, data );
break; break;
case ObjectLinkRecord.sid: case ObjectLinkRecord.sid:
retval = new ObjectLinkRecord(rectype, size, data); retval = new ObjectLinkRecord( rectype, size, data );
break; break;
case PlotAreaRecord.sid: case PlotAreaRecord.sid:
retval = new PlotAreaRecord(rectype, size, data); retval = new PlotAreaRecord( rectype, size, data );
break; break;
case SeriesIndexRecord.sid: case SeriesIndexRecord.sid:
retval = new SeriesIndexRecord(rectype, size, data); retval = new SeriesIndexRecord( rectype, size, data );
break; break;
case LegendRecord.sid: case LegendRecord.sid:
retval = new LegendRecord(rectype, size, data); 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; 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;
default: default:
retval = new UnknownRecord(rectype, size, data); retval = new UnknownRecord( rectype, size, data );
} }
if (realretval == null) { if ( realretval == null )
{
realretval = new Record[1]; realretval = new Record[1];
realretval[0] = retval; realretval[0] = retval;
System.out.println("recordid = 0x" + Integer.toHexString(rectype) + ", size =" + size); System.out.println( "recordid = 0x" + Integer.toHexString( rectype ) + ", size =" + size );
System.out.println(realretval[0].toString()); System.out.println( realretval[0].toString() );
} }
return realretval; return realretval;
} }

File diff suppressed because it is too large Load Diff

View File

@ -182,7 +182,7 @@ public abstract class Record
public abstract int serialize(int offset, byte [] data); 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() public int getRecordSize()

View File

@ -78,7 +78,7 @@ public class RecordFactory
{ {
private static int NUM_RECORDS = 10000; private static int NUM_RECORDS = 10000;
private static final Class[] records; private static final Class[] records;
static { static {
if (FormulaRecord.EXPERIMENTAL_FORMULA_SUPPORT_ENABLED) { if (FormulaRecord.EXPERIMENTAL_FORMULA_SUPPORT_ENABLED) {
records = new Class[] records = new Class[]
@ -107,9 +107,9 @@ public class RecordFactory
LabelRecord.class, BlankRecord.class, ColumnInfoRecord.class, LabelRecord.class, BlankRecord.class, ColumnInfoRecord.class,
MulRKRecord.class, MulBlankRecord.class, MergeCellsRecord.class, MulRKRecord.class, MulBlankRecord.class, MergeCellsRecord.class,
FormulaRecord.class, BoolErrRecord.class, ExternSheetRecord.class, FormulaRecord.class, BoolErrRecord.class, ExternSheetRecord.class,
NameRecord.class, LeftMarginRecord.class, RightMarginRecord.class, NameRecord.class, LeftMarginRecord.class, RightMarginRecord.class,
TopMarginRecord.class, BottomMarginRecord.class, TopMarginRecord.class, BottomMarginRecord.class,
PaletteRecord.class PaletteRecord.class, StringRecord.class
}; };
} else { } else {
records = new Class[] records = new Class[]
@ -138,11 +138,11 @@ public class RecordFactory
LabelRecord.class, BlankRecord.class, ColumnInfoRecord.class, LabelRecord.class, BlankRecord.class, ColumnInfoRecord.class,
MulRKRecord.class, MulBlankRecord.class, MergeCellsRecord.class, MulRKRecord.class, MulBlankRecord.class, MergeCellsRecord.class,
BoolErrRecord.class, ExternSheetRecord.class, NameRecord.class, BoolErrRecord.class, ExternSheetRecord.class, NameRecord.class,
LeftMarginRecord.class, RightMarginRecord.class, LeftMarginRecord.class, RightMarginRecord.class,
TopMarginRecord.class, BottomMarginRecord.class, TopMarginRecord.class, BottomMarginRecord.class,
PaletteRecord.class PaletteRecord.class, StringRecord.class
}; };
} }
} }
private static Map recordsMap = recordsToMap(records); private static Map recordsMap = recordsToMap(records);

View File

@ -0,0 +1,242 @@
/* ====================================================================
* 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();
}
}

View File

@ -0,0 +1,106 @@
/* ====================================================================
* 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]);
}
}