sgcReports 2026.11:导入您现有的 FastReport 报表,并为 Delphi、C++ Builder 和 .NET 新增参数、表格与模板

· 组件
sgcReports 2026.11:导入 FastReport 报表,新增参数、表格与模板,支持 Delphi 和 .NET | eSeGeCe 博客
✦  sgcUI 2026.11 新功能 · sgcReports

保留您的报表。
更换您的报表引擎。

sgcReports 现在可以导入 FastReport、QuickReport 和 ReportBuilder 报表,并补齐了买家最先检查的功能:参数、真正的表格、报表模板、可搜索的预览以及电子发票。一个版本带来十二项新功能。

  • VCL
  • FireMonkey
  • C++ Builder
  • WinForms
  • WPF
  • Avalonia

四分钟内看完十二项新功能。也可在 YouTube 观看。

12项新功能
3种可导入的报表格式
68个函数,另有 10 个聚合函数
6种预览中的导出格式

许多团队都想更换报表引擎,却始终没有行动,原因只有一个:手上有数百份现成的报表,没人愿意重新绘制。sgcReports 2026.11 消除了这个障碍。它可以读取并转换您的 FastReport、QuickReport 和 ReportBuilder 文件,同时补上团队在切换之前一定会检查的短板:报表参数、真正的表格项、支持继承的报表模板、带搜索和缩略图的预览,以及用于电子发票的 PDF 输出。

下面介绍的所有功能,在 Delphi 和 C++ Builder(VCL 与 FireMonkey)以及 .NET(WinForms、WPF 和 Avalonia)中的用法完全一致。本页的每一段代码示例都已针对 2026.11 源码编译并运行通过。

第 1 部分 · 消除切换成本

导入 FastReport、QuickReport 和 ReportBuilder 报表

全新的 TsgcReportImporter 可以读取 FastReport 的 .fr3 文件、QuickReport 窗体(包含 TQuickRep 的 .dfm)或 ReportBuilder 的 .rtm 模板,无论是文本还是二进制格式,并将其转换为 sgcReports 的报表定义。页面、带区、项目、样式和数据源都会被带过来,表达式会被翻译成 sgcReports 语法,QuickReport 和 ReportBuilder 的复选框则变成新的复选框项。

让它在真实项目中可以放心使用的,是结果的另一半。导入器会列出每一个无法映射的对象、属性、表达式、脚本和数据源,附上它在报表中的路径和原因,让您清楚地知道哪些部分需要手工完成。不会有任何内容被悄悄丢弃。

输入三种报表格式,输出一份 sgcReports 定义。
ReportImport 演示程序导入 FastReport 文件之后的界面,显示摘要、问题列表和转换后报表的预览
导入 FastReport 文件:13 个项目,翻译了 2 个表达式,每个不受支持的对象都列出了原因。

设计器提供了导入命令,因此无需编写代码就可以引入报表,在预览中检查,并保存为 JSON。如果用代码实现,除了清理资源之外只需四行:

  oImporter := TsgcReportImporter.Create;
  try
    oImporter.ImportFromFile(oReport, 'fr_items.fr3');
    for i := 0 to oImporter.ImportResult.Issues.Count - 1 do
      Writeln(oImporter.ImportResult.Issues[i].Reason);
  finally
    oImporter.Free;
  end;

C# 中的写法如下:

    var oImporter = new TsgcReportImporter();
    oImporter.ImportFromFile(oReport, "fr_items.fr3");
    foreach (var oIssue in oImporter.ImportResult.Issues)
      Console.WriteLine(oIssue.Reason);

源报表中的脚本、富文本、图表和交叉表不会被转换。它们会出现在问题列表中,您可以用 sgcReports 的对应功能重新构建。全新的 ReportImport 演示程序提供 Delphi、C++ Builder 和 .NET 版本,可导入这三种格式的示例文件。

报表参数,由预览来询问

报表现在可以声明自己的参数:文本、整数、数字、日期、日期时间或是/否,每个参数都可以有默认值或默认表达式、必填标志、多值选项,以及固定的或从数据源读取的允许值列表。表达式和脚本通过 :Name 读取它们。

您不必为此编写窗体。VCL 和 FireMonkey 的预览与设计器会在准备报表之前询问参数,.NET 的预览也是如此。HTML 查看器会显示一个类型化的参数表单,HTTP 端点会从查询字符串中读取 ?param.Name=value,遇到不符合要求的值时返回 400,而不是返回一份损坏的报表。

参数对话框,包含一个必填日期、一个从数据中读取列表的国家选择,以及一个最小合计
参数提示框,国家列表从数据中读取
按所选日期、国家和最小合计过滤后的订单报表
按这些取值过滤后的报表

在 JSON 定义中,参数与页面并列:

"parameters": [
  { "name": "FromDate", "dataType": "rpdtDate", "required": true,
    "defaultExpression": "EncodeDate(2026, 1, 1)" },
  { "name": "MinTotal", "dataType": "rpdtFloat", "defaultValue": "0" }
]

