目的是将xlGrid改成可以连接多个数据源。
TXLDataLink = class(TDataLink)
  private
    FBand: TXLBand;
    FModified: Boolean;
    FInUpdateData: Boolean;
    procedure SetBand(const Value: TXLBand);
  protected
    procedure ActiveChanged; override;
    procedure DataSetChanged; override;
    procedure DataSetScrolled(Distance: Integer); override;
    procedure EditingChanged; override;
    procedure RecordChanged(Field: TField); override;
    procedure UpdateData; override;
  public
    constructor Create(ABand: TXLBand);
    destructor Destroy; override;
    procedure Modified;
    property Band: TXLBand read FBand write SetBand;
  end;  TXLBand = class(TPersistent)
  private
    FName: string;
    FDataLink: TXLDataLink;
    FRange: TRect;
    FSheet: TXLSheet;
    FDataSourceName: string;
    FStep: Integer;
    FDataInfo: TPanel;
    FUpInfo, FDownInfo: TLabel;
    FPageNo: Integer;
    procedure SetName(const Value: string);
    procedure SetRange(const Value: TRect);
    procedure SetSheet(const Value: TXLSheet);
    procedure SetDataSourceName(const Value: string);
    procedure SetStep(const Value: Integer);
    function GetDataSet: TDataSet;
    function GetDataSource: TDataSource;
    procedure DisCellValue(ACell: TXLCell; AValue: Integer; var Stop: Boolean);
    procedure MoveToFirst(Sender: TObject);
    procedure MoveToLast(Sender: TObject);
    procedure SetPageNo(const Value: Integer);
  protected
    procedure Load(AStream: TXLStream);
    procedure Save(AStream: TXLStream);
  public
    constructor Create(AName: string; ASheet: TXLSheet; ARect: TRect);
    destructor Destroy; override;
    function LoadFromStream(AStream: TXLStream): Boolean;
    procedure SaveToStream(AStream: TXLStream);
    procedure ActiveChanged(Active: Boolean);
    procedure DataSetChanged;
    procedure DataSetScrolled(Distance: Integer);
    procedure EditingChanged;
    procedure RecordChanged(Field: TField);
    procedure UpdateData;
    procedure DisplayDataInfo;
    property Step: Integer read FStep write SetStep;
    property PageNo: Integer read FPageNo write SetPageNo;
    property Name: string read FName write SetName;
    property Range: TRect read FRange write SetRange;
    property DataSet: TDataSet read GetDataSet;
    property Sheet: TXLSheet read FSheet write SetSheet;
    property DataSource: TDataSource read GetDataSource;
    property DataSourceName: string read FDataSourceName write SetDataSourceName;
  end;  TXLBandList = class(TPersistent)
  private
    FBandList: TStringList;
    FSheet: TXLSheet;
    function GetBand(AIndex: Integer): TXLBand;
    procedure SetSheet(const Value: TXLSheet);
    function GetCount: Integer;
    procedure SetBandName;
  protected
    procedure Load(AStream: TXLStream);
    procedure Save(AStream: TXLStream);
  public
    constructor Create(ASheet: TXLSheet);
    destructor Destroy; override;
    function LoadFromStream(AStream: TXLStream): Boolean;
    procedure SaveToStream(AStream: TXLStream);
    function Add(AName: string; ARect: TRect): TXLBand;
    function Delete(AName: string): Boolean;
    function BandByName(AName: string): TXLBand;
    property Items[AIndex: Integer]: TXLBand read GetBand; default;
    property Sheet: TXLSheet read FSheet write SetSheet;
    property Count: Integer read GetCount;
  end;