Uma planilha.
Dentro da sua aplicação.
O sgcSpreadsheet é o novo controle de planilha estilo Excel do sgcUI. Seus usuários digitam valores e fórmulas, trabalham com várias planilhas e criam gráficos a partir de suas células. Seu código preenche a pasta de trabalho, adiciona suas próprias funções e lê e grava arquivos XLSX que o Excel abre.
- VCL
- FireMonkey
- C++ Builder
- WinForms
- WPF
- Avalonia

Mais cedo ou mais tarde, toda aplicação empresarial precisa de uma planilha. Os usuários planejam um orçamento, precificam uma cotação, calculam custos ou conferem os números que um cliente enviou em um arquivo Excel, e esperam fórmulas, várias planilhas e gráficos enquanto fazem isso. Uma grade simples não basta para nada disso.
O sgcSpreadsheet é um controle de planilha estilo Excel construído sobre o sgcGrid e sobre um motor de fórmulas compartilhado no sgcUICore. Ele mantém uma pasta de trabalho de verdade, com planilhas, nomes definidos e matrizes dinâmicas, recalcula apenas as células afetadas por uma alteração e carrega e grava XLSX. O mesmo motor alimenta os controles VCL e FireMonkey para Delphi e C++ Builder e os controles WinForms, WPF e Avalonia para .NET.
sgcSpreadsheet em ação
Fórmulas, matrizes que se espalham, várias planilhas, gráficos dinâmicos e arquivos XLSX em todas as plataformas. Também no YouTube.
Fórmulas que seus usuários já conhecem
Quem trabalha com números pensa em fórmulas do Excel. No sgcSpreadsheet, um texto que começa com = é uma fórmula, e o motor calcula 211 funções de planilha: funções matemáticas, estatísticas, de texto, de data e hora, de pesquisa, lógicas, de informação e de matrizes dinâmicas. O motor fica no sgcUICore, de modo que as fórmulas do sgcGrid dão os mesmos resultados.
=SUM(B2:B13)=XLOOKUP(C2,…)=Sheet2!A1.=SORT(A2:A20)↓#SPILL! e A1#.B2 → B14 → D3=SUM(Sales)*(1+Rate)'007
Planilhas, nomes e matrizes que se espalham
Uma planilha eletrônica é uma pasta de trabalho com uma ou mais planilhas. As guias sob a grade trocam a planilha e a guia + adiciona uma nova, e uma planilha renomeada é renomeada em todas as fórmulas que a referenciam. No código, AddSheet, ActiveSheet e SheetCount gerenciam as planilhas, e Grid.Sheets.Names guarda os nomes definidos da pasta de trabalho.
O método abaixo preenche uma lista de preços, dá nomes aos seus intervalos e monta uma planilha de resumo que a lê. SORT retorna a lista completa de produtos, que se espalha pelas células abaixo, e A1# se refere a esse intervalo espalhado, por maior que a lista cresça. XLOOKUP encontra um preço e o nome VAT acrescenta o imposto.
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;
O resumo mostra os três produtos em ordem, 3 itens e 264,99 para o monitor. Altere um preço na primeira planilha e apenas as células que dependem dele são recalculadas. FreezePanes(1, 0) mantém uma linha de cabeçalho fixa enquanto o resto da planilha rola, e as barras de fórmulas TsgcVCLSpreadsheetFormulaBar e TsgcFMXSpreadsheetFormulaBar oferecem aos seus usuários uma caixa de nome e a fórmula da célula atual.
Suas próprias funções
Aplicações de engenharia, finanças e laboratório precisam de seus próprios cálculos. O motor de fórmulas tem um registro de funções, e uma função registrada ali funciona em todas as fórmulas da planilha, do sgcGrid e de um TsgcCalcEvaluator, exatamente como uma função nativa. O manipulador é uma função simples, registrada na seção initialization de uma 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.
Adicione a unit ao projeto e seus usuários poderão digitar =MARKUP(B2). Com matrizes dinâmicas, o motor chama a função para cada elemento de um argumento do tipo matriz, de modo que =MARKUP(B2:B4, 0.3) espalha um resultado por preço e =SUM(MARKUP(B2:B4)) funciona sem nenhum código extra. Uma função que precisa das células de um intervalo é registrada com o sinalizador cfRanges e as percorre com um iterador.
Gráficos a partir de intervalos de células
Um gráfico mostra os valores de um intervalo de células e flutua sobre a planilha, como um gráfico no Excel. Ele é desenhado pelo sgcCharts e, quando uma célula do intervalo muda, ou uma fórmula do intervalo gera um novo valor, o gráfico acompanha. Os usuários movem e redimensionam os gráficos com o mouse, e cada planilha tem seus próprios gráficos.
- 7 tipos de gráfico: colunas, barras, linhas, área, pizza, rosca e dispersão.
AddChartcom um intervalo como'A1:D10'ou'Sheet1!A1:D10', com os nomes das séries e as categorias lidos da linha e da coluna de cabeçalho.TsgcSpreadsheetChartsguarda os gráficos de cada planilha, eSaveToXLSXos grava como gráficos que o Excel abre.
XLSX na entrada, XLSX na saída
Os clientes enviam arquivos XLSX e esperam receber arquivos XLSX de volta. LoadFromXLSX lê todas as planilhas de uma pasta de trabalho e SaveToXLSX grava todas as planilhas, a partir de um nome de arquivo ou de um stream, de modo que um arquivo vai e volta entre a sua aplicação e o Excel.
- Valores, fórmulas e formatos de célula.
- Nomes definidos e matrizes dinâmicas.
- Painéis congelados e larguras de coluna.
- Gráficos, salvos como gráficos que o Excel abre.
VCL, FireMonkey e .NET
Delphi e C++ Builder recebem TsgcVCLSpreadsheet para VCL e TsgcFMXSpreadsheet para FireMonkey, cada um com sua barra de fórmulas. Para .NET há TsgcWinFormsSpreadsheet, TsgcWpfSpreadsheet e TsgcAvaloniaSpreadsheet, também com barras de fórmulas, nos pacotes NuGet esegece.sgcSpreadsheet, esegece.sgcSpreadsheet.WinForms, esegece.sgcSpreadsheet.Wpf e esegece.sgcSpreadsheet.Avalonia. Os controles .NET usam os mesmos nomes dos controles Delphi, e uma função personalizada pode ser uma 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");
Execute as demos
As demos de Delphi e C++ Builder são instaladas com o trial do sgcUI, e as demos .NET acompanham o download .NET Registered.

