Flexcel vcl
Official collection of agent skills from TMS Software
npx -y skills add tmssoftware/skills --skill flexcel-vclAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 14 stars14 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Use when writing Delphi / FreePascal / C++Builder code that reads, writes, manipulates, or exports Excel (.xlsx / .xls) files, generates PDF or HTML from Excel, or produces data-driven reports with FlexCel Studio for VCL and FireMonkey (TMS FlexCel). Triggers include Excel/xlsx from Delphi, TXlsFile, TFlexCelReport, TFlexCelPdfExport, TFlexCelHtmlExport, FireMonkey Excel export, Lazarus Excel, and Excel reporting from Pascal.
SKILL.md
11.5 KB, as published. Nobody here has run it
FlexCel Studio for VCL / FireMonkey
This skill helps write Delphi (VCL, FMX, Lazarus/LCL, Linux/SKIA) and C++Builder code that uses FlexCel — the TMS Software library for working with Excel .xlsx / .xls files, exporting to PDF/HTML/images, and generating data-driven reports from templates.
When to use this skill
Activate whenever the user wants to, from Pascal/Delphi/C++Builder code:
- Read an Excel file (
.xlsxor.xls) — cell values, formulas, formatting. - Create or modify an Excel file programmatically.
- Generate reports by merging data into Excel templates.
- Export an Excel file to PDF, HTML, SVG, or images.
- Autofit rows/columns, render sheets, or measure cells.
- Target VCL, FireMonkey (desktop & mobile), Lazarus, or Delphi Linux.
FlexCel does not require Excel or any Office installation on the target machine. It has no OLE/COM dependency.
Two ways to create Excel files — pick one
Before writing code, decide which API fits the task:
| If the user wants to… | Use | Why |
|---|---|---|
| Read existing files, or build files cell-by-cell in code | TXlsFile API (FlexCel.XlsAdapter) | Full programmatic control; no designer required. |
| Produce the same report repeatedly from changing data, with a styled layout | TFlexCelReport + Excel template (FlexCel.Report) | Non-programmers can edit the template in Excel; code just provides data. |
When the user says "generate a report with company logo / nice formatting / many rows from a database", prefer Reports. When they say "read this file and extract values" or "create an Excel file with these calculations", prefer the API.
You can combine both: run a report to produce an in-memory TXlsFile, then manipulate it with the API, then export to PDF.
Quick-start recipes
All examples assume VCL. For FireMonkey replace FlexCel.VCLSupport with FlexCel.FMXSupport; for Lazarus use FlexCel.LCLSupport; for Delphi Linux use FlexCel.SKIASupport. The platform support unit goes in the main program (.dpr) uses clause only, not every unit.
Recipe 1 — Create an Excel file
uses
System.IOUtils,
FlexCel.Core, FlexCel.XlsAdapter;
procedure CreateExcelFile;
var
xls: TXlsFile;
begin
// Start an empty workbook with 1 sheet and Excel-2019 default formatting.
xls := TXlsFile.Create(1, TExcelFileFormat.v2019, true);
try
xls.SetCellValue(1, 1, 'Hello from FlexCel!'); // A1 text
xls.SetCellValue(2, 1, 7); // A2 number
xls.SetCellValue(3, 1, 11.3); // A3 number
xls.SetCellValue(4, 1, TFormula.Create('=Sum(A2:A3)')); // A4 formula
xls.Save(TPath.Combine(TPath.GetDocumentsPath, 'test.xlsx'));
finally
xls.Free;
end;
end;
Key points:
- All row/column/sheet indices are 1-based.
(1, 1)is cellA1. (XF format indices are the single exception — they're 0-based.) - File format is inferred from the extension (
.xlsx→ OOXML,.xls→ BIFF8). TXlsFileis a plain class, not a component — you create it in code and mustFreeit.
Recipe 2 — Read an Excel file
uses
System.IOUtils,
FlexCel.Core, FlexCel.XlsAdapter;
procedure ReadExcelFile(const aMemo: TMemo);
var
xls: TXlsFile;
row, colIndex, XF: integer;
cell: TCellValue;
addr: TCellAddress;
s: string;
begin
xls := TXlsFile.Create(TPath.Combine(TPath.GetDocumentsPath, 'test.xlsx'));
try
xls.ActiveSheetByName := 'Sheet1'; // or loop xls.ActiveSheet from 1 to xls.SheetCount
for row := 1 to xls.RowCount do
begin
// Use ColCountInRow, NOT ColCount — much faster. See performance guide.
for colIndex := 1 to xls.ColCountInRow(row) do
begin
XF := -1;
cell := xls.GetCellValueIndexed(row, colIndex, XF);
addr := TCellAddress.Create(row, xls.ColFromIndex(row, colIndex));
s := 'Cell ' + addr.CellRef + ' ';
if cell.IsEmpty then s := s + 'is empty.'
else if cell.IsString then s := s + 'string: ' + cell.ToString
else if cell.IsNumber then s := s + 'number: ' + FloatToStr(cell.AsNumber)
else if cell.IsBoolean then s := s + 'bool: ' + BoolToStr(cell.AsBoolean)
else if cell.IsError then s := s + 'error: ' + cell.ToString
else if cell.IsFormula then s := s + 'formula: ' + cell.AsFormula.Text;
aMemo.Lines.Add(s);
end;
end;
finally
xls.Free;
end;
end;
Key points:
- Iterate with
ColCountInRow(row)combined withGetCellValueIndexed+ColFromIndex— this skips empty cells and is dramatically faster than a dense1..ColCountloop. TCellValueis a discriminated-union record. Test withIsEmpty / IsString / IsNumber / IsBoolean / IsError / IsFormula, then extract withToString / AsNumber / AsBoolean / AsFormula.- Excel dates are stored as numbers; detect them via the cell's format, not the value type.
Recipe 3 — Export Excel to PDF
uses
FlexCel.Core, FlexCel.XlsAdapter, FlexCel.Render;
procedure XlsxToPdf(const Source, Dest: string);
var
xls: TXlsFile;
pdf: TFlexCelPdfExport;
begin
xls := TXlsFile.Create(Source);
try
pdf := TFlexCelPdfExport.Create(xls);
try
pdf.Export(Dest); // one PDF covering all visible sheets
finally
pdf.Free;
end;
finally
xls.Free;
end;
end;
PDF export needs FlexCel.Render plus the platform-support unit in the main .dpr (the renderer uses the graphics engine for font measurement). For PDF/A, digital signatures, font embedding tuning, or multi-sheet bookmarks see references/pdf-html-export.md.
Recipe 4 — Run a report from a template
Assume an Excel template invoice-template.xlsx already exists, with tags like <#Customers.Name> inside a named range __Customers__ spanning the repeating row(s).
uses
FlexCel.Core, FlexCel.XlsAdapter, FlexCel.Report;
procedure RunReport(Customers: TDataSet);
var
report: TFlexCelReport;
begin
report := TFlexCelReport.Create(true); // true = case-insensitive tags
try
report.AddTable('Customers', Customers, TDisposeMode.DoNotDispose);
report.SetValue('ReportDate', Now);
report.SetValue('CompanyName', 'Acme Corp');
report.Run('invoice-template.xlsx', 'invoice-output.xlsx');
finally
report.Free;
end;
end;
To write the output straight to PDF, run the report into a TXlsFile and pipe it through TFlexCelPdfExport:
out := TXlsFile.Create;
try
report.Run('template.xlsx', out);
pdf := TFlexCelPdfExport.Create(out);
try pdf.Export('report.pdf'); finally pdf.Free end;
finally
out.Free;
end;
For the full tag language and template-design conventions see references/reports-cheatsheet.md.
Unit reference (what to put in uses)
Always include FlexCel.Core in every unit that touches FlexCel types. Then add, per task:
| Task | Additional units |
|---|---|
Platform graphics (main .dpr only) | FlexCel.VCLSupport / FlexCel.FMXSupport / FlexCel.LCLSupport / FlexCel.SKIASupport |
| Read / write xls/xlsx | FlexCel.XlsAdapter |
| PDF / HTML / image export, autofitting | FlexCel.Render |
| Low-level PDF access (sign, PDF/A options, standalone PDF) | FlexCel.Pdf |
| Template-based reports | FlexCel.Report |
Critical gotchas (read this every time)
- 1-based indexing for rows, columns, sheets.
SetCellValue(1, 1, ...)writes toA1. (XF format indices are 0-based.) - Always
FreeTXlsFile,TFlexCelReport,TFlexCelPdfExport, etc. They're plain classes, not components. Usetry..finally. - Don't iterate with
ColCount— it scans the whole sheet. UseColCountInRow(row)+GetCellValueIndexed+ColFromIndex. - Platform support unit belongs in the
.dpronly, not in every unit — it has no published types. - Dates are numbers.
GetCellValuereturns the serial date; check the cell's number format to know it's a date. - Measurement units in Excel are unusual — column widths are in 1/256 of a character, row heights in 1/20 of a point, etc. See the "Understanding Excel measurement units" tip in the docs before fiddling with widths/heights.
- Use APIMate. When the user asks "how do I make a cell blue / add an autofilter / create a pivot table", the canonical answer is: do it in Excel, open the file in APIMate (ships with FlexCel), and copy the generated Delphi/C++ code. APIMate is the recommended way to discover API calls for anything Excel-specific. Mention this to the user.
When to consult the references
Load a reference file only when the task actually needs it — keeps your context lean.
references/api-cheatsheet.md— deeperTXlsFileusage: formatting, fonts, colors, merging, row/column sizing, comments, images, charts, data validation, protection, sheet management, streams.references/reports-cheatsheet.md— full tag reference, named-range conventions for bands, master-detail, config sheets, user functions, events.references/pdf-html-export.md—TFlexCelPdfExportandTFlexCelHtmlExportoptions: PDF/A, font embedding, digital signing, HTML5, image embedding.references/pitfalls.md— longer list of gotchas drawn from the official Tips section: locale, fonts on Docker/Linux, barcodes, tokens in formulas, strict xlsx, conditional formats, etc.
When you need authoritative detail
The cheatsheets cover the common path. For anything deeper, fetch from the public documentation source:
- Markdown source (raw):
https://raw.githubusercontent.com/tmssoftware/TMS-FlexCel.VCL-doc-src/main/<path>.md- Guides:
guides/api-developer-guide.md,guides/reports-developer-guide.md,guides/reports-tag-reference.md,guides/pdf-exporting-guide.md,guides/html-exporting-guide.md,guides/performance-guide.md - Tips:
tips/<topic>.md(one file per tip) - API reference:
api/FlexCel.XlsAdapter/TXlsFile/<MemberName>.mdand similar
- Guides:
- Rendered docs:
https://doc.tmssoftware.com/flexcel/vcl/index.html - Official sample repository (Delphi + C++Builder + FireMonkey):
https://github.com/tmssoftware/TMS-FlexCel.VCL-demos
Use WebFetch on the raw markdown URL when you need to confirm a signature or pull an official example. Prefer the raw markdown over the rendered HTML.
Style expectations for generated code
- Use
try..finally..Freearound every FlexCel object. Don't rely on interface reference counting — these are not interfaces. - Use 1-based literals explicitly (
SetCellValue(1, 1, ...)) — do not pretend indices are 0-based. - Prefer the generic overloads (
TFormula.Create('=...'),TCellValue) over implicit conversions when the intent is ambiguous. - When exporting to PDF/HTML/images, include the platform-support unit in the example's
.dprblock or mention it in a comment — otherwise rendering will fail at runtime with a missing-graphics-engine error. - Don't invent method names. If unsure, check the API markdown under
api/<unit>/<class>/<member>.mdin the doc source, or tell the user to verify with APIMate.