var parser = new RDLParser(rdlXml); using var report = await parser.Parse(); await report.RunGetData(null); await report.RunRender(ofs, OutputPresentationType.PDF);
.NET 报表所需的一切
从简单的 PDF 发票到包含条码、图表和动态数据的复杂多页报表——全部来自同一个库。
多格式导出
只需一次数据获取,即可将任意报表渲染为 PDF、Excel(xlsx)、HTML、CSV、RTF 和 XML。一次调用,所有格式。
灵活的数据源
连接 SQLite、SQL Server、PostgreSQL、MySQL、Firebird、JSON 文件、XML,或直接从 C# 对象注入数据。
Microsoft.Data.Sqlite · Json · SQL · PostgreSQL条码与二维码
通过 ZXing.Net 内置 10 种 CRI 条码类型:QR Code、Code 128、Code 39、Data Matrix、Aztec、PDF417、ITF-14 等。
Custom Report Items (CRI)可视化设计器
在 Windows 上使用拖放式报表设计器。可视化设计 RDL 文件,然后在任意操作系统上进行服务端渲染。
Windows 设计器 · 跨平台渲染跨平台
服务端渲染可在 Linux、macOS 和 Windows 上运行。非常适合 Docker 容器和云部署。
Linux · macOS · Windows · DockerRDL 报表格式
基于开放的 RDL(Report Definition Language)标准。报表以 XML 文件形式存在——便于版本控制,且具有可移植性。
开放标准 · XML · 可移植传统报表方案的现代替代品
Crystal Reports 需要 .NET Framework 和商业许可证。SSRS 需要 SQL Server 和专用的 Windows 服务器。Majorsilence Reporting 只是一个 NuGet 包,可在任何支持 .NET 的地方运行。
| Majorsilence 本库 |
Crystal Reports | SSRS | FastReport / DevExpress |
|
|---|---|---|---|---|
| 许可证 | ✓ 核心 Apache 2.0,部分组件为 MIT/BSD 三重许可 — 免费 | 商业,按席位收费 | 需要 SQL Server 许可证 | 商业,按席位收费 |
| .NET 8 / 10 | ✓ 完全支持 | ✗ 仅限 .NET Framework | 仅渲染(部分支持) | ✓ 支持 |
| Linux / Docker | ✓ 跨平台 | ✗ 仅限 Windows | ✗ 仅限 Windows Server | 因产品而异 |
| 部署方式 | ✓ NuGet 包 | 可再分发的运行时 | 专用报表服务器 | NuGet 包 |
| 报表格式 | ✓ 开放的 RDL(XML) | 二进制 .rpt(专有格式) | ✓ 开放的 RDL(XML) | 专有格式 |
| 输出格式 | PDF、XLSX、HTML、CSV、RTF、XML、TIFF、MHT | PDF、Excel、Word、HTML | PDF、Excel、Word、HTML、CSV | PDF、Excel、Word、HTML |
| 注入 C# 对象 | ✓ SetData() |
有限支持 | 有限支持 | 因产品而异 |
| 内置报表门户 | 需自行搭建 | Crystal Reports Server(额外付费) | ✓ 已包含 | 部分产品包含 |
| 开源 | ✓ GitHub | ✗ | ✗ | ✗ |
正在从 Crystal Reports 或 SSRS 迁移?
SSRS 报表使用相同的开放 RDL 格式——许多报表无需修改即可在 Majorsilence Reporting 中渲染。Crystal Reports 的 .rpt 文件需要转换,但结构简单的表格类报表可以顺利迁移。
添加到你的项目
可在 NuGet 上获取。添加引擎包,如需条码支持可另外添加 CRI 包。
几分钟内即可运行
在启动时调用一次 RdlEngineConfigInit(),加载一个 RDL 文件,然后渲染为任意格式。
using Majorsilence.Reporting.Rdl; // 每个应用程序实例调用一次 RdlEngineConfig.RdlEngineConfigInit(); var baseDir = AppContext.BaseDirectory; var dbPath = Path.Combine(baseDir, "mydata.db"); var outPath = Path.Combine(baseDir, "report.pdf"); var rdlXml = (await File.ReadAllTextAsync("Report.rdl")) .Replace("mydata.db", dbPath); var parser = new RDLParser(rdlXml) { Folder = baseDir }; using var report = await parser.Parse(); await report.RunGetData(null); var ofs = new OneFileStreamGen(outPath, true); await report.RunRender(ofs, OutputPresentationType.PDF);
// 调用一次 RunGetData,然后对每种格式调用 RunRender。 await report.RunGetData(null); foreach (var (filename, format) in new[] { ("report.pdf", OutputPresentationType.PDF), ("report.xlsx", OutputPresentationType.Excel2007), ("report.csv", OutputPresentationType.CSV), ("report.html", OutputPresentationType.HTML), }) { var ofs = new OneFileStreamGen(filename, true); await report.RunRender(ofs, format); }
/* 在 RDL 的 DataSource 中 */ <ConnectionProperties> <DataProvider>Json</DataProvider> <ConnectString>file=employees.json</ConnectString> </ConnectionProperties> var rdlXml = (await File.ReadAllTextAsync("Employees.rdl")) .Replace("employees.json", Path.Combine(baseDir, "employees.json")); var parser = new RDLParser(rdlXml) { Folder = baseDir }; using var report = await parser.Parse(); await report.RunGetData(null); await report.RunRender(new OneFileStreamGen("out.pdf", true), OutputPresentationType.PDF);
/* QrCode · BarCode128 · BarCode39 · DataMatrix · AztecCode · Pdf417 · ITF-14 */ <CustomReportItem Name="ProductQR"> <Type>QrCode</Type> <CustomProperties> <CustomProperty> <Name>Code</Name> <Value>=Fields!ProductName.Value</Value> </CustomProperty> </CustomProperties> </CustomReportItem> var parameters = new Dictionary<string, string> { ["BarcodeType"] = "DataMatrix" }; await report.RunGetData(parameters);
record SaleRecord(string Product, string Region, decimal Amount, int Quantity); var salesData = new List<SaleRecord> { new("Widget A", "North", 1250.00m, 50), new("Widget B", "South", 840.50m, 33), }; await report.DataSets["Data"].SetData(salesData); await report.RunGetData(null); await report.RunRender(ofs, OutputPresentationType.PDF);
Wiki 与指南
GitHub wiki 详细覆盖了每个主题——从安装、迁移到高级数据提供程序配置。
Wiki 首页
所有文档页面的完整目录。
→ github.com/majorsilence/Reporting/wiki迁移到 v5
重大变更、命名空间更新,以及从早期版本迁移到异步 API 的指南。
→ Migration-to-v5JSON 数据提供程序
将报表连接到本地 JSON 文件。嵌套对象可通过下划线表示法访问。
→ Json-Data-Provider动态连接字符串
在运行时覆盖连接字符串,而无需修改 RDL 文件。
→ Set-Connection-String---RuntimeWeb 设计器
将报表设计器嵌入 Web 应用程序,让用户可以在浏览器中创建报表。
→ Web-Designer参与贡献
如何 fork 项目、构建、运行测试,以及提交 pull request。
→ Contribute