sgcSpreadsheet: un foglio di calcolo in stile Excel per Delphi e .NET

· Componenti
sgcSpreadsheet: un foglio di calcolo in stile Excel per Delphi e .NET | Blog eSeGeCe
✦  sgcUI · sgcSpreadsheet

Un foglio di calcolo.
Dentro la tua applicazione.

sgcSpreadsheet è il nuovo controllo foglio di calcolo in stile Excel di sgcUI. I tuoi utenti digitano valori e formule, lavorano su più fogli e disegnano grafici dalle loro celle. Il tuo codice compila la cartella di lavoro, aggiunge le proprie funzioni e legge e scrive file XLSX che Excel apre.

  • VCL
  • FireMonkey
  • C++ Builder
  • WinForms
  • WPF
  • Avalonia
sgcSpreadsheet con una tabella di vendite e grafici a colonne, a linee e a torta disegnati dai suoi intervalli di celle
211funzioni di foglio
7tipi di grafico
5framework UI
XLSXcaricamento e salvataggio

Prima o poi ogni applicazione aziendale ha bisogno di un foglio di calcolo. Gli utenti pianificano un budget, preparano un preventivo, calcolano costi o controllano i numeri che un cliente ha inviato in un file Excel, e si aspettano formule, più fogli e grafici mentre lo fanno. Una semplice griglia non basta per nulla di tutto questo.

sgcSpreadsheet è un controllo foglio di calcolo in stile Excel costruito su sgcGrid e su un motore di formule condiviso in sgcUICore. Mantiene una vera cartella di lavoro con fogli, nomi definiti e array dinamici, ricalcola solo le celle interessate da una modifica e carica e salva XLSX. Lo stesso motore alimenta i controlli VCL e FireMonkey per Delphi e C++ Builder e i controlli WinForms, WPF e Avalonia per .NET.

sgcSpreadsheet in azione

Formule, array che si espandono, più fogli, grafici in tempo reale e file XLSX su ogni piattaforma. Anche su YouTube.

Formule che i tuoi utenti già conoscono

Chi lavora con i numeri ragiona in formule Excel. In sgcSpreadsheet un testo che inizia con = è una formula, e il motore calcola 211 funzioni di foglio: matematiche, statistiche, di testo, di data e ora, di ricerca, logiche, informative e di array dinamici. Il motore risiede in sgcUICore, quindi le formule di sgcGrid danno gli stessi risultati.

=SUM(B2:B13)
211 funzioniDa SUM e AVERAGE a TEXT e alle funzioni di data e ora, un unico motore per ogni piattaforma.
=XLOOKUP(C2,…)
XLOOKUP inclusoLe funzioni di ricerca che i tuoi utenti usano per prime, con riferimenti ad altri fogli come =Sheet2!A1.
=SORT(A2:A20)↓
Array che si espandonoSEQUENCE, SORT, FILTER e UNIQUE riempiono le celle sottostanti, con riferimenti #SPILL! e A1#.
B2 → B14 → D3
Ricalcolo incrementaleUn grafo delle dipendenze sa quali celle leggono quali, quindi una modifica ricalcola solo le celle che ne dipendono.
=SUM(Sales)*(1+Rate)
Nomi definitiLe formule usano nomi significativi al posto degli indirizzi di cella, con ambito di cartella di lavoro e di foglio.
'007
Testo forzatoUn apostrofo iniziale memorizza il testo così come digitato, quindi un codice come 007 resta un testo.
La demo Functions con formule matematiche e i loro risultati, un foglio per categoria
La demo Functions: un foglio per categoria, ogni formula accanto al suo risultato

Fogli, nomi e array che si espandono

Un foglio di calcolo è una cartella di lavoro con uno o più fogli. Le schede sotto la griglia cambiano foglio e la scheda + ne aggiunge uno, e un foglio rinominato viene rinominato in ogni formula che vi fa riferimento. Dal codice, AddSheet, ActiveSheet e SheetCount gestiscono i fogli, e Grid.Sheets.Names conserva i nomi definiti della cartella di lavoro.

