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

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)=XLOOKUP(C2,…)=Sheet2!A1.=SORT(A2:A20)↓#SPILL! i A1#.B2 → B14 → D3=SUM(Sales)*(1+Rate)'007
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.
- 7 typów wykresów: kolumnowy, słupkowy, liniowy, warstwowy, kołowy, pierścieniowy i punktowy.
AddChartz zakresem takim jak'A1:D10'lub'Sheet1!A1:D10', z nazwami serii i kategoriami odczytywanymi z wiersza i kolumny nagłówka.TsgcSpreadsheetChartsprzechowuje wykresy każdego arkusza, aSaveToXLSXzapisuje je jako wykresy, które otwiera Excel.
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.
- Wartości, formuły i formaty komórek.
- Nazwy zdefiniowane i tablice dynamiczne.
- Zamrożone okienka i szerokości kolumn.
- Wykresy, zapisywane jako wykresy, które otwiera Excel.
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.

- Basic: skoroszyt sprzedaży zbudowany w kodzie z SUM, AVERAGE, IF i XLOOKUP, arkusz podsumowania, który go odczytuje, zamrożony wiersz nagłówka, pasek formuły oraz otwieranie i zapis XLSX.
- Functions: funkcje matematyczne, tekstowe, daty i czasu, wyszukiwania i tablic dynamicznych, jeden arkusz na kategorię, każda formuła obok swojego wyniku.
- Charts: wykresy kolumnowy, liniowy i kołowy z zakresów komórek. Zmień przychód lub koszt, a wykresy podążą za zmianą.
- CustomFunction, BasicFMX i ChartsFMX: funkcje rejestrowane przez aplikację oraz dema Basic i Charts na FireMonkey. Basic i Charts są też dostarczane jako projekty C++ Builder.
- .NET: SpreadsheetBasic dla WinForms, SpreadsheetBasicWpf, SpreadsheetBasicAvalonia, SpreadsheetFunctions, SpreadsheetCharts i SpreadsheetCustomFunction.
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.