在没有用户参与的情况下准备报表的服务,可以在代码中设置这些值,不会弹出任何提示:

  oEngine.Report := oReport;
  oEngine.SetParameterValue('FromDate', VarFromDateTime(EncodeDate(2026, 3, 1)));
  oEngine.SetParameterValue('MinTotal', 100.0);

真正的表格项

再也不用手工对齐文本项来伪造表格了。全新的表格项支持固定、百分比和自动三种列宽,可跨行跨列合并单元格,表头行会在每一页重复,数据行来自各自的数据源,页脚行可以放合计,行高会随内容增长。单元格支持样式、高亮和超链接。

合并单元格,以及随表格延续到每一页的表头行。
一个带合并单元格的方案对比表,以及一个库存偏低的数值显示为红色的产品表
合并单元格和高亮的库存列
报表设计器的表格编辑器,包含行、列以及合并和拆分命令
设计器中的表格编辑器

导出时会保留表格结构。在可访问的 PDF 中,表格会成为带标签的表格,包含表头单元格、其作用范围和跨度,因此屏幕阅读器会把它当作表格来朗读。它还会变成 HTML 表格、重复表头行的 Word 表格,以及 XLSX 中的合并单元格。在代码中,流式构建器只需几行就能写出一个表格:

  oTable := oBuilder.Page('Main').Paper(rpsA4).Margins(15).ReportTitle(14)
    .CanGrow.Table(0, 0, 180, 'Products');
  oTable.Column(25).Column(0, rtwmAuto).Column(30)
    .HeaderRow(['Products', '', '']).RowStyle('Title').Cell(0, 0).Span(1, 3)
    .HeaderRow(['Code', 'Name', 'Price']).RowStyle('Head')
    .DataRow(['[Products.Code]', '[Products.Name]', '[Products.Price]'])
    .Cell(1, 2).Format('#,##0.00');
  oTable.Table.RepeatHeaderRows := True;

复选框、SVG、迷你图和仪表盘

页面上新增了四种可绘制的内容:

报表行内的对勾、迷你图和仪表盘。
一份项目状态报表,包含 SVG 徽标,每行都有复选框、迷你图和进度仪表盘,另有一个平均进度仪表盘
项目状态报表:一个 SVG 徽标,每个项目一个复选框、一条 12 个月的迷你图和一个进度仪表盘,另有一个显示平均值的径向仪表盘。

自定义项的设置现在支持表达式,并为每个打印的带区求值,每一行就是这样绘制出自己的迷你图和仪表盘的:

  oBand := oPage.MasterData('Projects', 14);
  oBand.CheckBox('Projects.Done', 4, 4, 6, 6).Name('DoneBox');
  oBand.Item.CheckBox.CheckStyle := rcsCheck;
  oBand.Custom('Sparkline', 75, 1, 60, 12, ['values=[Projects.Trend]',
    'kind=area', 'markers=last,high']).Name('Trend');
  oBand.Custom('Gauge', 140, 2, 50, 10, ['value=[Projects.Progress]',
    'gaugeKind=linear', 'unit=%']).Name('ProgressGauge');

报表模板与继承

每家公司都有自己的信笺抬头,而每张发票、对账单和送货单都要重复使用它。借助全新的 InheritsFrom 属性(在 JSON 中为 "inheritsFrom"),一份报表定义可以从基础定义出发,只保存与它的差异。页面、带区、项目和样式按名称合并。子报表可以覆盖属性、添加项目、用 "$first" 把某个带区放到最前面,或者用 "$remove" 去掉继承来的项目。在基础报表中更换徽标,所有继承它的报表都会随之更新。

一份信笺抬头,两份继承它的报表。
作为基础的信笺抬头报表
基础报表:letterhead.json
继承了信笺抬头的发票
发票继承了它
继承了信笺抬头并去掉联系方式区块的送货单
送货单也是如此

上面的整张送货单只需要几行差异定义。下面这段去掉了信笺抬头中的联系方式区块:

"inheritsFrom": "letterhead.json",
"pages": [ { "name": "Page1", "bands": [
  { "name": "PageHeader", "items": [
    { "name": "Contact", "$remove": true }
  ] }
] } ]
  oDef.BaseFolder := ExtractFilePath(ExpandFileName('letterhead.json'));
  oDef.LoadFromFile(oReport, 'child.json');

基础报表会在 BaseFolder 下查找,或者由您的 OnResolveBase 处理程序从数据库或资源中加载。继承链最多可达八级,需要单个文件时,可用 Flat 写出合并后的定义。VCL、FireMonkey 和 HTML 设计器会标记继承来的对象,把对它们的编辑作为覆盖处理,并可基于一份基础报表新建报表。在 VCL 设计器中,被覆盖的属性以粗体显示。

VCL 报表设计器中打开的送货单,继承的带区已被标记,被覆盖的标题以粗体显示
继承的带区会被标记,被覆盖的标题以粗体显示。

带搜索、缩略图和导出菜单的预览

预览新增了查找栏(Ctrl+F、F3,支持区分大小写和全字匹配),会高亮页面上的每一处匹配,另有页面缩略图窗格,以及可导出 PDF、XLSX、CSV、PNG、HTML 和 Word 的导出菜单,还有 OnExport 事件可由您接管保存过程。这些功能适用于 VCL 和 FireMonkey 预览,以及 WinForms、WPF 和 Avalonia 预览,FireMonkey 的 PDF 查看器也新增了文本搜索。

