sgcSpreadsheet: Delphi と .NET 向け Excel スタイルのスプレッドシート

· コンポーネント
sgcSpreadsheet: Delphi と .NET 向け Excel スタイルのスプレッドシート | eSeGeCe ブログ
✦  sgcUI · sgcSpreadsheet

スプレッドシートを、
あなたのアプリの中に。

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

  • VCL
  • FireMonkey
  • C++ Builder
  • WinForms
  • WPF
  • Avalonia
売上表と、そのセル範囲から描いた縦棒、折れ線、円グラフを表示した sgcSpreadsheet
211ワークシート関数
7チャートの種類
5UI フレームワーク
XLSX読み込みと保存

遅かれ早かれ、業務アプリケーションにはシートが必要になります。ユーザーは予算を立て、見積もりの価格を決め、コストを計算し、顧客が 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)
211 の関数SUM や AVERAGE から TEXT、日付と時刻の関数まで、すべてのプラットフォームで 1 つのエンジンを使います。
=XLOOKUP(C2,…)
XLOOKUP に対応ユーザーが真っ先に使う検索関数を備え、=Sheet2!A1 のような他のシートへの参照にも対応します。
=SORT(A2:A20)↓
あふれ出す配列SEQUENCE、SORT、FILTER、UNIQUE は下のセルを埋め、#SPILL! と A1# 参照にも対応します。
B2 → B14 → D3
増分再計算依存関係グラフがどのセルがどのセルを参照しているかを把握しているため、変更時には依存するセルだけが再計算されます。
=SUM(Sales)*(1+Rate)
定義名数式ではセルのアドレスの代わりに意味のある名前を使え、ブックとシートのスコープに対応します。
'007
強制テキスト先頭のアポストロフィで入力したとおりにテキストとして保存されるため、007 のようなコードも文字列のままです。
数学の数式とその結果を表示した Functions デモ。カテゴリごとに 1 シート
Functions デモ: カテゴリごとに 1 シート、各数式の隣に結果を表示

シート、名前、あふれ出す配列

スプレッドシートは 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 が行い、範囲内のセルが変更されたとき、または範囲内の数式が新しい値を返したときに、チャートも追従します。ユーザーはマウスでチャートを移動、サイズ変更でき、シートごとに独自のチャートを持ちます。

XLSX の読み込みと書き出し

顧客は XLSX ファイルを送り、XLSX ファイルでの返信を期待します。LoadFromXLSX はブックのすべてのシートを読み込み、SaveToXLSX はすべてのシートを書き出します。ファイル名でもストリームでも指定でき、ファイルはアプリケーションと 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 ダウンロードに同梱されています。

売上ブックと数式バーを表示した VCL の Basic デモ
Basic: 集計シート、固定されたヘッダー行、数式バーを備えた売上ブック

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 に対応します。

ご質問やフィードバックはありますか。お問い合わせください。コードを書いた開発者本人が返信します。