⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 recordstoragechart2.pas

📁 一个经典的读写Excel的控件
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit RecordStorageChart2;

{
********************************************************************************
******* XLSReadWriteII V2.00                                             *******
*******                                                                  *******
******* Copyright(C) 1999,2004 Lars Arvidsson, Axolot Data               *******
*******                                                                  *******
******* email: components@axolot.com                                     *******
******* URL:   http://www.axolot.com                                     *******
********************************************************************************
** Users of the XLSReadWriteII component must accept the following            **
** disclaimer of warranty:                                                    **
**                                                                            **
** XLSReadWriteII is supplied as is. The author disclaims all warranties,     **
** expressedor implied, including, without limitation, the warranties of      **
** merchantability and of fitness for any purpose. The author assumes no      **
** liability for damages, direct or consequential, which may result from the  **
** use of XLSReadWriteII.                                                     **
********************************************************************************
}

{$B-}


interface

uses Classes, SysUtils, Contnrs, RecordStorage2, BIFFRecsII2, XLSStream2,
     EscherTypes2, XLSFonts2;

const ID_CHARTRECORDROOT = $FFFA;
const ID_CHARTRECORD_DEFAULTLEGEND = $F001;

type TDefaultRecordData = (drdAll,drdLegend,drdSerie,drdDataformat,drdStyleArea,
                           drdStyleBarColumn,drdStyleLine,drdStylePie,
                           drdStyleRadar,drdStyleScatter,drdStyleSurface);

type TDefaultRecord = record
     Id: word;
     Data: string;
     end;

type TChartRecord = class(TObjectList)
private
     FRecId: word;
     FLength: word;
     FData: PByteArray;
     FParent: TChartRecord;

     function  GetItems(Index: integer): TChartRecord;
     procedure ReadDefault(DefRecs: array of TDefaultRecord; var Index: integer; Fonts: TXFonts);
     function  FindFBIFont(Id: integer): TXFont;
protected
public
     constructor Create(Parent: TChartRecord; Header: TBIFFHeader; D: PByteArray); overload;
     constructor Create(Parent: TChartRecord; RecId,Length: word); overload;
     constructor Create(Parent: TChartRecord; RecId: word; Obj: TObject); overload;
     destructor Destroy; override;
     procedure Write(Stream: TXLSStream);
     procedure Resize(Delta: integer);
     procedure Read(Stream: TXLSStream; PBuf: PByteArray; Fonts: TXFonts);
     procedure ReadDefaultRecords(RecData: TDefaultRecordData);
     function  LastRec: TChartRecord;
     function  InsertRecord(Index: integer; RecId,Length: word; IsUpdate: boolean = False): TChartRecord;
     function  FindRecord(Id: integer): integer;
     function  FindRecordChilds(Id: integer): boolean;
     function  RemoveRecord(Id: integer): boolean;
     function  Root: TChartRecord;

     property Items[Index: integer]: TChartRecord read GetItems; default;
     property Parent: TChartRecord read FParent;
     property RecId: word read FRecId;
     property Length: word read FLength;
     property Data: PByteArray read FData;
     end;

type TChartRecordUpdate = class(TChartRecord)
private
     FUpdateEvent: TNotifyEvent;
public
     property OnUpdate: TNotifyEvent read FUpdateEvent write FUpdateEvent;
     end;

implementation

uses Escher2;

const DefaultRecordsSerieIndex = 22;