- Basic: uma pasta de trabalho de vendas criada em código com SUM, AVERAGE, IF e XLOOKUP, uma planilha de resumo que a lê, uma linha de cabeçalho congelada, a barra de fórmulas e Abrir e Salvar como XLSX.
- Functions: funções matemáticas, de texto, de data e hora, de pesquisa e de matrizes dinâmicas, uma planilha por categoria, com cada fórmula ao lado do seu resultado.
- Charts: gráficos de colunas, linhas e pizza a partir de intervalos de células. Edite uma receita ou um custo e os gráficos acompanham.
- CustomFunction, BasicFMX e ChartsFMX: funções registradas pela aplicação, e as demos Basic e Charts em FireMonkey. Basic e Charts também acompanham como projetos C++ Builder.
- .NET: SpreadsheetBasic para WinForms, SpreadsheetBasicWpf, SpreadsheetBasicAvalonia, SpreadsheetFunctions, SpreadsheetCharts e SpreadsheetCustomFunction.
Onde o sgcSpreadsheet está incluído
O sgcSpreadsheet está incluído no sgcUI Enterprise e no pacote All-Access, e também é vendido separadamente como pacote único para Delphi e C++ Builder e para .NET. A instalação do sgcSpreadsheet instala também o sgcGrid e o sgcCharts, de modo que a grade e os gráficos sempre funcionam. Não existe edição Community gratuita. Veja a página de preços para mais detalhes.
Dê uma planilha aos seus usuários
O sgcSpreadsheet faz parte do sgcUI para Delphi e C++ Builder, em VCL e FireMonkey, e para .NET em WinForms, WPF e Avalonia.
Dúvidas ou comentários? Fale conosco, você receberá a resposta de quem escreveu o código.
