Eine Tabellenkalkulation.
In Ihrer Anwendung.
sgcSpreadsheet ist das neue Tabellenkalkulations-Control im Excel-Stil von sgcUI. Ihre Anwender tippen Werte und Formeln ein, arbeiten über mehrere Tabellenblätter hinweg und zeichnen Diagramme aus ihren Zellen. Ihr Code füllt die Arbeitsmappe, ergänzt eigene Funktionen und liest und schreibt XLSX-Dateien, die Excel öffnet.
- VCL
- FireMonkey
- C++ Builder
- WinForms
- WPF
- Avalonia

Früher oder später braucht jede Geschäftsanwendung eine Tabelle. Anwender planen ein Budget, kalkulieren ein Angebot, berechnen Kosten oder prüfen die Zahlen, die ein Kunde in einer Excel-Datei geschickt hat, und sie erwarten dabei Formeln, mehrere Tabellenblätter und Diagramme. Ein einfaches Grid reicht dafür nicht aus.
sgcSpreadsheet ist ein Tabellenkalkulations-Control im Excel-Stil, das auf sgcGrid und auf einer in sgcUICore gemeinsam genutzten Formel-Engine aufbaut. Es führt eine echte Arbeitsmappe mit Tabellenblättern, definierten Namen und dynamischen Arrays, berechnet nur die Zellen neu, die von einer Änderung betroffen sind, und lädt und speichert XLSX. Dieselbe Engine steuert die VCL- und FireMonkey-Controls für Delphi und C++ Builder sowie die WinForms-, WPF- und Avalonia-Controls für .NET.
sgcSpreadsheet in Aktion
Formeln, überlaufende Arrays, mehrere Tabellenblätter, Live-Diagramme und XLSX-Dateien auf jeder Plattform. Auch auf YouTube.
Formeln, die Ihre Anwender schon kennen
Wer mit Zahlen arbeitet, denkt in Excel-Formeln. In sgcSpreadsheet ist ein Text, der mit = beginnt, eine Formel, und die Engine berechnet 211 Tabellenfunktionen: Mathematik, Statistik, Text, Datum und Uhrzeit, Nachschlagen, Logik, Information und dynamische Array-Funktionen. Die Engine steckt in sgcUICore, sodass Formeln in sgcGrid dieselben Ergebnisse liefern.
=SUM(B2:B13)=XLOOKUP(C2,…)=Sheet2!A1.=SORT(A2:A20)↓#SPILL! und A1#-Verweisen.B2 → B14 → D3=SUM(Sales)*(1+Rate)'007
Tabellenblätter, Namen und überlaufende Arrays
Eine Tabellenkalkulation ist eine Arbeitsmappe mit einem oder mehreren Tabellenblättern. Die Register unter dem Grid wechseln das Blatt, das +-Register fügt eines hinzu, und ein umbenanntes Blatt wird in jeder Formel umbenannt, die darauf verweist. Im Code verwalten AddSheet, ActiveSheet und SheetCount die Blätter, und Grid.Sheets.Names hält die definierten Namen der Arbeitsmappe.
Die folgende Methode füllt eine Preisliste, benennt ihre Bereiche und baut ein Übersichtsblatt, das sie liest. SORT liefert die gesamte Produktliste, die in die darunterliegenden Zellen überläuft, und A1# verweist auf diesen übergelaufenen Bereich, egal wie lang die Liste wird. XLOOKUP findet einen Preis, und der Name VAT addiert die Steuer.
uses
sgcSpreadsheet_VCL;
procedure TForm1.BuildPriceList;
var
vSummary: Integer;
begin
// Sheet1: a price list, row and column are 0-based, (0, 0) is A1
sgcVCLSpreadsheet1.SetCellInput(0, 0, 'Product');
sgcVCLSpreadsheet1.SetCellInput(0, 1, 'Price');
sgcVCLSpreadsheet1.SetCellInput(1, 0, 'Monitor');
sgcVCLSpreadsheet1.SetCellInput(1, 1, '219');
sgcVCLSpreadsheet1.SetCellInput(2, 0, 'Keyboard');
sgcVCLSpreadsheet1.SetCellInput(2, 1, '49');
sgcVCLSpreadsheet1.SetCellInput(3, 0, 'Mouse');
sgcVCLSpreadsheet1.SetCellInput(3, 1, '25');
// defined names: formulas use them instead of cell addresses
sgcVCLSpreadsheet1.Grid.Sheets.Names.Add('Products', '=Sheet1!$A$2:$A$4');
sgcVCLSpreadsheet1.Grid.Sheets.Names.Add('Prices', '=Sheet1!$B$2:$B$4');
sgcVCLSpreadsheet1.Grid.Sheets.Names.Add('VAT', '0.21');
// a second sheet that reads the first one
vSummary := sgcVCLSpreadsheet1.AddSheet('Summary');
sgcVCLSpreadsheet1.ActiveSheet := vSummary;
// a dynamic array: the sorted names spill into A1:A3
sgcVCLSpreadsheet1.SetCellInput(0, 0, '=SORT(Products)');
// A1# is the whole spilled range, however long the list grows
sgcVCLSpreadsheet1.SetCellInput(0, 2, 'Items');
sgcVCLSpreadsheet1.SetCellInput(0, 3, '=ROWS(A1#)');
// XLOOKUP finds the price of a product, VAT included
sgcVCLSpreadsheet1.SetCellInput(1, 2, 'Monitor');
sgcVCLSpreadsheet1.SetCellInput(1, 3, '=XLOOKUP(C2,Products,Prices)*(1+VAT)');
// every sheet, formula and name goes to a file that Excel opens
sgcVCLSpreadsheet1.SaveToXLSX('prices.xlsx');
end;
Die Übersicht zeigt die drei Produkte in sortierter Reihenfolge, 3 Einträge und 264,99 für den Monitor. Ändern Sie einen Preis auf dem ersten Blatt, werden nur die davon abhängigen Zellen neu berechnet. FreezePanes(1, 0) hält eine Kopfzeile fest, während der Rest des Blatts scrollt, und die Formelleisten TsgcVCLSpreadsheetFormulaBar und TsgcFMXSpreadsheetFormulaBar geben Ihren Anwendern ein Namenfeld und die Formel der aktuellen Zelle.
Ihre eigenen Funktionen
Anwendungen für Technik, Finanzen und Labor brauchen ihre eigenen Berechnungen. Die Formel-Engine hat ein Funktionsregister, und eine dort registrierte Funktion arbeitet in jeder Formel der Tabellenkalkulation, von sgcGrid und eines TsgcCalcEvaluator, genau wie eine eingebaute. Der Handler ist eine einfache Funktion, die im initialization-Abschnitt einer Unit registriert wird.
unit MyFunctions;
interface
implementation
uses
sgcUICore_Calc;
{ =MARKUP(price, [rate]): the price plus a margin, 20% by default }
function DoMarkup(aCall: TsgcCalcCall): Variant;
var
vPrice, vRate: Double;
vError: string;
begin
vError := aCall.Number(0, vPrice);
vRate := 0.2;
if (vError = '') and (aCall.Count > 1) then
vError := aCall.Number(1, vRate);
if vError <> '' then
Result := vError
else
Result := vPrice * (1 + vRate);
end;
initialization
// MARKUP takes 1 or 2 arguments
sgcCalcRegisterFunction('MARKUP', DoMarkup, 1, 2);
end.
Fügen Sie die Unit zum Projekt hinzu, und Ihre Anwender können =MARKUP(B2) eintippen. Bei dynamischen Arrays ruft die Engine die Funktion für jedes Element eines Array-Arguments auf, sodass =MARKUP(B2:B4, 0.3) pro Preis ein Ergebnis überlaufen lässt und =SUM(MARKUP(B2:B4)) ohne zusätzlichen Code funktioniert. Eine Funktion, die die Zellen eines Bereichs benötigt, wird mit dem Flag cfRanges registriert und durchläuft sie mit einem Iterator.
Diagramme aus Zellbereichen
Ein Diagramm zeigt die Werte eines Zellbereichs und schwebt über dem Blatt, wie ein Diagramm in Excel. Es wird von sgcCharts gezeichnet, und wenn sich eine Zelle des Bereichs ändert oder eine Formel des Bereichs einen neuen Wert liefert, folgt das Diagramm. Anwender verschieben Diagramme mit der Maus und ändern ihre Größe, und jedes Blatt hat seine eigenen Diagramme.
- 7 Diagrammtypen: Säule, Balken, Linie, Fläche, Kreis, Ring und Punkt (XY).
AddChartmit einem Bereich wie'A1:D10'oder'Sheet1!A1:D10', wobei Reihennamen und Kategorien aus der Kopfzeile und der ersten Spalte gelesen werden.TsgcSpreadsheetChartshält die Diagramme jedes Blatts, undSaveToXLSXschreibt sie als Diagramme, die Excel öffnet.
XLSX hinein, XLSX heraus
Kunden schicken XLSX-Dateien und erwarten XLSX-Dateien zurück. LoadFromXLSX liest jedes Blatt einer Arbeitsmappe und SaveToXLSX schreibt jedes Blatt, aus einem Dateinamen oder einem Stream, sodass eine Datei zwischen Ihrer Anwendung und Excel hin- und hergehen kann.
- Werte, Formeln und Zellformate.
- Definierte Namen und dynamische Arrays.
- Fixierte Bereiche und Spaltenbreiten.
- Diagramme, gespeichert als Diagramme, die Excel öffnet.
VCL, FireMonkey und .NET
Delphi und C++ Builder erhalten TsgcVCLSpreadsheet für VCL und TsgcFMXSpreadsheet für FireMonkey, jeweils mit eigener Formelleiste. Für .NET gibt es TsgcWinFormsSpreadsheet, TsgcWpfSpreadsheet und TsgcAvaloniaSpreadsheet, ebenfalls mit Formelleisten, in den NuGet-Paketen esegece.sgcSpreadsheet, esegece.sgcSpreadsheet.WinForms, esegece.sgcSpreadsheet.Wpf und esegece.sgcSpreadsheet.Avalonia. Die .NET-Controls verwenden dieselben Namen wie die Delphi-Controls, und eine eigene Funktion kann ein Lambda sein.
using esegece.sgcSpreadsheet;
using esegece.sgcUICore;
// once at startup, before the first formula is parsed
sgcUICore_Calc.sgcCalcRegisterFunction("MARKUP", aCall =>
{
double vPrice;
double vRate = 0.2;
string vError = aCall.Number(0, out vPrice);
if ((vError.Length == 0) && (aCall.Count > 1))
vError = aCall.Number(1, out vRate);
if (vError.Length > 0)
return vError;
return vPrice * (1 + vRate);
}, 1, 2);
// sheet is a TsgcWinFormsSpreadsheet: open a workbook made in Excel
sheet.LoadFromXLSX("prices.xlsx");
sheet.ActiveSheet = 0;
// the custom function spills over the whole price column
sheet.SetCellInput(0, 2, "=MARKUP(B2:B4, 0.3)");
// a column chart of the range, drawn by sgcCharts
TsgcSpreadsheetChart chart = sheet.AddChart(TsgcSpreadsheetChartType.sctColumn, "A1:B4");
chart.Title = "Prices";
sheet.SaveToXLSX("prices-markup.xlsx");
Die Demos ausprobieren
Die Demos für Delphi und C++ Builder werden mit der sgcUI-Testversion installiert, und die .NET-Demos sind im Registered-.NET-Download enthalten.

