sgcSpreadsheet: uma planilha estilo Excel para Delphi e .NET

· Componentes
sgcSpreadsheet: uma planilha estilo Excel para Delphi e .NET | Blog eSeGeCe
✦  sgcUI · sgcSpreadsheet

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
O sgcSpreadsheet com uma tabela de vendas e gráficos de colunas, linhas e pizza criados a partir de seus intervalos de células
211funções de planilha
7tipos de gráfico
5frameworks de UI
XLSXcarregar e salvar

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)
211 funçõesDe SUM e AVERAGE a TEXT e às funções de data e hora, um único motor para todas as plataformas.
=XLOOKUP(C2,…)
XLOOKUP incluídaAs funções de pesquisa que seus usuários procuram primeiro, com referências a outras planilhas como =Sheet2!A1.
=SORT(A2:A20)↓
Matrizes que se espalhamSEQUENCE, SORT, FILTER e UNIQUE preenchem as células abaixo delas, com referências #SPILL! e A1#.
B2 → B14 → D3
Recálculo incrementalUm grafo de dependências sabe qual célula lê qual, de modo que uma alteração recalcula apenas as células que dependem dela.
=SUM(Sales)*(1+Rate)
Nomes definidosAs fórmulas usam nomes significativos em vez de endereços de células, com escopo de pasta de trabalho e de planilha.
'007
Texto forçadoUm apóstrofo inicial armazena o texto como foi digitado, de modo que um código como 007 continua sendo um texto.
A demo Functions com fórmulas matemáticas e seus resultados, uma planilha por categoria
A demo Functions: uma planilha por categoria, cada fórmula ao lado do seu resultado

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.

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.

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.

A demo VCL Basic com uma pasta de trabalho de vendas e a barra de fórmulas
Basic: uma pasta de trabalho de vendas com uma planilha de resumo, uma linha de cabeçalho congelada e a barra de fórmulas

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.