Il metodo seguente compila un listino prezzi, assegna dei nomi ai suoi intervalli e crea un foglio di riepilogo che lo legge. SORT restituisce l'intero elenco dei prodotti, che si espande nelle celle sottostanti, e A1# fa riferimento a quell'intervallo espanso per quanto cresca l'elenco. XLOOKUP trova un prezzo e il nome VAT aggiunge l'imposta.

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;

Il riepilogo mostra i tre prodotti in ordine, 3 elementi e 264,99 per il monitor. Cambia un prezzo nel primo foglio e solo le celle che ne dipendono vengono ricalcolate. FreezePanes(1, 0) mantiene fissa una riga di intestazione mentre il resto del foglio scorre, e le barre della formula TsgcVCLSpreadsheetFormulaBar e TsgcFMXSpreadsheetFormulaBar offrono ai tuoi utenti una casella del nome e la formula della cella corrente.

Le tue funzioni

Le applicazioni di ingegneria, finanza e laboratorio hanno bisogno di calcoli propri. Il motore di formule dispone di un registro delle funzioni, e una funzione registrata al suo interno funziona in ogni formula del foglio di calcolo, di sgcGrid e di un TsgcCalcEvaluator, esattamente come una funzione integrata. Il gestore è una semplice funzione, registrata dalla sezione initialization di una 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.

Aggiungi la unit al progetto e i tuoi utenti potranno digitare =MARKUP(B2). Con gli array dinamici il motore chiama la funzione per ogni elemento di un argomento array, quindi =MARKUP(B2:B4, 0.3) espande un risultato per ogni prezzo e =SUM(MARKUP(B2:B4)) funziona senza codice aggiuntivo. Una funzione che ha bisogno delle celle di un intervallo viene registrata con il flag cfRanges e le percorre con un iteratore.

Grafici da intervalli di celle

Un grafico mostra i valori di un intervallo di celle e fluttua sopra il foglio, come un grafico in Excel. Viene disegnato da sgcCharts e, quando cambia una cella dell'intervallo, o una formula dell'intervallo restituisce un nuovo valore, il grafico si aggiorna. Gli utenti spostano e ridimensionano i grafici con il mouse, e ogni foglio ha i propri grafici.

XLSX in ingresso, XLSX in uscita

I clienti inviano file XLSX e si aspettano file XLSX in risposta. LoadFromXLSX legge ogni foglio di una cartella di lavoro e SaveToXLSX scrive ogni foglio, da un nome di file o da uno stream, così un file fa il giro completo tra la tua applicazione ed Excel.

VCL, FireMonkey e .NET

Delphi e C++ Builder dispongono di TsgcVCLSpreadsheet per VCL e TsgcFMXSpreadsheet per FireMonkey, ciascuno con la propria barra della formula. Per .NET ci sono TsgcWinFormsSpreadsheet, TsgcWpfSpreadsheet e TsgcAvaloniaSpreadsheet, anch'essi con barre della formula, nei pacchetti NuGet esegece.sgcSpreadsheet, esegece.sgcSpreadsheet.WinForms, esegece.sgcSpreadsheet.Wpf e esegece.sgcSpreadsheet.Avalonia. I controlli .NET usano gli stessi nomi di quelli Delphi, e una funzione personalizzata può essere una 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");

Esegui le demo

Le demo Delphi e C++ Builder si installano con la versione di prova di sgcUI, e le demo .NET sono incluse nel download .NET Registered.

La demo VCL Basic con una cartella di lavoro di vendite e la barra della formula
Basic: una cartella di lavoro di vendite con un foglio di riepilogo, una riga di intestazione bloccata e la barra della formula

Dove è incluso sgcSpreadsheet

sgcSpreadsheet è incluso in sgcUI Enterprise e nel bundle All-Access, e si acquista anche singolarmente come pacchetto unico per Delphi e C++ Builder e per .NET. L'installazione di sgcSpreadsheet installa anche sgcGrid e sgcCharts, quindi la griglia e i grafici funzionano sempre. Non esiste una edizione Community gratuita. Consulta la pagina dei prezzi per i dettagli.

Offri ai tuoi utenti un foglio di calcolo

sgcSpreadsheet fa parte di sgcUI per Delphi e C++ Builder, su VCL e FireMonkey, e per .NET su WinForms, WPF e Avalonia.

Domande o suggerimenti? Contattaci, riceverai una risposta da chi ha scritto il codice.