查找、跳转和导出,全部在您的用户已经在用的预览中完成。
预览中的查找栏,当前匹配项为橙色,其他匹配项为黄色
查找,高亮每一处匹配
打开了页面缩略图窗格的预览
页面缩略图
  oPreview.ShowThumbnails := True;
  oPreview.ExportFormats := [rpxPDF, rpxXLSX];
  if oPreview.SearchText('Total', False, True) then
    Writeln(oPreview.SearchResults, ' match(es)');

第 2 部分 · 补齐短板

在带区或项目上设置全新的 Bookmark 表达式,PDF 导出就会把书签写成文档大纲,并按分组嵌套,VCL 和 FireMonkey 预览则在大纲窗格(ShowOutline)中显示它们。全新的 Hyperlink 属性可以打开网址或 mailto 地址,也可以用 #name 跳转到同一报表中的某个 Anchor,这些链接在 PDF、HTML、Word 和 XLSX 导出中都会保留。

预览的大纲窗格,由分组书签生成的区域和客户
由两级分组生成的大纲
一页报表,包含跳转到各个区域的链接和一个指向网页的链接
指向网页和锚点的链接

电子发票 PDF:Factur-X、ZUGFeRD 和 XRechnung

PDF 导出通过全新的 EInvoice 属性,把您的应用程序提供的电子发票 XML 作为 PDF/A-3 关联文件嵌入,支持 Factur-X、ZUGFeRD 和 XRechnung,也可以使用带 PDF/UA 的 PDF/A-3a。人阅读的发票和机器读取的数据放在同一个文件中。sgcReports 本身不生成 XML,由您的应用程序提供。

XML 被放进了 PDF/A-3 发票内部。
ReportEInvoice 演示程序,包含 Factur-X 和 ZUGFeRD、西班牙 Verifactu 以及波兰 KSeF 的按钮
ReportEInvoice 演示程序:保存为 PDF/A-3 的 Factur-X 发票,以及用于 Verifactu(西班牙)和 KSeF(波兰)的 QR 码模板。

包含 68 个函数和 10 个聚合函数的表达式库

表达式库扩充到 68 个函数和 10 个聚合函数。新增的有日期运算、填充与格式化、Choose、可用 sgcUI 的 12 种语言把金额写成大写文字的 ToWords,以及聚合函数 SumIf、CountIf、Previous、RunningSum 和 RunningCount。聚合函数会跟随其所在的带区:分组页脚给出该分组的合计,页面页脚给出该页的合计。

使用了 PadLeft、Upper、Proper、ToWords、RunningSum 和 IIF 的报表页面
一个报表页面上的 PadLeft、Upper、Proper、ToWords 和 RunningSum 列。

高亮:无需脚本的条件样式

高亮可以在项目上设置一组条件和样式。第一个为真的条件会替换该项目的样式,因此负数合计显示为红色、良好结果显示为绿色,而不需要写一行脚本。高亮可以写在 JSON、流式构建器以及 VCL、FireMonkey 和 HTML 设计器中。

分支机构业绩,负值显示为红色,超过 5000 的结果显示为绿色
负数为红色,业绩好的月份为绿色
报表设计器的高亮编辑器,包含两个条件及其样式
高亮编辑器

大型报表的进度与取消

引擎新增了 OnProgress 事件,提供页数和记录数,还有 Cancel 方法。预览在准备报表时会显示进度,并带有一个取消按钮,按 Esc 键也可以触发它。HTTP 端点新增了 MaxPages 和 Timeout 限制,避免一份失控的报表占住整个服务器。

预览正在准备一份包含 40,000 条记录的报表,显示页数、记录数和取消按钮
正在准备 40,000 条记录:页数、记录数和取消按钮。

全平台,相同的 API

本页的每一项功能都同时提供给 Delphi 和 C++ Builder(含 VCL 和 FireMonkey 的预览与设计器)以及 .NET(WinForms、WPF 和 Avalonia),类名和属性名完全相同。用 JSON 定义的报表可以在两个世界之间原样迁移,引擎仍然可以在服务和 Linux64 守护进程中无界面运行。

在 .NET WinForms 中运行的 ReportTables 演示程序
.NET WinForms 中的 ReportTables 演示程序。

本次发布附带五个新的演示程序,提供 Delphi、C++ Builder 和 .NET 版本:ReportImport、ReportParameters、ReportTables、ReportVisualItems 和 ReportInheritance,另外还有 ReportEInvoice 演示程序。

sgcReports 2026.11 的其他新增内容

报表导入器以及迷你图和仪表盘项需要注册版。sgcReports 包含在 sgcUI Enterprise 和 All-Access 中,也可单独购买。

试用 sgcReports 2026.11

导入您自己的一份 FastReport、QuickReport 或 ReportBuilder 文件,看看能带过来多少内容。

有问题或反馈?欢迎联系我们,回复您的是编写这些代码的人。