sgcSpreadsheet: arkusz kalkulacyjny w stylu Excela dla Delphi i .NET

· Komponenty
sgcSpreadsheet: arkusz kalkulacyjny w stylu Excela dla Delphi i .NET
✦  sgcUI · sgcSpreadsheet

Arkusz kalkulacyjny.
W Twojej aplikacji.

sgcSpreadsheet to nowa kontrolka arkusza kalkulacyjnego w stylu Excela w sgcUI. Użytkownicy wpisują wartości i formuły, pracują na kilku arkuszach i rysują wykresy ze swoich komórek. Twój kod wypełnia skoroszyt, dodaje własne funkcje oraz odczytuje i zapisuje pliki XLSX, które otwiera Excel.

  • VCL
  • FireMonkey
  • C++ Builder
  • WinForms
  • WPF
  • Avalonia
sgcSpreadsheet z tabelą sprzedaży oraz wykresami kolumnowym, liniowym i kołowym narysowanymi z zakresów komórek
211funkcji arkusza
7typów wykresów
5frameworków UI
XLSXodczyt i zapis

Prędzej czy później aplikacja biznesowa potrzebuje arkusza. Użytkownicy planują budżet, wyceniają ofertę, liczą koszty lub sprawdzają liczby, które klient przysłał w pliku Excela, i oczekują przy tym formuł, kilku arkuszy oraz wykresów. Zwykła siatka do tego nie wystarczy.

sgcSpreadsheet to kontrolka arkusza kalkulacyjnego w stylu Excela zbudowana na sgcGrid i na silniku formuł współdzielonym w sgcUICore. Przechowuje prawdziwy skoroszyt z arkuszami, nazwami zdefiniowanymi i tablicami dynamicznymi, przelicza tylko te komórki, których dotyczy zmiana, oraz odczytuje i zapisuje XLSX. Ten sam silnik napędza kontrolki VCL i FireMonkey dla Delphi i C++ Builder oraz kontrolki WinForms, WPF i Avalonia dla .NET.

sgcSpreadsheet w akcji

Formuły, rozlewane tablice, kilka arkuszy, wykresy na żywo i pliki XLSX na każdej platformie. Także na YouTube.

Formuły, które użytkownicy już znają

Osoby pracujące z liczbami myślą formułami Excela. W sgcSpreadsheet tekst zaczynający się od = jest formułą, a silnik oblicza 211 funkcji arkusza: matematyczne, statystyczne, tekstowe, daty i czasu, wyszukiwania, logiczne, informacyjne oraz funkcje tablic dynamicznych. Silnik znajduje się w sgcUICore, więc formuły sgcGrid dają te same wyniki.

=SUM(B2:B13)
211 funkcjiOd SUM i AVERAGE po TEXT i funkcje daty i czasu, jeden silnik dla każdej platformy.
=XLOOKUP(C2,…)
XLOOKUP w zestawieFunkcje wyszukiwania, po które użytkownicy sięgają najpierw, z odwołaniami do innych arkuszy, takimi jak =Sheet2!A1.
=SORT(A2:A20)↓
Tablice, które się rozlewająSEQUENCE, SORT, FILTER i UNIQUE wypełniają komórki pod sobą, z odwołaniami #SPILL! i A1#.
B2 → B14 → D3
Przeliczanie przyrostoweGraf zależności wie, które komórki odczytują które, więc zmiana przelicza tylko komórki od niej zależne.
=SUM(Sales)*(1+Rate)
Nazwy zdefiniowaneFormuły używają czytelnych nazw zamiast adresów komórek, z zakresem skoroszytu i arkusza.
'007
Wymuszony tekstApostrof na początku zapisuje tekst tak, jak go wpisano, więc kod taki jak 007 pozostaje tekstem.
Demo Functions z formułami matematycznymi i ich wynikami, jeden arkusz na kategorię
Demo Functions: jeden arkusz na kategorię, każda formuła obok swojego wyniku

Arkusze, nazwy i rozlewane tablice

Arkusz kalkulacyjny to skoroszyt z jednym lub kilkoma arkuszami. Karty pod siatką przełączają arkusz, karta + dodaje nowy, a zmieniona nazwa arkusza zmienia się w każdej formule, która się do niego odwołuje. Z poziomu kodu arkuszami zarządzają AddSheet, ActiveSheet i SheetCount, a Grid.Sheets.Names przechowuje nazwy zdefiniowane skoroszytu.

