发票、送货单和对账单
行业应用程序每天都要从数据库打印文档。带主从关系的数据集源把每张发票链接到它的明细行,分组和页脚打印合计,二维码或 GS1-128 条形码放在标签上,PDF 导出则写出可直接发送电子邮件的无障碍文件。同一份报表还可以为会计团队保存为 XLSX。
- 主从
- 分组和小计
- 条形码
- 无障碍 PDF
报表只需设计一次,就能以无障碍 PDF、Excel 文件、CSV 或 PNG 页面的形式交付。可以用流式链在代码中构建,也可以在运行时加载 JSON 定义,支持分组、小计、主从和条形码。引擎不需要窗口,也不需要外部 DLL,因此可在服务和 Linux64 守护进程中运行。
十一项功能,每项都附有真实的 API 和对应的帮助主题。
用代码或 JSON 描述报表,含真正的分区、分组和表达式。
设计报表
报表设计器很好用,直到布局必须放进版本控制、在拉取请求中评审,或由您自己的元数据生成。TsgcReportBuilder 用一条流式链描述样式、页面、分区和项目,因此报表就是普通代码,可以与项目的其余部分一起编译、比较差异和重构。同一条链既准备报表,也把它保存为每种输出格式。以这种方式构建的报表可以在循环中生成,作为函数共享,并像其他代码一样由单元测试覆盖。
Style、Page、GroupHeader、MasterData、GroupFooter 和 PageFooter 读起来就像版面本身SaveToPDF、SaveToXLSX、SaveToCSV 和 SaveToPNG 可直接从构建器调用SaveToPDFStreamTsgcReport 模型,您仍可在代码中调整RightToLeft 以及带区和项目上的 BiDiMode 会镜像布局,PDF、XLSX 和 HTML 输出中的阿拉伯语和希伯来语文本均经过整形
设计报表
业务报表很少是平铺的列表:按地区的销售、按客户的发票、按仓库的库存。sgcReports 拥有真正的分区版面,包括报表标题、页眉、分组页眉、数据、分组页脚、页脚和汇总分区。分组在其表达式变化时断开,打印自己的合计,并可另起一页或在每页重复其页眉,使长报表保持可读。子报表让一页包含另一页的版面,用于汇总和附录。
GroupExpression,嵌套分组可达两层或更多层StartNewPage、RepeatOnEveryPage 和 KeepTogether 控制页面流rbtReportTitle 到 rbtReportSummary 的分区类型,以及列页眉和列页脚TotalPages 用于“第 2 页,共 7 页”页脚PrintOnFirstPage 和 PrintOnLastPage 决定页面分区出现的位置;SubreportPageName 嵌入另一页
设计报表
发票是一条主记录加上它的明细行,每一行都需要正确的产品、数量和价格。数据集源可绑定任意 TDataSet(包括 FireDAC),并通过键字段把明细源链接到其主表,因此每张发票都会打印自己的明细行和合计。当数据不在数据库中时,JSON 数组和您自己的事件驱动源也以同样的方式工作。明细分区会为当前主记录的每一行重复,页脚则用对各行的聚合表达式打印发票总额。
TsgcReportDataSetSource 配合 MasterSource、MasterFields 和 DetailFieldsTsgcReportJSONSource 读取 JSON 字符串或文件,RecordsPath 选择数组TsgcReportEventSource 通过 OnFirst、OnNext 和 OnGetValue 从您的代码中拉取行AddDataSource 注册到引擎上
设计报表
月度对账单增加一列,不应该需要发布新版本的应用程序。报表定义可以保存为 JSON 并从 JSON 加载,因此版面可以存放在数据库、配置文件夹或客户专用目录中。应用程序在运行时加载定义,绑定数据并渲染,同一个文件也供网页设计器使用。定义是纯文本,因此在版本控制中差异清晰,也可以由您自己的工具生成或用脚本迁移。
sgcReportLoadFromJSON 和 sgcReportSaveToJSON,以及文件和流变体sgcReportGenerateSchema 写出 JSON 架构,用于编辑器和验证
设计报表
合计、格式化日期、条件文字和发货标签,归根结底都是表达式和条形码。任何文本项都可以包含方括号中的表达式,例如某个字段的格式化求和,并内置字符串、数字和日期函数。条形码也是项目,由 sgcPDF 引擎绘制为矢量,因此标签和送货单在任何尺寸下打印都很清晰。表达式由引擎对每一行求值,因此页脚合计始终与上面打印的明细行一致。
Sum、FormatFloat、FormatDateTime、Upper、Round、IsNullOnGetVariable 在运行时提供您自己的变量Barcode,支持 rbsCode128、rbsEAN13、rbsQRCode、rbsDataMatrix、rbsPDF417 等准备一次,然后导出为您的用户和监管机构要求的格式。
随处交付
公共机构和许多公司现在必须发布屏幕阅读器可以读取的文档,而档案需要二十年后仍能打开的文件。PDF 导出默认写出带标签的 PDF/UA-1,含有逻辑阅读顺序、图像的替代文字和带标记的标题。当文档要送往长期档案时,请启用 PDF/A-3。在 Delphi 和 .NET 中,导出还可写出 PDF/A-4 和 PDF/UA-2。字体通过与预览相同的字体管理器嵌入,帮助中还介绍了如何用免费的 veraPDF 工具验证文件。
TsgcReportPDFExport 上的 PDFUA 默认为 TrueAltText 和 TagRole 用于描述图像和标题PDFA 设为 rpaA3b 或 rpaA3a 以输出归档文件FixedDocumentID 和 FixedCreationDate 让输出逐字节可重现,便于测试
随处交付
财务部门想要 Excel 对账单,客户想要 PDF,集成系统想要 CSV,网页想要缩略图。引擎只准备一次页面,每种导出都基于同一份准备好的结果,因此每个文件中的数字都完全相同。XLSX 输出会把数字保留为数字,因此电子表格无需清理就能求和。每种导出还可以写入流,这正是网页响应或邮件附件所需要的,SaveToFiles 则一次调用写出多种格式。
TsgcReportPDFExport、TsgcReportXLSXExport、TsgcReportCSVExport、TsgcReportImageExportTsgcReportPreparedPages 配合 LoadPrepared 让一次运行为多个导出供数据DetectNumbers、SheetName 和 ExcludePageBands 决定电子表格的形态SaveToPNG 的 DPI
随处交付
用户想在打印或保存之前翻阅报表。预览控件以与 PDF 相同的渲染方式显示准备好的页面,带有页面导航、缩放和适应模式,以及在您构建自己的工具栏时可以隐藏的工具栏。VCL 预览运行在 Windows 上;FireMonkey 预览运行在 Windows 上。预览通过 sgcPDF 查看器控件绘制,因此用户在屏幕上看到的就是 PDF 导出写出的内容,预览上的 SaveToPDF 会保存用户正在查看的页面。
TsgcReportPreviewVCL 配合 FirstPage、NextPage、PriorPage 和 LastPageZoomIn、ZoomOut、FitWidth 和 FitPageShowToolbar、CurrentPage 和 OnPageChange 用于您自己的导航TsgcReportPreviewFMX:Windows 上的 FireMonkey 预览随处交付
如今大多数报表都在服务器上生成:夜间对账单、结账后的发票、API 背后的导出。sgcReports 核心不依赖 VCL 或 FireMonkey,也不需要外部 DLL 或打印机驱动,因此同样的代码可以在 Windows 服务或 Linux64 守护进程中运行。帮助中介绍了工作线程池模式,每个线程拥有自己的引擎。作业、数据和报表定义都可以以 JSON 文件的形式到达,因此任何能写文件的系统都可以向守护进程供给任务。
TsgcReportEngine 无需窗口即可准备报表sgcReportsConfigureForServer 在 Windows 上为多线程调整内存管理器TsgcReportFontManager 为每个线程提供服务sgcReportsHTML 桥接通过 HTTP 提供报表,并让用户在浏览器中编辑版面。
网络上的报表 仅限注册版
网络门户、内部网或移动应用通常只需要一个返回报表的 URL。HTTP 端点按名称在 sgcWebSockets HTTP 服务器上注册报表,并以 PDF、XLSX、CSV 或 PNG 提供,同时提供 HTML 查看器,它会询问参数、翻阅结果页并提供下载。您的代码在每次运行之前通过事件填入数据。端点使用与桌面代码相同的报表定义和数据源,因此一次编写的报表既服务应用程序,也服务浏览器。
TsgcReportHTTPEndpoint 配合 RegisterReport 和 BasePathOnBeforePrepare 按请求设置参数和数据TsgcReportHTMLViewer 配合 ShowParameters 提供参数表单TsgcWebSocketHTTPServer 上;ReportHTTPServer 演示是一个完整的服务器Delphi 和 C++ Builder:需要 sgcWebSockets Professional 或更高版本以及 sgcHTML。.NET:esegece.sgcReports.HTML 和 AspNetCore 包托管相同的路由。
阅读帮助主题网络上的报表 仅限注册版
高级用户总想再加一列或换一种分组,而每次更改过去都是开发人员的一张工单。浏览器设计器用分区画布、属性检查器和实时预览来编辑报表的 JSON 定义,与成品报表由同一个端点提供。由您决定谁可以编辑,保存的定义可以在 sgcReports 的所有其他部分中加载。“下载 JSON”按钮会把定义交给任何想保留它的人。
TsgcReportHTMLDesigner,配合 DesignerEnabledsgcReportLoadFromJSON 加载,包括 Linux 守护进程在生产环境的端点上请保持 DesignerEnabled 关闭,并把它放在您自己的身份验证之后。
阅读帮助主题sgcUI 套件演示中的 sgcReports:使用内置模拟数据、可离线运行的完整应用程序。
带 KPI 框和图表带的销售报表,导出为 PDF。
Altamira ERP →
通过代码生成的成交确认单,含二维码。
Altamira Markets →
带图表和条形码的班次报表。
Altamira Plant →
嵌入地图的路线单,生成为 PDF。
Altamira Fleet →
行业应用程序每天都要从数据库打印文档。带主从关系的数据集源把每张发票链接到它的明细行,分组和页脚打印合计,二维码或 GS1-128 条形码放在标签上,PDF 导出则写出可直接发送电子邮件的无障碍文件。同一份报表还可以为会计团队保存为 XLSX。
客户门户和内部 API 需要按需生成报表。在 HTTP 端点上注册报表,浏览器就会得到带参数和下载的查看器,也可以在 Linux64 守护进程中运行引擎,用工作线程池渲染排队的作业。不涉及打印机驱动、窗口或外部 DLL。同样的 JSON 定义既服务查看器,也服务守护进程。
公共部门供应商和受监管的公司必须发布屏幕阅读器可以读取的文档,并把它们归档多年。默认输出带标签的 PDF/UA-1,替代文字和标题角色保存在报表项目上,PDF/A-3 只需一个属性即可启用。帮助中介绍了如何用免费的 veraPDF 验证器检查结果。可重现的输出有助于自动化测试比较文件。
Delphi、C++ Builder 和 C# 中的同一套 API:每个地区一个页眉,每笔销售一行,每个地区一个小计,保存为 PDF、XLSX 和 CSV。
基于 JSON 源的流式报表:每个地区一个带小计的分组,保存为 PDF、XLSX 和 CSV。
uses
Classes, SysUtils,
sgcReports_Types, sgcReports_Model, sgcReports_Data, sgcReports_Fluent;
const
CS_SALES = '[' +
'{"Region":"East","Customer":"Acme Corp","Amount":1450.00},' +
'{"Region":"East","Customer":"Blue Harbor","Amount":600.00},' +
'{"Region":"North","Customer":"Nordic Labs","Amount":2100.75},' +
'{"Region":"North","Customer":"Fjord Ltd","Amount":880.20}]';
CS_TOTAL = '[FormatFloat(''#,0.00'', Sum(Sales.Amount))]';
procedure ExportSalesReport(const aFolder: string);
var
oSales: TsgcReportJSONSource;
oBuilder: TsgcReportBuilder;
begin
oSales := TsgcReportJSONSource.Create(nil);
oBuilder := TsgcReportBuilder.Create;
try
oSales.SourceName := 'Sales';
oSales.JSON := CS_SALES;
oBuilder.Title('Sales by region').Author('eSeGeCe').Units(ruMillimeters)
.Style('Base').Font('Arial', 10).EndStyle
.Style('Group').Font('Arial', 11).Bold.BackColor($EEEEEE).EndStyle
.Page.Paper(rpsA4).Margins(15)
// one header per region, one line per sale, a subtotal per region
.GroupHeader('Sales.Region', 9).Style('Group')
.Text('Region: [Sales.Region]', 0, 1, 180, 7).TagRole(rtrHeading2).EndBand
.MasterData('Sales', 6).Style('Base')
.Text('[Sales.Customer]', 2, 0, 120, 6)
.Text('[Sales.Amount]', 130, 0, 50, 6).AlignRight.Format('#,0.00').EndBand
.GroupFooter(9).Style('Base')
.Text('Region total ' + CS_TOTAL, 80, 1, 100, 6).AlignRight.Bold.EndBand
.PageFooter(8).Style('Base')
.Text('Page [Page] of [TotalPages]', 0, 1, 180, 6).AlignCenter.EndBand
.EndPage.Data(oSales);
// accessible PDF (PDF/UA is on by default), plus the same data as Excel
oBuilder.SaveToPDF(IncludeTrailingPathDelimiter(aFolder) + 'sales.pdf');
oBuilder.SaveToXLSX(IncludeTrailingPathDelimiter(aFolder) + 'sales.xlsx');
oBuilder.SaveToCSV(IncludeTrailingPathDelimiter(aFolder) + 'sales.csv');
finally
oBuilder.Free;
oSales.Free;
end;
end;C++ Builder 中使用生成的 sgcReports 头文件构建的同一份报表。
#include <vcl.h>
#include "sgcReports_Types.hpp"
#include "sgcReports_Model.hpp"
#include "sgcReports_Data.hpp"
#include "sgcReports_Fluent.hpp"
void ExportSalesReport(const String Folder)
{
const String Total = "[FormatFloat('#,0.00', Sum(Sales.Amount))]";
TsgcReportJSONSource *Sales = new TsgcReportJSONSource(NULL);
TsgcReportBuilder *Builder = new TsgcReportBuilder();
try
{
Sales->SourceName = "Sales";
Sales->JSON = "[{\"Region\":\"East\",\"Customer\":\"Acme Corp\",\"Amount\":1450.00},"
"{\"Region\":\"East\",\"Customer\":\"Blue Harbor\",\"Amount\":600.00},"
"{\"Region\":\"North\",\"Customer\":\"Nordic Labs\",\"Amount\":2100.75}]";
Builder->Title("Sales by region")->Author("eSeGeCe")->Units(ruMillimeters)
->Style("Base")->Font("Arial", 10)->EndStyle()
->Style("Group")->Font("Arial", 11)->Bold()->BackColor(0xEEEEEE)->EndStyle()
->Page("")->Paper(rpsA4, roPortrait)->Margins(15)
// one header per region, one line per sale, a subtotal per region
->GroupHeader("Sales.Region", 9)->Style("Group")
->Text("Region: [Sales.Region]", 0, 1, 180, 7)->TagRole(rtrHeading2)->EndBand()
->MasterData("Sales", 6)->Style("Base")
->Text("[Sales.Customer]", 2, 0, 120, 6)
->Text("[Sales.Amount]", 130, 0, 50, 6)->AlignRight()->Format("#,0.00")->EndBand()
->GroupFooter(9)->Style("Base")
->Text("Region total " + Total, 80, 1, 100, 6)->AlignRight()->Bold()->EndBand()
->EndPage()->Data(Sales);
// accessible PDF (PDF/UA is on by default), plus the same data as Excel
Builder->SaveToPDF(IncludeTrailingPathDelimiter(Folder) + "sales.pdf");
Builder->SaveToXLSX(IncludeTrailingPathDelimiter(Folder) + "sales.xlsx");
Builder->SaveToCSV(IncludeTrailingPathDelimiter(Folder) + "sales.csv");
}
__finally
{
delete Builder;
delete Sales;
}
}C# 中同样的构建器链,类名与 Delphi 相同。
using System.IO;
using esegece.sgcReports;
public static class SalesReport
{
const string Sales = "[" +
"{\"Region\":\"East\",\"Customer\":\"Acme Corp\",\"Amount\":1450.00}," +
"{\"Region\":\"East\",\"Customer\":\"Blue Harbor\",\"Amount\":600.00}," +
"{\"Region\":\"North\",\"Customer\":\"Nordic Labs\",\"Amount\":2100.75}," +
"{\"Region\":\"North\",\"Customer\":\"Fjord Ltd\",\"Amount\":880.20}]";
const string Total = "[FormatFloat('#,0.00', Sum(Sales.Amount))]";
public static void Export(string aFolder)
{
using (TsgcReportJSONSource oSales = new TsgcReportJSONSource())
using (TsgcReportBuilder oBuilder = new TsgcReportBuilder())
{
oSales.SourceName = "Sales";
oSales.JSON = Sales;
oBuilder.Title("Sales by region").Author("eSeGeCe").Units(TsgcReportUnits.ruMillimeters)
.Style("Base").Font("Arial", 10).EndStyle()
.Style("Group").Font("Arial", 11).Bold().BackColor(0xEEEEEE).EndStyle()
.Page().Paper(TsgcReportPaperSize.rpsA4).Margins(15)
// one header per region, one line per sale, a subtotal per region
.GroupHeader("Sales.Region", 9).Style("Group")
.Text("Region: [Sales.Region]", 0, 1, 180, 7)
.TagRole(TsgcReportTagRole.rtrHeading2).EndBand()
.MasterData("Sales", 6).Style("Base")
.Text("[Sales.Customer]", 2, 0, 120, 6)
.Text("[Sales.Amount]", 130, 0, 50, 6).AlignRight().Format("#,0.00").EndBand()
.GroupFooter(9).Style("Base")
.Text("Region total " + Total, 80, 1, 100, 6).AlignRight().Bold().EndBand()
.EndPage().Data(oSales);
// accessible PDF (PDF/UA is on by default), plus the same data as Excel
oBuilder.SaveToPDF(Path.Combine(aFolder, "sales.pdf"));
oBuilder.SaveToXLSX(Path.Combine(aFolder, "sales.xlsx"));
oBuilder.SaveToCSV(Path.Combine(aFolder, "sales.csv"));
}
}
}dotnet add package esegece.sgcReportssgcReports 附带十个 Delphi 演示、八个 C++ Builder 演示和十个 .NET 演示。下面的卡片是 Delphi 项目;大多数都有同名的 C++ Builder 和 .NET 对应版本。
由数据集生成的主从发票:页眉、明细行、合计和二维码,可在预览中查看并保存为 PDF。
按地区分组的销售,含分组页眉、小计,并在汇总分区中给出总计。
用流式构建器编写的完整报表,然后导出为所有格式。
在两个备注框中编辑 JSON 定义及其数据并渲染,错误会指向 JSON 路径。
带替代文字和标题角色的带标签 PDF/UA-1 输出,可直接进行 veraPDF 检查。
一份准备好的报表,输出为 PDF、XLSX、CSV 和 PNG 文件。
通过数据集源由 SQL 查询提供数据的报表。
带页面导航的 FireMonkey 预览。FireMonkey 预览运行在 Windows 上。
适用于 Windows 和 Linux64 的控制台守护进程,用工作线程池渲染排队的 JSON 作业。
通过 HTTP 提供的报表,带浏览器查看器、参数和下载。需要 sgcWebSockets 和 sgcHTML。
sgcReports 包含在 sgcUI Enterprise 中,也可单独购买。它使用 sgcPDF 引擎输出 PDF 和条形码,因此在每种配置中都需要 sgcPDF。sgcReports 同样包含在 All-Access 中。
免费 .NET 社区版软件包(esegece.sgcReports.Community、.WinForms.Community、.HTML.Community、.AspNetCore.Community)包含引擎、导出和预览。在 Delphi 中,只有安装了已授权的 sgcPDF 时,社区版安装程序才会提供 sgcReports。用于 Delphi 和 C++ Builder 的 sgcReportsHTML 桥接仅限注册版。
| 功能 | 社区版(免费) | 注册版 |
|---|---|---|
| 流式构建器、报表模型和 JSON 定义 | ✓ | ✓ |
| 分区、分组、主从和表达式 | ✓ | ✓ |
| 条形码 | ✓ | ✓ |
| PDF/UA 和 PDF/A-3 导出 | ✓ | ✓ |
| XLSX、CSV 和 PNG 导出 | ✓ | ✓ |
| WinForms 预览 | ✓ | ✓ |
| 适用于服务和 Linux 的无界面引擎 | ✓ | ✓ |
| 适用于 Delphi 和 C++ Builder 的 sgcReportsHTML 桥接(HTTP 端点、查看器、网页设计器) | − | ✓ |
TsgcReport、TsgcReportEngine 和流式 TsgcReportBuilder。
TsgcReportDataSetSource, TsgcReportJSONSource and TsgcReportEventSource.
TsgcReportPDFExport, TsgcReportXLSXExport, TsgcReportCSVExport and TsgcReportImageExport.
TsgcReportPreviewVCL 和 TsgcReportPreviewFMX,其中 FireMonkey 预览运行在 Windows 上。
TsgcReportHTTPEndpoint, TsgcReportHTMLViewer and TsgcReportHTMLDesigner. 它需要 sgcWebSockets Professional 或更高版本以及 sgcHTML。注册版
命名空间 esegece.sgcReports 中的相同类名:构建器、数据源、引擎和导出。
| 目标 | 组件 | 平台 |
|---|---|---|
| Delphi 7 至 13 | 模型、表达式、数据、版面、引擎和导出 | Windows、Linux64、macOS、iOS 和 Android |
| C++ Builder 2007 至 13 | 相同的类 | 生成的 .hpp 头文件和静态库 |
| VCL 预览 | TsgcReportPreviewVCL | Windows |
| FireMonkey 预览 | TsgcReportPreviewFMX | Windows |
| .NET | 构建器、数据源、引擎、导出和 WinForms 预览 | Windows,另可在 Linux 上无界面使用 |
需要,始终需要。sgcReports 用 sgcPDF 引擎写出 PDF 并绘制条形码。sgcUI Enterprise 同时包含两者。在 Delphi 社区版安装程序中,只有安装了已授权的 sgcPDF 时才会提供 sgcReports。PDF 引擎还负责绘制无障碍 PDF 文件的带标签结构。
有,在浏览器中。sgcReportsHTML 桥接中的 TsgcReportHTMLDesigner 用分区画布、属性检查器和实时预览来编辑 JSON 报表定义。在代码中,流式构建器和 JSON 定义涵盖相同的模型。保存的定义可在桌面应用程序、服务和守护进程中同样加载。
可以。核心不依赖 VCL 或 FireMonkey,也没有外部 DLL,因此引擎和导出可以在 Linux64 控制台应用程序和守护进程中运行。ReportLinuxDaemon 演示和 Linux 守护进程主题包含一个 systemd 单元。同样的代码也可在 Windows 服务中运行。
PDF(默认为带标签的 PDF/UA-1,按需输出 PDF/A-3)、XLSX、CSV 和 PNG 页面。它们都基于同一批准备好的页面,因此报表只需准备一次,想导出几次都可以。每种导出都可以写入文件或流,用于网页响应和邮件附件。
是的,每个线程使用一个引擎。每个工作线程创建自己的报表、引擎、数据源和导出,而字体管理器和只读的 JSON 定义可以共享。线程安全主题介绍了工作线程池模式。Windows 服务器也可以在启动时为多线程调用一次 sgcReportsConfigureForServer。
可以。把报表定义存储为 JSON,并在运行时用 sgcReportLoadFromJSON 加载,这样新的版面不需要新的构建。用户可以在网页设计器中编辑它们,您的应用程序也可以生成它们。加载时的错误会指出出错成员的 JSON 路径,因此客户专用版面很容易支持。
可以。TsgcReportPreviewVCL 显示准备好的页面,带导航、缩放和适应模式。TsgcReportPreviewFMX 是 Windows 上的 FireMonkey 预览,.NET 则有 WinForms 预览。预览通过 sgcPDF 查看器控件绘制,因此屏幕与 PDF 导出一致。
简介, 安装, 入门, TsgcReportBuilder, 分组报表, 导出 XLSX、CSV 和 PNG, 无障碍 PDF, PDF/A, 通过 HTTP 提供, Linux 守护进程.
简介, 入门, TsgcReportBuilder, 分组报表.
Delphi、C++ Builder 和 .NET,涵盖每款 sgcUI 产品。