AndersonN.Omni.Report.Expressions 0.1.1

dotnet add package AndersonN.Omni.Report.Expressions --version 0.1.1
                    
NuGet\Install-Package AndersonN.Omni.Report.Expressions -Version 0.1.1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="AndersonN.Omni.Report.Expressions" Version="0.1.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="AndersonN.Omni.Report.Expressions" Version="0.1.1" />
                    
Directory.Packages.props
<PackageReference Include="AndersonN.Omni.Report.Expressions" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add AndersonN.Omni.Report.Expressions --version 0.1.1
                    
#r "nuget: AndersonN.Omni.Report.Expressions, 0.1.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package AndersonN.Omni.Report.Expressions@0.1.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=AndersonN.Omni.Report.Expressions&version=0.1.1
                    
Install as a Cake Addin
#tool nuget:?package=AndersonN.Omni.Report.Expressions&version=0.1.1
                    
Install as a Cake Tool

OmniReport

CI License: MIT .NET NuGet Tests Coverage

Motor profissional de relatórios bandados para .NET 10, com duas modalidades de autoria (code-first fluent + designer visual Blazor) e pipeline de renderização pluggable (SkiaSharp, GDI/Windows, PDF vetorial, XLSX, HTML/SVG/CSV/JSON/Markdown, ESC/POS térmico, Android Print Framework). Gráficos nativos (barras/linhas/pizza), medidores KPI (gauge/data-bar/sparkline/indicator), Tablix, mapas vetoriais e códigos de barras/QR; conectores de dados para SQL (SQLite/PostgreSQL/SQL Server/MySQL), JSON, XML, REST e sistema de arquivos.

Equivalente em capacidade a Crystal Reports / SSRS / FastReport, original, MIT, com foco em cenários brasileiros (PDV, NFC-e, DANFE, ABNT NBR 5891).

Galeria

Designer visual (Blazor)

Screenshot pendente. Para capturar: dotnet run --project samples/Reporting.Samples.BlazorServer, abra /designer, carregue um exemplo pela faixa Sandbox (ex.: "12 · Dashboard") e salve a imagem em assets/designer.png — depois é só descomentar a linha acima.

Saída do engine (renderização real dos samples)

<img src="assets/sample-dashboard.png" width="360" alt="Dashboard"/><br/>Dashboard — gráficos + Gauge + Sparkline + Indicator + DataBar <img src="assets/sample-map.png" width="360" alt="Mapa vetorial"/><br/>Mapa vetorial — Web Mercator + graticule + shapes
<img src="assets/sample-tablix.png" width="360" alt="Tablix"/><br/>Tablix — tabela bandada <img src="assets/sample-nfce.png" width="220" alt="Cupom NFC-e"/><br/>Cupom NFC-e — térmico 80 mm (DANFE)

Imagens geradas por dotnet run --project samples/Reporting.Samples.CodeFirst -- ./out (PNG vetorial→raster via SkiaSharp).

Sumário

Arquitetura

