Table of Contents

Overflowing data in different sheets (Delphi)

Note

This demo is available in your FlexCel installation at <FlexCel Install Folder>\Demo\Delphi\Modules\20.Reports\94b.Overflow sheets and also at https:​//​github.​com/​tmssoftware/​TMS-​FlexCel.​VCL-​demos/​tree/​master/​Delphi/​Modules/​20.​Reports/​94b.​Overflow sheets

Overview

For very big datasets, it might happen that they don't fit in a single sheet. In xls files, you can have a maximum of 65536 rows, and in xlsx 1048576 rows. If you want to dump bigger datasets than the maximum available (or you just want to allow say a maximum of 100 records in a sheet and after it is reached move to the next), then you might use the SPLIT tag as a master in the sheet.

Take a look at Splitting Tables in the Report designer's guide for more information.

Concepts

  • How to use the SPLIT tag to create a master-detail relationship of a dataset with itself, where each detail has a fixed number of records. This way you can limit the number of records that you show in each sheet.

  • How to use the Evaluate tag to provide a meaningful sheet name.

Files

UMainForm.pas

unit UMainForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  FlexCel.VCLSupport, FlexCel.Core, FlexCel.XlsAdapter, FlexCel.Report, FlexCel.Render,
  {$if CompilerVersion >= 23.0} System.UITypes, {$IFEND}
  ShellApi,
  Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

type
  TMainForm = class(TForm)
    btnCancel: TButton;
    btnGo: TButton;
    SaveDialog: TSaveDialog;
    Label1: TLabel;
    procedure btnCancelClick(Sender: TObject);
    procedure btnGoClick(Sender: TObject);
  private
    procedure RunReport;
    function GetDataPath: string;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation
uses IOUtils;

{$R *.dfm}

type
  TMyData = record
    Name: string;

    constructor Create(const aName: string);
  end;

procedure TMainForm.btnCancelClick(Sender: TObject);
begin
  Close;
end;

procedure TMainForm.btnGoClick(Sender: TObject);
begin
  RunReport;

end;

function TMainForm.GetDataPath: string;
begin
  Result := TPath.Combine(TPath.GetDirectoryName(ParamStr(0)), '..\..');
end;


procedure TMainForm.RunReport;
var
  Report: TFlexCelReport;
  Data: TArray<TMyData>;
  i: integer;
begin
  if not SaveDialog.Execute then exit;

  Report := TFlexCelReport.Create(true);
  try
    SetLength(Data, 1010);
    for i := 0 to Length(Data) - 1 do
    begin
      Data[i] := TMyData.Create('Customer ' + IntToStr(i));
    end;

    Report.AddTable<TMyData>('data', Data);
    Report.SetValue('split', 40);
    Report.Run(
      TPath.Combine(GetDataPath, 'Overflow Sheets.template.xlsx'),
      SaveDialog.FileName);
  finally
    Report.Free;
  end;

  if MessageDlg('Do you want to open the generated file?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  begin
    ShellExecute(0, 'open', PCHAR(SaveDialog.FileName), nil, nil, SW_SHOWNORMAL);
  end;


end;

{ TMyData }

constructor TMyData.Create(const aName: string);
begin
  Name := aName;
end;

end.