Entra C#.
Salen informes.

Un motor RDL de código abierto para .NET 8 y 10. PDF, Excel, HTML, CSV y más — desde SQL, JSON o C# puro. Apache 2.0, con componentes adicionales de triple licencia.

$ dotnet add package Majorsilence.Reporting.RdlEngine.SkiaSharp
Program.cs entrada
var parser = new RDLParser(rdlXml);
using var report = await parser.Parse();
await report.RunGetData(null);
await report.RunRender(ofs,
  OutputPresentationType.PDF);
report.pdf salida
Resumen de ventas — T2 2026
Generado el 2026-06-11 · página 1 de 4
RegiónUnidadesIngresos
Norteamérica12.4081,24 M$
Europa9.1120,97 M$
Asia-Pacífico7.6540,81 M$
Total29.1743,02 M$
PDF XLSX HTML CSV XML TIFF MHT
7+
Formatos de salida
10+
Fuentes de datos
10
Tipos de código de barras / QR
.NET 8 y 10
Multiplataforma
Apache 2.0
Código abierto

Todo lo que necesitas para informes en .NET

Desde simples facturas en PDF hasta informes complejos de varias páginas con códigos de barras, gráficos y datos dinámicos — todo desde una sola biblioteca.

📄

Exportación multiformato

Genera cualquier informe en PDF, Excel (xlsx), HTML, CSV, RTF y XML a partir de una sola consulta de datos. Una llamada, todos los formatos.

PDF XLSX HTML CSV RTF
🗄️

Fuentes de datos flexibles

Conéctate a SQLite, SQL Server, PostgreSQL, MySQL, Firebird, archivos JSON, XML, o inyecta datos directamente desde objetos C#.

Microsoft.Data.Sqlite · Json · SQL · PostgreSQL
📦

Códigos de barras y QR

10 tipos de códigos de barras CRI integrados vía ZXing.Net: QR Code, Code 128, Code 39, Data Matrix, Aztec, PDF417, ITF-14 y más.

Custom Report Items (CRI)
🖥️

Diseñador visual

Diseñador de informes de arrastrar y soltar en Windows. Diseña archivos RDL visualmente y luego renderízalos en el servidor en cualquier sistema operativo.

Diseñador de Windows · Renderizado multiplataforma
🌐

Multiplataforma

El renderizado del lado del servidor funciona en Linux, macOS y Windows. Funciona muy bien en contenedores Docker y despliegues en la nube.

Linux · macOS · Windows · Docker

Formato de informe RDL

Basado en el estándar abierto RDL (Report Definition Language). Los informes son archivos XML — cómodos para el control de versiones y portables.

Estándar abierto · XML · Portable

La alternativa moderna a las soluciones de informes tradicionales

Crystal Reports requiere .NET Framework y una licencia comercial. SSRS requiere SQL Server y un servidor Windows dedicado. Majorsilence Reporting es un paquete NuGet que funciona en cualquier lugar donde funcione .NET.

Majorsilence
Esta biblioteca
Crystal Reports SSRS FastReport /
DevExpress
Licencia Núcleo Apache 2.0, componentes de triple licencia MIT/BSD — gratis Comercial, por puesto Requiere licencia de SQL Server Comercial, por puesto
.NET 8 / 10 Soporte completo Solo .NET Framework Solo renderizado (parcial) Compatible
Linux / Docker Multiplataforma Solo Windows Solo Windows Server Varía según el producto
Despliegue Paquete NuGet Runtime redistribuible Servidor de informes dedicado Paquete NuGet
Formato de informe RDL abierto (XML) Binario .rpt (propietario) RDL abierto (XML) Propietario
Formatos de salida PDF, XLSX, HTML, CSV, RTF, XML, TIFF, MHT PDF, Excel, Word, HTML PDF, Excel, Word, HTML, CSV PDF, Excel, Word, HTML
Inyectar objetos C# SetData() Limitado Limitado Varía
Portal de informes integrado Constrúyelo tú mismo Crystal Reports Server (coste adicional) Incluido Algunos productos incluyen uno
Código abierto GitHub
🔄

¿Migrando desde Crystal Reports o SSRS?

Los informes de SSRS usan el mismo formato RDL abierto — muchos se renderizarán con Majorsilence Reporting sin modificaciones. Los archivos .rpt de Crystal Reports necesitan conversión, pero los informes tabulares sencillos se migran sin problemas.

Leer la guía de migración →

Añádelo a tu proyecto

Disponible en NuGet. Añade el motor y, opcionalmente, el paquete CRI para soporte de códigos de barras.

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

Listo y funcionando en minutos

Llama a RdlEngineConfigInit() una vez al iniciar, carga un archivo RDL y renderiza en cualquier formato.

Renderizar un informe basado en SQLite a PDF C#
using Majorsilence.Reporting.Rdl;

// Llamar una vez por instancia de la aplicación
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);
Exportar a PDF, Excel, CSV y HTML en una sola pasada C#
// RunGetData una vez, y luego RunRender para cada formato.
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);
}
Leer datos desde un archivo JSON local RDL + C#
/* En el DataSource del RDL */
<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);
Añadir un código QR o de barras a un informe (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);
Inyectar datos desde objetos C# en lugar de una consulta en vivo 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);