sgcSpreadsheet: eine Tabellenkalkulation im Excel-Stil für Delphi und .NET

· Komponenten
sgcSpreadsheet: eine Tabellenkalkulation im Excel-Stil für Delphi und .NET
✦  sgcUI · sgcSpreadsheet

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
sgcSpreadsheet mit einer Verkaufstabelle sowie Säulen-, Linien- und Kreisdiagrammen, die aus ihren Zellbereichen gezeichnet werden
211Tabellenfunktionen
7Diagrammtypen
5UI-Frameworks
XLSXladen und speichern

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)
211 FunktionenVon SUM und AVERAGE bis TEXT und den Datums- und Zeitfunktionen, eine Engine für jede Plattform.
=XLOOKUP(C2,…)
XLOOKUP inklusiveDie Nachschlagefunktionen, nach denen Ihre Anwender zuerst greifen, mit Verweisen auf andere Tabellenblätter wie =Sheet2!A1.
=SORT(A2:A20)↓
Arrays, die überlaufenSEQUENCE, SORT, FILTER und UNIQUE füllen die Zellen darunter, mit #SPILL! und A1#-Verweisen.
B2 → B14 → D3
Inkrementelle NeuberechnungEin Abhängigkeitsgraph weiß, welche Zellen welche lesen, sodass eine Änderung nur die davon abhängigen Zellen neu berechnet.
=SUM(Sales)*(1+Rate)
Definierte NamenFormeln verwenden sprechende Namen statt Zelladressen, mit Gültigkeitsbereich für Arbeitsmappe und Tabellenblatt.
'007
Erzwungener TextEin vorangestelltes Apostroph speichert den Text wie eingegeben, sodass ein Code wie 007 ein Text bleibt.
Die Demo Functions mit mathematischen Formeln und ihren Ergebnissen, ein Tabellenblatt pro Kategorie
Die Demo Functions: ein Tabellenblatt pro Kategorie, jede Formel neben ihrem Ergebnis

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.

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.

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.

Die VCL-Demo Basic mit einer Verkaufsarbeitsmappe und der Formelleiste
Basic: eine Verkaufsarbeitsmappe mit Übersichtsblatt, fixierter Kopfzeile und Formelleiste

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.