Regular expressions (Delphi)
Overview
Regular expressions give you both the power to transform the text in
your reports in any way you like, and also to obfuscate and make
unmaintainable your templates if you abuse them. The <#regex()> tag
lets you write your own Regular Expressions in a FlexCel report.
Concepts
There are 2 versions of the <#regex> tag:
RegEx(IgnoreCase, Expression, Search): This will search for the
expression inside "Search" string, and return the part of
"Search" that matches the expression.
RegEx(IgnoreCase, Expression, Search, Replace): This will Replace
the matching string inside "Search" by the "Replace" string.
Both "Search" and "Replace" parameters are evaluated at runtime,
so they will evaluate to different strings as the row changes. The
"Expression" parameter is evaluated only once before starting
the report, so it will not change.
As formerly said, use regular expressions with care. Sometimes they
are just invaluable to get your desired output, but on other times
they can make maintaining the templates a lot of work. Depending
on the case, you might find better to define your own user
function to do a complex transformation. (See the User Defined Functions example)
Regular Expressions are a complex subject, and we will not explain
how to use them here. There is a lot of information out there available on them.
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, DemoData;
{$R *.dfm}
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;
begin
if not SaveDialog.Execute then exit;
Report := TFlexCelReport.Create(true);
try
Report.AddTable(DemoTables);
Report.SetValue('Date', Now);
Report.SetValue('ReportCaption', 'Suppliers');
Report.Run(
TPath.Combine(GetDataPath, 'Regular Expressions In Reports.template.xls'),
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;
end.