スプレッドシートを、
あなたのアプリの中に。
sgcSpreadsheet は sgcUI の新しい Excel スタイルのスプレッドシートコントロールです。ユーザーは値や数式を入力し、複数のシートで作業し、セルからチャートを描けます。コードからはブックにデータを入力し、独自の関数を追加し、Excel で開ける XLSX ファイルを読み書きできます。
- VCL
- FireMonkey
- C++ Builder
- WinForms
- WPF
- Avalonia

遅かれ早かれ、業務アプリケーションにはシートが必要になります。ユーザーは予算を立て、見積もりの価格を決め、コストを計算し、顧客が Excel ファイルで送ってきた数字を確認します。その際には数式、複数のシート、チャートが求められます。単純なグリッドでは、どれも足りません。
sgcSpreadsheet は、sgcGrid と sgcUICore で共有される数式エンジンの上に構築された Excel スタイルのスプレッドシートコントロールです。シート、定義名、動的配列を備えた本物のブックを保持し、変更の影響を受けるセルだけを再計算し、XLSX の読み込みと保存に対応します。同じエンジンが、Delphi と C++ Builder 向けの VCL と FireMonkey のコントロール、.NET 向けの WinForms、WPF、Avalonia のコントロールを動かします。
sgcSpreadsheet の動作デモ
数式、あふれ出す配列、複数のシート、ライブチャート、XLSX ファイルを、すべてのプラットフォームで。YouTube でも公開中.
ユーザーがすでに知っている数式
数字を扱う人は Excel の数式で考えます。sgcSpreadsheet では = で始まるテキストが数式になり、エンジンは 211 のワークシート関数を計算します。数学、統計、文字列、日付と時刻、検索、論理、情報、動的配列の各関数です。エンジンは sgcUICore にあるため、sgcGrid の数式でも同じ結果が得られます。
=SUM(B2:B13)=XLOOKUP(C2,…)=Sheet2!A1 のような他のシートへの参照にも対応します。=SORT(A2:A20)↓#SPILL! と A1# 参照にも対応します。B2 → B14 → D3=SUM(Sales)*(1+Rate)'007
シート、名前、あふれ出す配列
スプレッドシートは 1 つ以上のシートを持つブックです。グリッドの下のタブでシートを切り替え、+ タブでシートを追加でき、シート名を変更すると、それを参照するすべての数式でも名前が更新されます。コードからは AddSheet、ActiveSheet、SheetCount でシートを管理し、Grid.Sheets.Names がブックの定義名を保持します。
次のメソッドは、価格表を入力し、その範囲に名前を付け、それを参照する集計シートを作成します。SORT は製品の一覧全体を返し、それが下のセルにあふれ出します。A1# は、一覧がどれだけ長くなってもそのあふれ出した範囲を参照します。XLOOKUP が価格を検索し、VAT という名前で税額を加算します。
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;
集計シートには、3 つの製品が並べ替えられて表示され、項目数は 3、モニターの価格は 264.99 になります。最初のシートで価格を変更すると、それに依存するセルだけが再計算されます。FreezePanes(1, 0) はシートの残りをスクロールしてもヘッダー行を固定し、数式バーの TsgcVCLSpreadsheetFormulaBar と TsgcFMXSpreadsheetFormulaBar は、名前ボックスと現在のセルの数式をユーザーに提供します。
独自の関数
エンジニアリング、金融、研究室向けのアプリケーションには、独自の計算が必要です。数式エンジンには関数レジストリがあり、そこに登録した関数は、組み込み関数とまったく同じように、スプレッドシート、sgcGrid、TsgcCalcEvaluator のすべての数式で動作します。ハンドラーは通常の関数で、ユニットの initialization セクションから登録します。
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.
このユニットをプロジェクトに追加すれば、ユーザーは =MARKUP(B2) と入力できます。動的配列では、エンジンが配列引数の各要素に対して関数を呼び出すため、=MARKUP(B2:B4, 0.3) は価格ごとに 1 つの結果をあふれ出させ、=SUM(MARKUP(B2:B4)) も追加のコードなしで動作します。範囲のセルを必要とする関数は cfRanges フラグで登録し、イテレーターでセルをたどります。
セル範囲からのチャート
チャートはセル範囲の値を表示し、Excel のチャートのようにシートの上に浮かびます。描画は sgcCharts が行い、範囲内のセルが変更されたとき、または範囲内の数式が新しい値を返したときに、チャートも追従します。ユーザーはマウスでチャートを移動、サイズ変更でき、シートごとに独自のチャートを持ちます。
- 7 種類のチャート: 縦棒、横棒、折れ線、面、円、ドーナツ、散布図。
AddChartには'A1:D10'や'Sheet1!A1:D10'のような範囲を指定し、系列名とカテゴリはヘッダー行と列から読み取られます。TsgcSpreadsheetChartsは各シートのチャートを保持し、SaveToXLSXは Excel で開けるチャートとして書き出します。
XLSX の読み込みと書き出し
顧客は XLSX ファイルを送り、XLSX ファイルでの返信を期待します。LoadFromXLSX はブックのすべてのシートを読み込み、SaveToXLSX はすべてのシートを書き出します。ファイル名でもストリームでも指定でき、ファイルはアプリケーションと Excel の間を往復できます。
- 値、数式、セルの書式。
- 定義名と動的配列。
- ウィンドウ枠の固定と列幅。
- チャート。Excel で開けるチャートとして保存されます。
VCL、FireMonkey、.NET
Delphi と C++ Builder では、VCL 向けの TsgcVCLSpreadsheet と FireMonkey 向けの TsgcFMXSpreadsheet を利用でき、それぞれに数式バーがあります。.NET には TsgcWinFormsSpreadsheet、TsgcWpfSpreadsheet、TsgcAvaloniaSpreadsheet があり、こちらにも数式バーが付いています。NuGet パッケージは esegece.sgcSpreadsheet、esegece.sgcSpreadsheet.WinForms、esegece.sgcSpreadsheet.Wpf、esegece.sgcSpreadsheet.Avalonia です。.NET のコントロールは Delphi と同じ名前を使い、カスタム関数にはラムダ式を使えます。
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");
デモを実行する
Delphi と C++ Builder のデモは sgcUI のトライアル版と一緒にインストールされ、.NET のデモは Registered 版の .NET ダウンロードに同梱されています。

- Basic: SUM、AVERAGE、IF、XLOOKUP を使ってコードで作成した売上ブック、それを参照する集計シート、固定されたヘッダー行、数式バー、XLSX の読み込みと保存。
- Functions: 数学、文字列、日付と時刻、検索、動的配列の各関数を、カテゴリごとに 1 シートで、各数式の隣に結果を表示します。
- Charts: セル範囲からの縦棒、折れ線、円グラフ。売上やコストを編集すると、チャートも追従します。
- CustomFunction、BasicFMX、ChartsFMX: アプリケーションが登録する関数と、FireMonkey 版の Basic と Charts のデモ。Basic と Charts は C++ Builder プロジェクトとしても提供されます。
- .NET: WinForms 向けの SpreadsheetBasic、SpreadsheetBasicWpf、SpreadsheetBasicAvalonia、SpreadsheetFunctions、SpreadsheetCharts、SpreadsheetCustomFunction。
sgcSpreadsheet が含まれる製品
sgcSpreadsheet は sgcUI Enterprise と All-Access バンドルに含まれ、Delphi と C++ Builder 向け、および .NET 向けの単体パッケージとしても販売されています。sgcSpreadsheet をインストールすると sgcGrid と sgcCharts も一緒にインストールされるため、グリッドとチャートは常に動作します。無料の Community エディションはありません。詳細は価格ページをご覧ください。
ユーザーにスプレッドシートを届けましょう
sgcSpreadsheet は sgcUI の一部です。Delphi と C++ Builder では VCL と FireMonkey に、.NET では WinForms、WPF、Avalonia に対応します。
ご質問やフィードバックはありますか。お問い合わせください。コードを書いた開発者本人が返信します。
