Getting started (Delphi)
Note
This demo is available in your FlexCel installation at <FlexCel Install Folder>\Demo\Delphi\Modules\10.API\10.GettingStarted and also at https://github.com/tmssoftware/TMS-FlexCel.VCL-demos/tree/master/Delphi/Modules/10.API/10.GettingStarted
Overview
A simple demo showing how to create an Excel file with the API from scratch.
Concepts
Before using FlexCel, you have to add "uses FlexCel.VCLSupport", "uses FlexCel.Core" and "uses FlexCel.XlsAdapter" to your uses statements. For a FireMonkey app, you would add "uses FlexCel.FMXSupport" instead of "uses FlexCel.VCLSupport" You need to use FMXSupport/VCLSupport units once in your app, so FlexCel can initialize the correct graphics engine. There is no need to add them more than once.
The most important class here is the TXlsFile class, from where you can read and write to any Excel 2 or newer file.
To set the value for a cell, use TXlsFile.SetCellValue. You can set any kind of object here, not just text. If you set it to a TFormula object, you will enter a formula.
As explained in the FlexCel API Developer Guide, formats in Excel are indexes to an XF (eXtended Format list) To modify the format on a cell, you have to assign an XF index to that cell. To create new XF formats, use TXlsFile.AddFormat
Files
UGettingStarted.pas
unit UGettingStarted;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShellAPI, UPaths,
{$IFDEF FPC} LResources,{$ENDIF}
{$if CompilerVersion >= 23.0} System.UITypes, {$IFEND}
FlexCel.VCLSupport, FlexCel.Core, FlexCel.XlsAdapter;
type
TFGettingStarted = class(TForm)
btnCreateFile: TButton;
Memo1: TMemo;
SaveDialog: TSaveDialog;
procedure btnCreateFileClick(Sender: TObject);
private
procedure CreateFile;
procedure AddData(const Xls: TExcelFile);
procedure ShowOpenDialog(const Xls: TExcelFile);
end;
var
FGettingStarted: TFGettingStarted;
implementation
{$IFNDEF FPC}
{$R *.dfm}
{$ENDIF}
procedure TFGettingStarted.CreateFile;
var
Xls: TExcelFile;
begin
Xls := TXlsFile.Create(true);
try
AddData(Xls);
ShowOpenDialog(Xls);
finally
FreeAndNil(Xls);
end;
end;
procedure TFGettingStarted.AddData(const Xls: TExcelFile);
var
PathToImage : string;
fmt: TFlxFormat;
XF, XF2: integer;
begin
//Create a new file. We could also open an existing file with Xls.Open
Xls.NewFile(1, TExcelFileFormat.v2019);
//Set some cell values.
Xls.SetCellValue(1, 1, 'Hello to the world');
Xls.SetCellValue(2, 1, 3);
Xls.SetCellValue(3, 1, 2.1);
Xls.SetCellValue(4, 1, TFormula.Create('=Sum(A2, A3)')); //Note that formulas always are in English. This means use "," to separate arguments, not ";".
//Get path for images from disk.
PathToImage := DataFolder + 'poweredbyflexcel.png';
//Add a new image on cell F2
Xls.AddImage(PathToImage,
TImageProperties_Create(
TClientAnchor.Create(TFlxAnchorType.MoveAndResize, 2, 0, 6, 0, 5, 0, 8, 0),
PathToImage, 'My image'));
//Add a comment on cell a2
Xls.SetComment(2, 1, 'This is a comment');
//Custom Format cells a2 and a3
fmt := Xls.GetDefaultFormat; //Always initialize the record with an existing format.
fmt.Font.Name := 'Times New Roman';
fmt.Font.Color := clRed;
fmt.FillPattern.Pattern := TFlxPatternStyle.LightDown;
fmt.FillPattern.FgColor := clBlue;
fmt.FillPattern.BgColor := clWhite;
//You can call AddFormat as many times as you want, it will never add a format twice.
//But if you know the format you are going to use, you can get some extra CPU cycles by
//calling addformat once and saving the result into a variable.
XF := Xls.AddFormat(fmt);
Xls.SetCellFormat(2, 1, XF);
Xls.SetCellFormat(3, 1, XF);
fmt.Rotation := 45;
fmt.Font.Size20 := 400;
fmt.FillPattern.Pattern := TFlxPatternStyle.Solid;
XF2 := Xls.AddFormat(fmt);
//Apply a custom format to all the row.
Xls.SetRowFormat(1, XF2);
//Merge cells
Xls.MergeCells(5, 1, 10, 6);
//Note how this one merges with the previous range, creating a final range (5,1,15,6)
Xls.MergeCells(10, 6, 15, 6);
//Make the page print in landscape or portrait mode
Xls.PrintLandscape := true;
end;
procedure TFGettingStarted.btnCreateFileClick(Sender: TObject);
begin
CreateFile;
end;
procedure TFGettingStarted.ShowOpenDialog(const Xls: TExcelFile);
begin
if not SaveDialog.Execute then exit;
Xls.Save(SaveDialog.FileName); //No need to delete the file first, since AllowOverWriteFiles is true in XlsAdapter.
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;
{$IFDEF FPC}
initialization
{$I UGettingStarted.lrs}
{$ENDIF}
end.