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种图表类型
5种 UI 框架
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 以及各种日期和时间函数,一个引擎适用于所有平台。
=XLOOKUP(C2,…)
包含 XLOOKUP用户最先想到的查找函数,并支持引用其他工作表,例如 =Sheet2!A1。
=SORT(A2:A20)↓
可溢出的数组SEQUENCE、SORT、FILTER 和 UNIQUE 会填充其下方的单元格,并支持 #SPILL! 和 A1# 引用。
B2 → B14 → D3
增量重新计算依赖关系图知道哪些单元格读取了哪些单元格,因此一次修改只会重新计算依赖它的单元格。
=SUM(Sales)*(1+Rate)
已定义名称公式使用有意义的名称而不是单元格地址,支持工作簿和工作表两种范围。
'007
强制文本前导撇号会按输入原样存储文本,因此像 007 这样的编码会保持为文本。
Functions 演示程序,显示数学公式及其结果,每个类别一个工作表
Functions 演示程序:每个类别一个工作表,每个公式紧挨着它的结果

工作表、名称和可溢出的数组

电子表格就是包含一个或多个工作表的工作簿。表格下方的标签页用于切换工作表,+ 标签页用于新增工作表,重命名工作表后,所有引用它的公式也会随之更新。在代码中,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 项,显示器的价格为 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) 会为每个价格溢出一个结果,=SUM(MARKUP(B2:B4)) 无需任何额外代码即可工作。需要读取区域内单元格的函数,则使用 cfRanges 标志注册,并通过迭代器遍历这些单元格。

基于单元格区域的图表

图表显示一个单元格区域的数值,并像 Excel 中的图表一样浮动在工作表上方。它由 sgcCharts 绘制,当区域中的某个单元格发生变化,或区域中的公式给出新值时,图表会随之更新。用户可以用鼠标移动图表并调整其大小,每个工作表都有自己的图表。

XLSX 进,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 控件使用相同的名称,自定义函数可以是一个 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");

运行演示程序

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。

有问题或反馈?请联系我们,您将收到编写这些代码的人员的答复。