一个电子表格。
就在您的应用程序里。
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
工作表、名称和可溢出的数组
电子表格就是包含一个或多个工作表的工作簿。表格下方的标签页用于切换工作表,+ 标签页用于新增工作表,重命名工作表后,所有引用它的公式也会随之更新。在代码中,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 绘制,当区域中的某个单元格发生变化,或区域中的公式给出新值时,图表会随之更新。用户可以用鼠标移动图表并调整其大小,每个工作表都有自己的图表。
- 7 种图表类型:柱形图、条形图、折线图、面积图、饼图、圆环图和散点图。
AddChart接受'A1:D10'或'Sheet1!A1:D10'这样的区域,系列名称和类别从标题行和标题列读取。TsgcSpreadsheetCharts保存每个工作表的图表,SaveToXLSX会将它们写成 Excel 可以打开的图表。
XLSX 进,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 控件使用相同的名称,自定义函数可以是一个 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 下载包中。

- Basic:在代码中使用 SUM、AVERAGE、IF 和 XLOOKUP 构建的销售工作簿,一个读取它的汇总工作表,冻结的标题行,公式栏,以及 XLSX 的打开和保存。
- Functions:数学、文本、日期和时间、查找以及动态数组函数,每个类别一个工作表,每个公式紧挨着它的结果。
- Charts:基于单元格区域的柱形图、折线图和饼图。修改收入或成本,图表会随之更新。
- CustomFunction、BasicFMX 和 ChartsFMX:由应用程序注册的函数,以及 FireMonkey 版的 Basic 和 Charts 演示程序。Basic 和 Charts 也提供 C++ Builder 工程。
- .NET:适用于 WinForms 的 SpreadsheetBasic, SpreadsheetBasicWpf, SpreadsheetBasicAvalonia, SpreadsheetFunctions, SpreadsheetCharts and 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。
有问题或反馈?请联系我们,您将收到编写这些代码的人员的答复。