Poniższa metoda wypełnia cennik, nadaje nazwy jego zakresom i buduje arkusz podsumowania, który go odczytuje. SORT zwraca całą listę produktów, która rozlewa się do komórek poniżej, a A1# odwołuje się do tego rozlanego zakresu, niezależnie od tego, jak długa się stanie. XLOOKUP znajduje cenę, a nazwa VAT dodaje podatek.

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;

Podsumowanie pokazuje trzy produkty w kolejności, 3 pozycje oraz 264.99 dla monitora. Zmień cenę na pierwszym arkuszu, a przeliczą się tylko komórki, które od niej zależą. FreezePanes(1, 0) utrzymuje wiersz nagłówka na miejscu, gdy reszta arkusza się przewija, a paski formuł TsgcVCLSpreadsheetFormulaBar i TsgcFMXSpreadsheetFormulaBar dają użytkownikom pole nazwy oraz formułę bieżącej komórki.

Twoje własne funkcje

Aplikacje inżynierskie, finansowe i laboratoryjne potrzebują własnych obliczeń. Silnik formuł ma rejestr funkcji, a zarejestrowana w nim funkcja działa w każdej formule arkusza, sgcGrid i TsgcCalcEvaluator, dokładnie tak jak funkcja wbudowana. Procedura obsługi to zwykła funkcja, rejestrowana w sekcji initialization jednostki.

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.

Dodaj jednostkę do projektu, a użytkownicy będą mogli wpisać =MARKUP(B2). Przy tablicach dynamicznych silnik wywołuje funkcję dla każdego elementu argumentu tablicowego, więc =MARKUP(B2:B4, 0.3) rozlewa jeden wynik na cenę, a =SUM(MARKUP(B2:B4)) działa bez dodatkowego kodu. Funkcja, która potrzebuje komórek zakresu, jest rejestrowana z flagą cfRanges i przechodzi po nich iteratorem.

Wykresy z zakresów komórek

Wykres pokazuje wartości zakresu komórek i unosi się nad arkuszem, tak jak wykres w Excelu. Rysuje go sgcCharts, a gdy zmieni się komórka zakresu lub formuła zakresu da nową wartość, wykres podąża za zmianą. Użytkownicy przesuwają wykresy i zmieniają ich rozmiar myszą, a każdy arkusz ma własne wykresy.

XLSX na wejściu, XLSX na wyjściu

Klienci przysyłają pliki XLSX i oczekują plików XLSX z powrotem. LoadFromXLSX odczytuje każdy arkusz skoroszytu, a SaveToXLSX zapisuje każdy arkusz, z nazwy pliku lub ze strumienia, dzięki czemu plik wędruje tam i z powrotem między Twoją aplikacją a Excelem.

VCL, FireMonkey i .NET

Delphi i C++ Builder otrzymują TsgcVCLSpreadsheet dla VCL i TsgcFMXSpreadsheet dla FireMonkey, każdy z własnym paskiem formuły. Dla .NET są TsgcWinFormsSpreadsheet, TsgcWpfSpreadsheet i TsgcAvaloniaSpreadsheet, również z paskami formuły, w pakietach NuGet esegece.sgcSpreadsheet, esegece.sgcSpreadsheet.WinForms, esegece.sgcSpreadsheet.Wpf i esegece.sgcSpreadsheet.Avalonia. Kontrolki .NET używają tych samych nazw co kontrolki Delphi, a funkcja własna może być wyrażeniem 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");

Uruchom dema

Dema Delphi i C++ Builder instalują się z wersją próbną sgcUI, a dema .NET są dołączone do pobrania Registered dla .NET.

Demo VCL Basic ze skoroszytem sprzedaży i paskiem formuły
Basic: skoroszyt sprzedaży z arkuszem podsumowania, zamrożonym wierszem nagłówka i paskiem formuły

Gdzie dostępny jest sgcSpreadsheet

sgcSpreadsheet wchodzi w skład sgcUI Enterprise i pakietu All-Access, a ponadto jest sprzedawany osobno jako pojedynczy pakiet dla Delphi i C++ Builder oraz dla .NET. Instalacja sgcSpreadsheet instaluje także sgcGrid i sgcCharts, więc siatka i wykresy zawsze działają. Nie ma bezpłatnej edycji Community. Szczegóły znajdziesz na stronie z cennikiem.

Daj użytkownikom arkusz kalkulacyjny

sgcSpreadsheet jest częścią sgcUI dla Delphi i C++ Builder, na VCL i FireMonkey, oraz dla .NET na WinForms, WPF i Avalonia.

Pytania lub uwagi? Skontaktuj się z nami, odpowiedzą Ci osoby, które napisały ten kod.