const DefaultRecordsLegend: array[0..7] of TDefaultRecord = (
(Id: $1033; Data: ''), //BEGIN:
(Id: $104F; Data: #$05#$00#$02#$00#$DB#$0D#$00#$00#$AB#$06#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00), // POS
(Id: $1025; Data: #$02#$02#$01#$00#$00#$00#$00#$00#$AF#$FF#$FF#$FF#$86#$FF#$FF#$FF#$00#$00#$00#$00#$00#$00#$00#$00#$B1#$00#$4D#$00#$A0#$15#$00#$00), // TEXT
(Id: $1033; Data: ''), //BEGIN:
(Id: $104F; Data: #$02#$00#$02#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00), // POS
(Id: $1051; Data: #$00#$01#$00#$00#$00#$00#$00#$00), // AI
(Id: $1034; Data: ''), //END:
(Id: $1034; Data: '')); //END:

const DefaultRecordsAll: array[0..82] of TDefaultRecord = (
(Id: $0809; Data: #$00#$06#$20#$00#$46#$18#$CD#$07#$C1#$80#$00#$00#$06#$02#$00#$00), // BOF
(Id: $0014; Data: ''), // HEADER
(Id: $0015; Data: ''), // FOOTER
(Id: $0083; Data: #$00#$00), // HCENTER
(Id: $0084; Data: #$00#$00), //VCENTER
(Id: $00A1; Data: #$09#$00#$64#$00#$01#$00#$01#$00#$01#$00#$00#$00#$58#$02#$58#$02#$00#$00#$00#$00#$00#$00#$E0#$3F#$00#$00#$00#$00#$00#$00#$E0#$3F#$01#$00), // SETUP
(Id: $0033; Data: #$03#$00),// ???
                                                           // Four extra bytes for pointer to the font.
(Id: $1060; Data: #$08#$16#$57#$12#$A0#$00#$00#$00#$F0#$00#$00#$00#$00#$00), // FBI:
(Id: $1060; Data: #$08#$16#$57#$12#$A0#$00#$01#$00#$F1#$00#$00#$00#$00#$00), // FBI:

(Id: $0012; Data: #$00#$00), // PROTECT
(Id: $1001; Data: #$00#$00), // UNITS:
(Id: $1002; Data: #$00#$00#$00#$00#$00#$00#$00#$00#$E8#$7F#$21#$01#$00#$40#$BF#$00), // CHART:
(Id: $1033; Data: ''), // BEGIN:
(Id: $00A0; Data: #$01#$00#$01#$00), // SCL
(Id: $1064; Data: #$00#$00#$01#$00#$00#$00#$01#$00), // PLOTGROWTH:
(Id: $1032; Data: #$00#$00#$02#$00), // FRAME:
(Id: $1033; Data: ''), // BEGIN:
(Id: $1007; Data: #$00#$00#$00#$00#$00#$00#$00#$00#$09#$00#$4D#$00), // LINEFORMAT:
(Id: $100A; Data: #$FF#$FF#$FF#$00#$00#$00#$00#$00#$01#$00#$01#$00#$4E#$00#$4D#$00), // AREAFORMAT:
(Id: $1034; Data: ''), // END:

(Id: $1003; Data: #$01#$00#$01#$00#$0A#$00#$0A#$00#$01#$00#$00#$00), // SERIES:
(Id: $1033; Data: ''), // BEGIN:
(Id: $1051; Data: #$00#$01#$00#$00#$00#$00#$00#$00), // AI:
(Id: $1051; Data: #$01#$02#$00#$00#$00#$00#$0B#$00#$3B#$00#$00#$00#$00#$09#$00#$00#$00#$00#$00), // AI:
(Id: $1051; Data: #$02#$00#$00#$00#$00#$00#$00#$00), // AI:
(Id: $1051; Data: #$03#$01#$00#$00#$00#$00#$00#$00), // AI:
(Id: $1006; Data: #$FF#$FF#$00#$00#$00#$00#$00#$00), // DATAFORMAT:
(Id: $1033; Data: ''), // BEGIN:
(Id: $105F; Data: #$00#$00),// ???
(Id: $1034; Data: ''), // END:
(Id: $1045; Data: #$00#$00), // SERTOCRT:
(Id: $1034; Data: ''), // END:
(Id: $1044; Data: #$0A#$00#$00#$00), // SHTPROPS:
(Id: $1024; Data: #$02#$00), // DEFAULTTEXT:
(Id: $1025; Data: #$02#$02#$01#$00#$00#$00#$00#$00#$CB#$FF#$FF#$FF#$AE#$FF#$FF#$FF#$00#$00#$00#$00#$00#$00#$00#$00#$B1#$00#$4D#$00#$A0#$09#$00#$00), // TEXT:
(Id: $1033; Data: ''), // BEGIN:
(Id: $104F; Data: #$02#$00#$02#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00), // POS:
(Id: $1026; Data: #$F0#$00), // FONTX:
(Id: $1051; Data: #$00#$01#$00#$00#$00#$00#$00#$00), // AI:
(Id: $1034; Data: ''), // END:
(Id: $1024; Data: #$03#$00), // DEFAULTTEXT:
(Id: $1025; Data: #$02#$02#$01#$00#$00#$00#$00#$00#$CB#$FF#$FF#$FF#$AE#$FF#$FF#$FF#$00#$00#$00#$00#$00#$00#$00#$00#$B1#$00#$4D#$00#$A0#$09#$00#$00), // TEXT:
(Id: $1033; Data: ''), // BEGIN:
(Id: $104F; Data: #$02#$00#$02#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00), // POS:
(Id: $1026; Data: #$F1#$00), // FONTX:
(Id: $1051; Data: #$00#$01#$00#$00#$00#$00#$00#$00), // AI:
(Id: $1034; Data: ''), // END:
(Id: $1046; Data: #$01#$00), // AXESUSED:
(Id: $1041; Data: #$00#$00#$94#$01#$00#$00#$47#$01#$00#$00#$23#$0B#$00#$00#$FD#$0B#$00#$00), // AXISPARENT:
(Id: $1033; Data: ''), // BEGIN:
(Id: $104F; Data: #$02#$00#$02#$00#$6A#$00#$00#$00#$A3#$00#$00#$00#$4D#$0C#$00#$00#$59#$0E#$00#$00), // POS:

(Id: $101D; Data: #$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00), // AXIS:
(Id: $1033; Data: ''), // BEGIN:
(Id: $1020; Data: #$01#$00#$01#$00#$01#$00#$01#$00), // CATSERRANGE:
(Id: $1062; Data: #$00#$00#$00#$00#$01#$00#$00#$00#$01#$00#$00#$00#$00#$00#$00#$00#$EF#$00), // AXCEXT:
(Id: $101E; Data: #$02#$00#$03#$01#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$23#$00#$4D#$00#$00#$00), // TICK:
(Id: $1034; Data: ''), // END:

(Id: $101D; Data: #$01#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00), // AXIS:
(Id: $1033; Data: ''), // BEGIN:
(Id: $101F; Data: #$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$1F#$01), // VALUERANGE:
(Id: $101E; Data: #$02#$00#$03#$01#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$23#$00#$4D#$00#$00#$00), // TICK:
(Id: $1021; Data: #$01#$00), // AXISLINEFORMAT:
(Id: $1007; Data: #$00#$00#$00#$00#$00#$00#$FF#$FF#$09#$00#$4D#$00), // LINEFORMAT:
(Id: $1034; Data: ''), // END:

(Id: $1035; Data: ''), // PLOTAREA:
(Id: $1032; Data: #$00#$00#$03#$00), // FRAME:
(Id: $1033; Data: ''), // BEGIN:
(Id: $1007; Data: #$80#$80#$80#$00#$00#$00#$00#$00#$00#$00#$17#$00), // LINEFORMAT:
(Id: $100A; Data: #$C0#$C0#$C0#$00#$00#$00#$00#$00#$01#$00#$00#$00#$16#$00#$4F#$00), // AREAFORMAT:
(Id: $1034; Data: ''), // END:
(Id: $1014; Data: #$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00), // CHARTFORMAT:
(Id: $1033; Data: ''), // BEGIN:
(Id: $1017; Data: #$00#$00#$96#$00#$00#$00), // BAR:
(Id: $1022; Data: #$00#$00#$00#$00#$00#$00#$00#$00#$0F#$00), // CHARTFORMATLINK:

(Id: $1015; Data: #$DB#$0D#$00#$00#$AB#$06#$00#$00#$85#$01#$00#$00#$F4#$00#$00#$00#$03#$01#$1F#$00), // LEGEND
(Id: ID_CHARTRECORD_DEFAULTLEGEND; Data: ''), // DefaultRecordsLegend

(Id: $1034; Data: ''), // END:
(Id: $1034; Data: ''), // END:
(Id: $1034; Data: ''), // END:
//(Id: $0200; Data: #$00#$00#$00#$00#$0A#$00#$00#$00#$00#$00#$01#$00#$00#$00), // DIMENSIONS
(Id: $1065; Data: #$02#$00), // SIINDEX:
(Id: $1065; Data: #$01#$00), // SIINDEX:
(Id: $1065; Data: #$03#$00), // SIINDEX:
(Id: $000A; Data: '')); // EOF

const DefaultRecordsStyleArea: array[0..11] of TDefaultRecord = (
(Id: $101A; Data: #$00#$00), //AREA
(Id: $1022; Data: #$00#$00#$00#$00#$00#$00#$00#$00#$0F#$00), //CHARTFORMATLINK

(Id: $1015; Data: #$DB#$0D#$00#$00#$AB#$06#$00#$00#$85#$01#$00#$00#$F4#$00#$00#$00#$03#$01#$1F#$00), // LEGEND
(Id: ID_CHARTRECORD_DEFAULTLEGEND; Data: ''), // DefaultRecordsLegend

(Id: $1006; Data: #$00#$00#$00#$00#$FD#$FF#$00#$00), //DATAFORMAT
(Id: $1033; Data: ''), //BEGIN
(Id: $105F; Data: #$00#$00), // GEOMETRY
(Id: $1007; Data: #$00#$00#$00#$00#$00#$00#$FF#$FF#$09#$00#$4D#$00), //LINEFORMAT
(Id: $100A; Data: #$FF#$FF#$FF#$00#$00#$00#$00#$00#$01#$00#$01#$00#$4E#$00#$4D#$00), //AREAFORMAT
(Id: $100B; Data: #$00#$00), //PIEFORMAT
(Id: $1009; Data: #$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$4D#$00#$4D#$00#$3C#$00#$00#$00), //MARKERFORMAT
(Id: $1034; Data: '')); //END

const DefaultRecordsStyleBarColumn: array[0..3] of TDefaultRecord = (
(Id: $1017; Data: #$00#$00#$96#$00#$01#$00), // BAR
(Id: $1022; Data: #$00#$00#$00#$00#$00#$00#$00#$00#$0F#$00), // CHARTFORMATLINK

(Id: $1015; Data: #$DB#$0D#$00#$00#$AB#$06#$00#$00#$85#$01#$00#$00#$F4#$00#$00#$00#$03#$01#$1F#$00), // LEGEND
(Id: ID_CHARTRECORD_DEFAULTLEGEND; Data: '')); // DefaultRecordsLegend

const DefaultRecordsStyleScatter: array[0..11] of TDefaultRecord = (
(Id: $101B; Data: #$64#$00#$01#$00#$00#$00), // SCATTER
(Id: $1022; Data: #$00#$00#$00#$00#$00#$00#$00#$00#$0F#$00), // CHARTFORMATLINK

(Id: $1015; Data: #$DB#$0D#$00#$00#$AB#$06#$00#$00#$85#$01#$00#$00#$F4#$00#$00#$00#$03#$01#$1F#$00), // LEGEND
(Id: ID_CHARTRECORD_DEFAULTLEGEND; Data: ''), // DefaultRecordsLegend

(Id: $1006; Data: #$00#$00#$00#$00#$FD#$FF#$00#$00), // DATAFORMAT
(Id: $1033; Data: ''), // BEGIN
(Id: $105F; Data: #$00#$00), // ???
(Id: $1007; Data: #$00#$00#$00#$00#$00#$00#$FF#$FF#$09#$00#$4D#$00), // LINEFORMAT
(Id: $100A; Data: #$FF#$FF#$FF#$00#$00#$00#$00#$00#$01#$00#$01#$00#$4E#$00#$4D#$00), // AREAFORMAT
(Id: $100B; Data: #$00#$00), // PIEFORMAT
(Id: $1009; Data: #$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$4D#$00#$4D#$00#$3C#$00#$00#$00), // MARKERFORMAT
(Id: $1034; Data: ''));// END

const DefaultRecordsStylePie: array[0..3] of TDefaultRecord = (
(Id: $1019; Data: #$00#$00#$00#$00#$02#$00), //PIE
(Id: $1022; Data: #$00#$00#$00#$00#$00#$00#$00#$00#$0F#$00), //CHARTFORMATLINK
(Id: $1015; Data: #$DB#$0D#$00#$00#$AB#$06#$00#$00#$85#$01#$00#$00#$F4#$00#$00#$00#$03#$01#$1F#$00), // LEGEND
(Id: ID_CHARTRECORD_DEFAULTLEGEND; Data: '')); // DefaultRecordsLegend

const DefaultRecordsStyleLine: array[0..3] of TDefaultRecord = (
(Id: $1018; Data: #$00#$00), // Line
(Id: $1022; Data: #$00#$00#$00#$00#$00#$00#$00#$00#$0F#$00), //CHARTFORMATLINK
(Id: $1015; Data: #$DB#$0D#$00#$00#$AB#$06#$00#$00#$85#$01#$00#$00#$F4#$00#$00#$00#$03#$01#$1F#$00), // LEGEND
(Id: ID_CHARTRECORD_DEFAULTLEGEND; Data: '')); // DefaultRecordsLegend

const DefaultRecordsStyleRadar: array[0..11] of TDefaultRecord = (
(Id: $103E; Data: #$01#$00#$12#$00), // RADAR
(Id: $1022; Data: #$00#$00#$00#$00#$00#$00#$00#$00#$0F#$00), // CHARTFORMATLINK

(Id: $1015; Data: #$DB#$0D#$00#$00#$AB#$06#$00#$00#$85#$01#$00#$00#$F4#$00#$00#$00#$03#$01#$1F#$00), // LEGEND
(Id: ID_CHARTRECORD_DEFAULTLEGEND; Data: ''), // DefaultRecordsLegend

(Id: $1006; Data: #$00#$00#$00#$00#$FD#$FF#$00#$00), // DATAFORMAT
(Id: $1033; Data: ''), // BEGIN
(Id: $105F; Data: #$00#$00), // _GEOMETRY_
(Id: $1007; Data: #$00#$00#$00#$00#$00#$00#$FF#$FF#$09#$00#$4D#$00), // LINEFORMAT
(Id: $100A; Data: #$FF#$FF#$FF#$00#$00#$00#$00#$00#$01#$00#$01#$00#$4E#$00#$4D#$00), // AREAFORMAT
(Id: $100B; Data: #$00#$00), // PIEFORMAT
(Id: $1009; Data: #$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$4D#$00#$4D#$00#$3C#$00#$00#$00), // MARKERFORMAT
(Id: $1034; Data: '')); // END

const DefaultRecordsStyleSurface: array[0..11] of TDefaultRecord = (
(Id: $103F; Data: #$01#$00), // SURFACE
(Id: $1022; Data: #$00#$00#$00#$00#$00#$00#$00#$00#$0F#$00), // CHARTFORMATLINK

(Id: $1015; Data: #$DB#$0D#$00#$00#$AB#$06#$00#$00#$85#$01#$00#$00#$F4#$00#$00#$00#$03#$01#$1F#$00), // LEGEND
(Id: ID_CHARTRECORD_DEFAULTLEGEND; Data: ''), // DefaultRecordsLegend

(Id: $1006; Data: #$00#$00#$00#$00#$FD#$FF#$00#$00), // DATAFORMAT
(Id: $1033; Data: ''), // BEGIN
(Id: $105F; Data: #$00#$00), // _GEOMETRY_
(Id: $1007; Data: #$00#$00#$00#$00#$00#$00#$FF#$FF#$09#$00#$4D#$00), // LINEFORMAT
(Id: $100A; Data: #$FF#$FF#$FF#$00#$00#$00#$00#$00#$01#$00#$01#$00#$4E#$00#$4D#$00), // AREAFORMAT
(Id: $100B; Data: #$00#$00), // PIEFORMAT
(Id: $1009; Data: #$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$4D#$00#$4D#$00#$3C#$00#$00#$00), // MARKERFORMAT
(Id: $1034; Data: '')); // END

const DefaultRecordsDataformat: array[0..4] of TDefaultRecord = (
// (Id: $1033; Data: ''), // BEGIN
(Id: $105F; Data:  #$00#$00), // _GEOMETRY_
(Id: $1007; Data:  #$00#$00#$00#$00#$00#$00#$00#$00#$01#$00#$4F#$00), // LINEFORMAT
(Id: $100A; Data:  #$CC#$FF#$CC#$00#$FF#$FF#$FF#$00#$01#$00#$00#$00#$2A#$00#$09#$00), // AREAFORMAT
(Id: $100B; Data:  #$00#$00), // PIEFORMAT
(Id: $1009; Data:  #$00#$00#$00#$00#$00#$00#$00#$00#$02#$00#$01#$00#$4D#$00#$4D#$00#$3C#$00#$00#$00)); // MARKERFORMAT
// (Id: $1034; Data: '')); // END


{ TChartRecord }

function TChartRecord.FindFBIFont(Id: integer): TXFont;
var
  i: integer;
  Rec: TChartRecord;
begin
  Rec := Root;
  for i := 0 to Rec.Count - 1 do begin
    if (Rec[i].FRecId = CHARTRECID_FBI) and (PCRecFBI_Font(Rec[i].FData).Index = Id) then begin
      Result := TXFont(PCRecFBI_Font(Rec[i].FData).XFont);
      Exit;
    end;
  end;
  Result := Nil;
//  raise Exception.Create('Can not find FBI');
end;

function TChartRecord.FindRecord(Id: integer): integer;
begin
  for Result := 0 to Count - 1 do begin
    if Items[Result].RecId = Id then
      Exit;
  end;
  Result := -1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -