sgcSpreadsheet : un tableur de style Excel pour Delphi et .NET

· Composants
sgcSpreadsheet : un tableur de style Excel pour Delphi et .NET | Blog eSeGeCe
✦  sgcUI · sgcSpreadsheet

Un tableur.
Dans votre application.

sgcSpreadsheet est le nouveau contrôle tableur de style Excel de sgcUI. Vos utilisateurs saisissent des valeurs et des formules, travaillent sur plusieurs feuilles et dessinent des graphiques à partir de leurs cellules. Votre code remplit le classeur, ajoute ses propres fonctions et lit et écrit des fichiers XLSX qu'Excel ouvre.

  • VCL
  • FireMonkey
  • C++ Builder
  • WinForms
  • WPF
  • Avalonia
sgcSpreadsheet avec un tableau de ventes et des graphiques en colonnes, en courbes et en secteurs tracés à partir de ses plages de cellules
211fonctions de feuille de calcul
7types de graphiques
5frameworks d'interface
XLSXchargement et enregistrement

Tôt ou tard, toute application métier a besoin d'une feuille de calcul. Les utilisateurs planifient un budget, chiffrent un devis, calculent des coûts ou vérifient les chiffres qu'un client a envoyés dans un fichier Excel, et ils attendent des formules, plusieurs feuilles et des graphiques pour le faire. Une simple grille ne suffit à aucun de ces usages.

sgcSpreadsheet est un contrôle tableur de style Excel construit sur sgcGrid et sur un moteur de formules partagé dans sgcUICore. Il conserve un véritable classeur avec des feuilles, des noms définis et des tableaux dynamiques, ne recalcule que les cellules touchées par une modification, et charge et enregistre du XLSX. Le même moteur alimente les contrôles VCL et FireMonkey pour Delphi et C++ Builder ainsi que les contrôles WinForms, WPF et Avalonia pour .NET.

sgcSpreadsheet en action

Formules, tableaux à débordement, plusieurs feuilles, graphiques en direct et fichiers XLSX sur toutes les plateformes. Aussi sur YouTube.

Des formules que vos utilisateurs connaissent déjà

Ceux qui travaillent avec des chiffres pensent en formules Excel. Dans sgcSpreadsheet, un texte qui commence par = est une formule, et le moteur calcule 211 fonctions de feuille de calcul : mathématiques, statistiques, texte, date et heure, recherche, logiques, informations et tableaux dynamiques. Le moteur réside dans sgcUICore, si bien que les formules de sgcGrid donnent les mêmes résultats.

=SUM(B2:B13)
211 fonctionsDe SUM et AVERAGE à TEXT et aux fonctions de date et d'heure, un seul moteur pour toutes les plateformes.
=XLOOKUP(C2,…)
XLOOKUP inclusLes fonctions de recherche que vos utilisateurs utilisent en premier, avec des références à d'autres feuilles comme =Sheet2!A1.
=SORT(A2:A20)↓
Tableaux à débordementSEQUENCE, SORT, FILTER et UNIQUE remplissent les cellules situées en dessous, avec les références #SPILL! et A1#.
B2 → B14 → D3
Recalcul incrémentalUn graphe de dépendances sait quelle cellule lit quelle autre, donc une modification ne recalcule que les cellules qui en dépendent.
=SUM(Sales)*(1+Rate)
Noms définisLes formules utilisent des noms explicites à la place des adresses de cellules, avec une portée classeur ou feuille.
'007
Texte forcéUne apostrophe initiale stocke le texte tel qu'il est saisi, si bien qu'un code comme 007 reste un texte.
La démo Functions avec des formules mathématiques et leurs résultats, une feuille par catégorie
La démo Functions : une feuille par catégorie, chaque formule à côté de son résultat

Feuilles, noms et tableaux à débordement

Un tableur est un classeur composé d'une ou plusieurs feuilles. Les onglets sous la grille changent de feuille et l'onglet + en ajoute une, et une feuille renommée l'est dans toutes les formules qui s'y réfèrent. Depuis le code, AddSheet, ActiveSheet et SheetCount gèrent les feuilles, et Grid.Sheets.Names conserve les noms définis du classeur.

La méthode ci-dessous remplit une liste de prix, nomme ses plages et construit une feuille de synthèse qui la lit. SORT renvoie toute la liste des produits, qui déborde dans les cellules situées en dessous, et A1# désigne cette plage débordante quelle que soit la longueur de la liste. XLOOKUP trouve un prix et le nom VAT ajoute la taxe.

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;

La synthèse affiche les trois produits dans l'ordre, 3 articles, et 264,99 pour l'écran. Modifiez un prix sur la première feuille et seules les cellules qui en dépendent sont recalculées. FreezePanes(1, 0) maintient une ligne d'en-tête en place pendant que le reste de la feuille défile, et les barres de formule TsgcVCLSpreadsheetFormulaBar et TsgcFMXSpreadsheetFormulaBar offrent à vos utilisateurs une zone de nom et la formule de la cellule courante.

Vos propres fonctions

Les applications d'ingénierie, de finance et de laboratoire ont besoin de leurs propres calculs. Le moteur de formules dispose d'un registre de fonctions, et une fonction qui y est enregistrée fonctionne dans toutes les formules du tableur, de sgcGrid et d'un TsgcCalcEvaluator, exactement comme une fonction intégrée. Le gestionnaire est une simple fonction, enregistrée depuis la section initialization d'une unité.

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.

Ajoutez l'unité au projet et vos utilisateurs peuvent saisir =MARKUP(B2). Avec les tableaux dynamiques, le moteur appelle la fonction pour chaque élément d'un argument de type tableau, de sorte que =MARKUP(B2:B4, 0.3) déborde avec un résultat par prix et que =SUM(MARKUP(B2:B4)) fonctionne sans code supplémentaire. Une fonction qui a besoin des cellules d'une plage est enregistrée avec l'indicateur cfRanges et les parcourt avec un itérateur.

Graphiques issus de plages de cellules

Un graphique affiche les valeurs d'une plage de cellules et flotte au-dessus de la feuille, comme un graphique dans Excel. Il est dessiné par sgcCharts, et lorsqu'une cellule de la plage change, ou qu'une formule de la plage donne une nouvelle valeur, le graphique suit. Les utilisateurs déplacent et redimensionnent les graphiques à la souris, et chaque feuille possède ses propres graphiques.

XLSX en entrée, XLSX en sortie

Les clients envoient des fichiers XLSX et attendent des fichiers XLSX en retour. LoadFromXLSX lit toutes les feuilles d'un classeur et SaveToXLSX écrit toutes les feuilles, à partir d'un nom de fichier ou d'un flux, de sorte qu'un fichier fait l'aller-retour entre votre application et Excel.

VCL, FireMonkey et .NET

Delphi et C++ Builder disposent de TsgcVCLSpreadsheet pour VCL et de TsgcFMXSpreadsheet pour FireMonkey, chacun avec sa barre de formule. Pour .NET, il y a TsgcWinFormsSpreadsheet, TsgcWpfSpreadsheet et TsgcAvaloniaSpreadsheet, eux aussi avec des barres de formule, dans les packages NuGet esegece.sgcSpreadsheet, esegece.sgcSpreadsheet.WinForms, esegece.sgcSpreadsheet.Wpf et esegece.sgcSpreadsheet.Avalonia. Les contrôles .NET utilisent les mêmes noms que ceux de Delphi, et une fonction personnalisée peut être une lambda.

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");

Lancez les démos

Les démos Delphi et C++ Builder s'installent avec l'évaluation de sgcUI, et les démos .NET sont fournies avec le téléchargement .NET Registered.

La démo VCL Basic avec un classeur de ventes et la barre de formule
Basic : un classeur de ventes avec une feuille de synthèse, une ligne d'en-tête figée et la barre de formule

Où sgcSpreadsheet est inclus

sgcSpreadsheet est inclus dans sgcUI Enterprise et dans le pack All-Access, et il est vendu seul sous forme de package unique pour Delphi et C++ Builder ainsi que pour .NET. L'installation de sgcSpreadsheet installe aussi sgcGrid et sgcCharts, de sorte que la grille et les graphiques fonctionnent toujours. Il n'existe pas d'édition Community gratuite. Consultez la page des tarifs pour les détails.

Offrez un tableur à vos utilisateurs

sgcSpreadsheet fait partie de sgcUI pour Delphi et C++ Builder, sur VCL et FireMonkey, et pour .NET sur WinForms, WPF et Avalonia.

Des questions ou des retours ? Contactez-nous, vous recevrez une réponse de ceux qui ont écrit le code.