输入 C#。
输出报表。

面向 .NET 8 和 10 的开源 RDL 引擎。支持 PDF、Excel、HTML、CSV 等格式——数据可来自 SQL、JSON,或纯 C# 代码。核心采用 Apache 2.0 许可,部分组件为三重许可。

$ dotnet add package Majorsilence.Reporting.RdlEngine.SkiaSharp
Program.cs 输入
var parser = new RDLParser(rdlXml);
using var report = await parser.Parse();
await report.RunGetData(null);
await report.RunRender(ofs,
  OutputPresentationType.PDF);
report.pdf 输出
销售汇总 — 2026 年第二季度
生成于 2026-06-11 · 第 1 页,共 4 页
地区数量收入
北美12,408124 万美元
欧洲9,11297 万美元
亚太地区7,65481 万美元
合计29,174302 万美元
PDF XLSX HTML CSV XML TIFF MHT
7+
输出格式
10+
数据源
10
条码 / 二维码类型
.NET 8 & 10
跨平台
Apache 2.0
开源

.NET 报表所需的一切

从简单的 PDF 发票到包含条码、图表和动态数据的复杂多页报表——全部来自同一个库。

📄

多格式导出

只需一次数据获取,即可将任意报表渲染为 PDF、Excel(xlsx)、HTML、CSV、RTF 和 XML。一次调用,所有格式。

PDF XLSX HTML CSV RTF
🗄️

灵活的数据源

连接 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 · Docker

RDL 报表格式

基于开放的 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 包。

$ dotnet add package Majorsilence.Reporting.RdlEngine.SkiaSharp
$ dotnet add package Majorsilence.Reporting.RdlCri.SkiaSharp
$ dotnet add package Majorsilence.Reporting.RdlCreator.SkiaSharp

几分钟内即可运行

在启动时调用一次 RdlEngineConfigInit(),加载一个 RDL 文件,然后渲染为任意格式。

将基于 SQLite 的报表渲染为 PDF C#
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);
一次导出 PDF、Excel、CSV 和 HTML C#
// 调用一次 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);
}
从本地 JSON 文件读取数据 RDL + C#
/* 在 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);
为报表添加二维码或条码(CRI) RDL + C#
/* 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);
从 C# 对象注入数据,而非实时查询 C#
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);