- Basic: eine im Code gebaute Verkaufsarbeitsmappe mit SUM, AVERAGE, IF und XLOOKUP, ein Übersichtsblatt, das sie liest, eine fixierte Kopfzeile, die Formelleiste sowie Öffnen und Speichern als XLSX.
- Functions: Mathematik-, Text-, Datums- und Zeit-, Nachschlage- und dynamische Array-Funktionen, ein Blatt pro Kategorie, jede Formel neben ihrem Ergebnis.
- Charts: Säulen-, Linien- und Kreisdiagramme aus Zellbereichen. Ändern Sie einen Umsatz oder eine Kostenposition, und die Diagramme folgen.
- CustomFunction, BasicFMX und ChartsFMX: von der Anwendung registrierte Funktionen sowie die Demos Basic und Charts unter FireMonkey. Basic und Charts gibt es auch als C++ Builder-Projekte.
- .NET: SpreadsheetBasic für WinForms, SpreadsheetBasicWpf, SpreadsheetBasicAvalonia, SpreadsheetFunctions, SpreadsheetCharts und SpreadsheetCustomFunction.
Wo sgcSpreadsheet enthalten ist
sgcSpreadsheet ist in sgcUI Enterprise und im All-Access-Paket enthalten und wird einzeln als Einzelpaket für Delphi und C++ Builder sowie für .NET verkauft. Die Installation von sgcSpreadsheet installiert auch sgcGrid und sgcCharts, sodass Grid und Diagramme immer funktionieren. Eine kostenlose Community-Edition gibt es nicht. Details finden Sie auf der Preisseite.
Geben Sie Ihren Anwendern eine Tabellenkalkulation
sgcSpreadsheet ist Teil von sgcUI für Delphi und C++ Builder, unter VCL und FireMonkey, und für .NET unter WinForms, WPF und Avalonia.
Fragen oder Feedback? Nehmen Sie Kontakt auf, Sie erhalten eine Antwort von den Menschen, die den Code geschrieben haben.