graph TB
    subgraph CoreLibs["Core libraries (TFM net10.0, sem deps de plataforma)"]
        Core[Reporting.Core<br/>domain model · charts · KPIs · RDL elements]
        Expr[Reporting.Expressions<br/>NCalc + agregados + templates]
        Data[Reporting.DataSources<br/>IEnumerable · DataTable · master-detail]
        Render[Reporting.Rendering<br/>IRenderingContext · IPathBuilder]
        Layout[Reporting.Layout<br/>two-pass paginator · Chart/KPI/Barcode]
        Codef[Reporting.CodeFirst<br/>fluent ReportBuilder]
        Serial[Reporting.Serialization<br/>.repx XML + .repjson JSON · round-trip]
        Bar[Reporting.Barcode<br/>1D + QR encoders]
        Print[Reporting.Printing<br/>IReportPrinter abstrações]
    end

    subgraph Optin["Add-ons opt-in (carregados só quando o host habilita)"]
        Roslyn[Reporting.Expressions.Roslyn<br/>compila bloco Code C# · só fontes confiáveis]
        Maps[Reporting.Maps<br/>shapes GeoJSON embutidos p/ basemap]
    end

    subgraph Providers["Data providers (pluggable)"]
        Ado[AdoNet → SQLite · PostgreSQL · SQL Server · MySQL]
        Semi[JSON · XML · WebService/REST · FileSystem]
    end

    subgraph Renderers["Renderers (pluggable)"]
        Skia[Reporting.Rendering.Skia<br/>SkiaPrimitiveRenderer · cross-plat]
        Gdi[Reporting.Rendering.Gdi<br/>net10.0-windows · System.Drawing.Graphics]
    end

    subgraph Outputs["Output exporters"]
        Pdf[Reporting.Output.Pdf<br/>SkiaPdfExporter · vetorial nativo]
        Xlsx[Reporting.Output.Excel<br/>ClosedXML · fórmulas =SUM]
        Texto[Output.Svg · Html · Csv · Json · Markdown]
    end

    subgraph Printers["Printer drivers"]
        WinSp[WindowsSpooler<br/>PrintDocument → GDI]
        EscPos[EscPos<br/>raster 203dpi → TCP/serial]
        Andr[Android<br/>PrintManager · stub condicional]
    end

    subgraph UI["UI components (Razor Class Libraries)"]
        Viewer[Reporting.Viewer.Blazor<br/>page navigator · zoom · export]
        Designer[Reporting.Designer.Blazor<br/>shell · canvas · property grid]
    end

    Host[Reporting.Hosting.AspNetCore<br/>AddReporting fluent DI]

    Core --> Expr & Data & Render & Layout & Codef & Serial & Print
    Bar --> Layout
    Expr --> Roslyn
    Core --> Maps
    Roslyn -.->|Code resolver| Layout
    Maps -.->|shapes GeoJSON| Layout
    Data --> Ado & Semi
    Render --> Skia & Gdi
    Layout --> Skia & Gdi
    Skia --> Pdf & Texto
    Layout --> Xlsx & Texto
    Render --> WinSp & EscPos
    Print --> WinSp & EscPos & Andr
    Layout --> Viewer & Designer
    Skia --> Viewer & Designer
    Ado & Semi --> Designer
    Pdf & Xlsx & Texto --> Viewer & Designer
    Core & Render & Pdf & Xlsx & Print & Serial --> Host

Princípios:

  • Reporting.Core é puro: zero dependência de plataforma, GUI ou framework de UI.
  • Bandas + elementos imutáveis (sealed record) compõem o ReportDefinition.
  • A paginação produz LayoutPrimitives posicionados em coordenadas absolutas — qualquer renderer (Skia, GDI) consome a mesma sequência.
  • Renderers/exporters/printers são plug-and-play via DI.
  • Designer e Viewer são Razor Class Libraries: o mesmo binário roda em Blazor Server, Blazor Web App e MAUI Blazor Hybrid (Windows + Android).

Instalação

Pacotes publicados no NuGet.org sob o prefixo AndersonN.Omni.Report.* (e espelhados no GitHub Packages):

# Conjunto mínimo: autoria code-first + paginação + render PDF (Skia)
dotnet add package AndersonN.Omni.Report.CodeFirst
dotnet add package AndersonN.Omni.Report.Layout
dotnet add package AndersonN.Omni.Report.Rendering.Skia
dotnet add package AndersonN.Omni.Report.Output.Pdf

# Designer e Viewer visuais (Blazor)
dotnet add package AndersonN.Omni.Report.Designer.Blazor
dotnet add package AndersonN.Omni.Report.Viewer.Blazor

# Injeção de dependência para ASP.NET Core / Blazor / MAUI
dotnet add package AndersonN.Omni.Report.Hosting.AspNetCore

O ID do pacote leva o prefixo AndersonN.Omni.Report., mas o namespace continua Reporting.* (ex.: using Reporting.CodeFirst;) e os assets das RCLs seguem em _content/Reporting.Designer.Blazor / _content/Reporting.Viewer.Blazor.

Pacotes por necessidade — todos com o prefixo AndersonN.Omni.Report. (só o sufixo varia):

Categoria Sufixos (após AndersonN.Omni.Report.)
Exporters Output.{Excel,Html,Svg,Csv,Json,Markdown}
Conectores DataSources.{Sqlite,PostgreSql,SqlServer,MySql,AdoNet,Json,Xml,WebService,FileSystem}
Impressão Printing.{WindowsSpooler,EscPos,Android}
Extras Barcode · Maps · Designer.Blazor.DataConnect
Opt-in (executa C#) Expressions.Roslyn — ⚠ use apenas com fontes de relatório confiáveis

GitHub Packages: para instalar pelo feed do GitHub em vez do NuGet.org, adicione a fonte https://nuget.pkg.github.com/afernandes/index.json (requer autenticação com um token do GitHub).

Quickstarts

Requisitos: SDK do .NET 10. O núcleo, o Skia, os exporters e o ESC/POS são cross-platform; o renderer GDI e o WindowsSpoolerPrinter exigem net10.0-windows (Windows) e o AndroidPrintFrameworkPrinter exige net10.0-android.

Primeiro relatório code-first em 5 minutos

using Reporting.CodeFirst;
using Reporting.Output.Pdf;
using Reporting.Layout;
using Reporting.Rendering.Skia;

var vendas = new[]
{
    new { Cliente = "Ana",  Produto = "Caneta",  Total = 25.00m },
    new { Cliente = "Ana",  Produto = "Caderno", Total = 27.40m },
    new { Cliente = "Beto", Produto = "Lápis",   Total = 10.80m },
};

var report = ReportBuilder.Create("Vendas")
    .Page(p => p.A4().Portrait().Margins(20))
    .DataSource("Vendas", vendas)
    .ReportHeader(h => h.Height(15)
        .Text("Relatório de Vendas").At(0, 0).Size(170, 12).Center().Bold().Font("Arial", 16))
    .Group("PorCliente", "Fields.Cliente", g => g
        .Header(h => h.Height(8)
            .Text("Cliente: {Fields.Cliente}").At(0, 1).Size(170, 6).Bold())
        .Detail(d => d.Height(6)
            .Text("{Fields.Produto}").At(0, 0).Size(100, 6)
            .Text("{Fields.Total:C}").At(140, 0).Size(30, 6).AlignRight()))
    .ReportFooter(f => f.Height(10)
        .Text("Total: {Sum(Fields.Total):C}").At(0, 2).Size(170, 6).AlignRight().Bold())
    .Build();

var rendered = await report.PaginateAsync();
new SkiaPdfExporter().ExportToFile(rendered, "vendas.pdf");

Resultado: PDF vetorial com texto selecionável, fórmulas pt-BR (R$ 53,40), agrupado por cliente.

Primeiro relatório no designer em 5 minutos

  1. Adicione ao seu app Blazor o pacote AndersonN.Omni.Report.Designer.Blazor:
    <PackageReference Include="AndersonN.Omni.Report.Designer.Blazor" />
    
  2. No App.razor (ou _Host.cshtml) carregue as folhas de estilo do designer no <head> — as cinco são necessárias, na ordem abaixo (tokens → base → layout → componentes → overlays):
    <link rel="stylesheet" href="_content/Reporting.Designer.Blazor/css/tokens.css" />
    <link rel="stylesheet" href="_content/Reporting.Designer.Blazor/css/base.css" />
    <link rel="stylesheet" href="_content/Reporting.Designer.Blazor/css/layout.css" />
    <link rel="stylesheet" href="_content/Reporting.Designer.Blazor/css/components.css" />
    <link rel="stylesheet" href="_content/Reporting.Designer.Blazor/css/overlays.css" />
    
    E, antes de </body>, o módulo JS (drag/resize, marquee, smart-guides, réguas e zoom):
    <script src="_content/Reporting.Designer.Blazor/js/designer.js"></script>
    
  3. Em uma página:
    @page "/designer"
    @rendermode InteractiveServer
    @using Reporting.Designer.Blazor
    
    <ReportDesigner OnSaved="@HandleSaved" />
    
    @code {
        private async Task HandleSaved(byte[] repxBytes)
        {
            // Persist em DB, S3, etc.
            await File.WriteAllBytesAsync("user-report.repx", repxBytes);
        }
    }
    
  4. Navegue, arraste do toolbox, edite no property grid, salve. O .repx é compatível com RepxSerializer.Load e roda igual no pipeline de paginação code-first.

Canvas low-level (sem bandas)

Quando o modelo bandado não encaixa (certificados, crachás, etiquetas, layouts computados), fale direto com IRenderingContext — sem ReportDefinition, sem paginador. Você posiciona cada primitivo em milímetros:

using Reporting.Geometry;
using Reporting.Paper;
using Reporting.Rendering;
using Reporting.Rendering.Skia;
using Reporting.Styling;

using var ctx = new SkiaRenderingContext();      // é IRenderingContext E ITextMeasurer
ctx.BeginPage(PageSetup.A4Portrait);

ctx.DrawRectangle(                                // faixa laranja preenchida
    new Rectangle(Unit.FromMm(20), Unit.FromMm(20), Unit.FromMm(170), Unit.FromMm(16)),
    pen: null, fill: new BrushStyle(Color.FromRgb(0xC2, 0x41, 0x0C)));

ctx.DrawText("CRACHÁ DE ACESSO",                  // título centralizado
    new Rectangle(Unit.FromMm(20), Unit.FromMm(24), Unit.FromMm(170), Unit.FromMm(10)),
    new TextStyle(new Font("Arial", 20, FontStyle.Bold), Color.White, HorizontalAlignment.Center));

ctx.DrawPath(b => b                               // losango: contorno + preenchimento
        .MoveTo(new Point(Unit.FromMm(105), Unit.FromMm(42)))
        .LineTo(new Point(Unit.FromMm(110), Unit.FromMm(47)))
        .LineTo(new Point(Unit.FromMm(105), Unit.FromMm(52)))
        .LineTo(new Point(Unit.FromMm(100), Unit.FromMm(47)))
        .Close(),
    new PenStyle(Color.Black, Unit.FromPoint(0.7)),
    new BrushStyle(Color.FromRgb(0x96, 0x6C, 0x29)));

ctx.EndPage();
File.WriteAllBytes("cracha.png", ctx.GetPagePng(0));

O mesmo código de desenho roda contra qualquer backend: troque SkiaRenderingContext por SkiaPdfRenderingContext (PDF vetorial) ou RecordingRenderingContext (→ XLSX) sem mudar uma linha. Guia completo em docs/low-level-canvas.md.

Hospedando em ASP.NET Core / Blazor / MAUI

using Reporting.Hosting;

builder.Services.AddReporting(opts => opts
    .UseSkiaRendering()                                        // padrão; pode chamar UseGdi() em Windows
    .UsePdfOutput(new PdfExportOptions { Author = "Acme" })
    .UseExcelOutput()
    .UsePrinter<WindowsSpoolerPrinter>()                       // ou EscPosPrinter, AndroidPrintFrameworkPrinter
    .AddDataSource("Vendas", await LoadVendasAsync()));

A partir daí, qualquer componente Razor (<ReportViewer />, <ReportDesigner />) ou serviço custom recebe via DI: IRenderingContext, IReportPaginator, SkiaPdfExporter, ExcelExporter, IReportPrinter, DataSourceRegistry, RepxSerializer.

Samples

Sample Plataforma O que demonstra
samples/Reporting.Samples.CodeFirst Console 15 relatórios reais — Vendas, Produtos, Caixa, Cupom NFC-e, conectores (JSON/XML/REST/FileSystem/SQLite) e componentes visuais (Dashboard, Tablix, Mapa, bloco Code) → PDF/PNG/XLSX/HTML/SVG/CSV/JSON/Markdown/.repx/.repjson/.escpos.bin
samples/Reporting.Samples.DatabaseReport Console Relatório a partir de banco SQLite via AdoNet/SqliteDataSource
samples/Reporting.Samples.WindowsPrinting Windows console Lista impressoras + imprime sample 1 em "Microsoft Print to PDF" via WindowsSpoolerPrinter
samples/Reporting.Samples.BlazorServer Blazor Web App Galeria com <ReportViewer /> + rota /designer com <ReportDesigner /> e faixa Sandbox que carrega os samples (Dashboard/Tablix/Mapa renderizam com dados no preview)
samples/Reporting.Samples.MauiHybrid MAUI (Windows + Android cond.) Mesmos componentes Razor em desktop nativo e Android nativo
# rodar os samples principais (gera PDFs, XLSX, .repx, .repjson):
dotnet run --project samples/Reporting.Samples.CodeFirst -c Release -- ./out
# iniciar Blazor Server (designer + viewer):
dotnet run --project samples/Reporting.Samples.BlazorServer
# Windows + designer/viewer in-process via MAUI WebView:
dotnet run --project samples/Reporting.Samples.MauiHybrid -f net10.0-windows10.0.19041.0

Status

A v0.1.0 entregou as 11 etapas do roteiro original (17 bibliotecas, 375 testes). Desde então o projeto mais que dobrou: hoje são 36 bibliotecas em src/, 726 testes verdes (22 projetos de teste) e cobertura ≥ 80% no núcleo.

Adicionado após a v0.1.0:

Área Módulos / recursos Status
Conectores de dados AdoNet · SQLite · PostgreSQL · SQL Server · MySQL · JSON · XML · WebService/REST · FileSystem
Exporters de texto SVG · HTML · CSV · JSON · Markdown (com testes)
Código de barras Reporting.Barcode — 1D (Code128/39/Codabar/ITF/EAN/UPC/ISBN/ISSN) + QR Code 2D
Master-detail sub-bandas + relações pai→filho (paginador e designer)
Designer DataConnect (conexão/schema/query/preview/relações), impressão (browser + nativo), formatação condicional, RDL Phase 1, editores visuais dos 7 elementos avançados, réguas dual-axis com guias arrastáveis/snap, status bar e diálogo "Sobre" reais
Gráficos ChartElement barras/linhas/pizza renderizando + fluente .Chart()
KPIs Gauge · DataBar · Sparkline · Indicator renderizando + API fluente
Tablix (tabela) data region bandada renderizando + fluente .Tablix() (matrix/grupos aninhados: futuro)
Map mapa vetorial: projeção Web Mercator + graticule + shapes GeoJSON (basemap offline) + marcadores projetados · pacote opt-in Reporting.Maps com shapes embutidos · fluente .Map().ShapeSet()/.Shapes()/.Graticule() (tiles online: futuro)
Code (C#/Roslyn) avaliação Code.X(...) via pacote opt-in Reporting.Expressions.Roslyn (executa C# — só fontes confiáveis)

Veja CHANGELOG.md para o histórico e docs/ para guias por área.

Roadmap (ainda não implementado)

  • Tablix matrix — grupos de linha/coluna aninhados e células de interseção (hoje: tabela bandada com colunas fixas).
  • Map · tiles online — basemap raster (OSM/Bing) como camada opt-in (hoje: basemap vetorial offline a partir de shapes GeoJSON).
  • Reporting.Maps — os shapes embutidos hoje cobrem apenas um contorno simplificado do Brasil; conjuntos detalhados (estados, América do Sul, mundo) podem ser registrados pelo host via MapShapeRegistry.Register(nome, geoJson).

Documentação

Contribuindo

Conventional Commits, branch model main + feature branches. Veja CONTRIBUTING.md.

Build e testes localmente (a solução usa o formato .slnx):

dotnet build OmniReport.slnx -c Release
dotnet test  OmniReport.slnx

Projetos de produção compilam com TreatWarningsAsErrors — mantenha o build sem warnings.

License

MIT — see LICENSE.

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (4)

Showing the top 4 NuGet packages that depend on AndersonN.Omni.Report.Expressions:

Package Downloads
AndersonN.Omni.Report.Layout

OmniReport — banded layout engine producing positioned LayoutPrimitives ready to be consumed by any IRenderingContext.

AndersonN.Omni.Report.CodeFirst

OmniReport — fluent code-first builder for ReportDefinition + automatic data source registration.

AndersonN.Omni.Report.Expressions.Roslyn

OmniReport — resolver opt-in baseado em Roslyn para o elemento Code. Compila o C# embutido no relatório (Microsoft.CodeAnalysis) para que expressões chamem Code.MethodName(...). ⚠ Executa C# embutido no relatório — habilite apenas para fontes confiáveis.

AndersonN.Omni.Report.Hosting.AspNetCore

OmniReport — DI helpers for ASP.NET Core / Blazor / MAUI hosts. Wires renderers, exporters, printers and data sources via a single AddReporting(opts => ...) call.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.1.1 289 6/18/2026
0.1.0 291 6/18/2026

Consulte o CHANGELOG.md no repositório.