ASP.NET Core - Gerando relatórios com FastReport
 Neste artigo veremos como gerar relatórios em uma aplicação ASP .NET Core MVC usando o FastReport.


O FastReport Community fornece um gerador de relatórios de código aberto para .NET6/.NET Core/.NET Framework 4.x. Você pode usar o FastReport em aplicativos MVC, Web API, Windows Forms, etc. O projeto FastReport Open Source é baseado no projeto FastReport.Net que é uma ferramenta paga.

 

 


 

Hoje eu vou mostrar como gerar um relatório no formato PDF usando o FastReport Community em uma aplicação ASP.NET Core MVC.

 

Vou partir de uma aplicação ASP .NET Core MVC que acessa a tabela Products do banco de dados Northwind no SQL Server. Você pode baixar o script para gerar o banco de dados e as tabelas neste link:  Northwind database


Após criar a aplicação no VS 2022 usando o template ASP.NET Core Web App(Model-View-Controller) com o nome WebFastReport temos que incluir os pacotes do Entity Framework Core e do FastReport no projeto.

 

Para isso usando a janela no menu Tools->..->Manage Nuget Packages for Solution , na guia Browse basta selecionar e clicar no botão Install os seguintes pacotes:

  1. Microsoft.EntityFrameworkCore.SqlServer

  2. Microsoft.EntityFrameworkCore.Design

  3. FastReport.OpenSource

  4. FastReport.OpenSource.Export.PdfSimple

  5. FastReport.OpenSource.Web

De forma que ao final do processo na guia Installed você veja os componentes instalados:

 



A seguir crie na pasta Models a classe Product contendo as propriedades que serão acessadas :

 

namespace WebFastReport.Models;

public class Product
{
    public int ProductID { get; set; }
    public string? ProductName { get; set; }
    public Int16 UnitsInStock { get; set; }
    public decimal UnitPrice { get; set; }
}

 

A seguir defina a string de conexão para acessar o banco de dados Northwind no seu ambiente no arquivo appsettings.json:

 

{
  "ConnectionStrings": {
    "DefaultConnection": "Data Source=SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

A seguir vamos uma pasta Context no projeto e nesta pasta criar a classe AppDbContext que representa o contexto do EF Core:

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions options) : base(options)
    {}

    public DbSet<Product> Products { get; set; }
}

 

Crie uma pasta Services no projeto e nesta pasta crie a interface IProductService :

 

using WebFastReport.Models;

namespace WebFastReport.Services;

public interface IProductService
{
    List<Product> GetProducts();
}

 

Agora crie a classe ProductService que implementa esta interface e que vai retornar uma lista dos produtos que vamos usar no relatório:

 

using WebFastReport.Models;

namespace WebFastReport.Services;

public class ProductService : IProductService
{
    private readonly AppDbContext _context;
    public ProductService(AppDbContext context)
    {
        _context = context;
    }

    public List<Product> GetProducts()
    {
        var products = _context.Products.ToList();
        return products;
    }
}

Registre o serviço do contexto e o serviço do produto na classe Program:

using Microsoft.EntityFrameworkCore;
using WebFastReport.Models;
using WebFastReport.Services;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllersWithViews();

var con = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<AppDbContext>(options =>
             options.UseSqlServer(con));

builder.Services.AddScoped<IProductService, ProductService>();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

 

Todas essas configurações foram feitas para acessar os dados via EF Core. Vamos agora usar o controlador e definir a geração do relatório.

 

Gerando o relatório em PDF

 

Na pasta Controllers vamos aproveitar o controlador HomeController existente e injetar os serviços IProductService e IWebHostEnvironment no construtor.

 

Vamos também criar na pasta wwwroot a pasta reports onde vamos armazenar os relatórios gerados.

 

A seguir vamos criar dois métodos Action no Controlador :

  1. CreateReport - Usado para gerar um template do relatório que vamos usar para criar o nosso relatório;

  2. ProductsReport - Usado para gerar o relatório no formato PDF com a Designer do FastReport;

public class HomeController : Controller
{
    public readonly IWebHostEnvironment _webHostEnv;
    private readonly IProductService _productService;

    public HomeController(IWebHostEnvironment webHostEnv, IProductService productService)
    {
        _webHostEnv = webHostEnv;
        _productService = productService;
    }

    [Route("CreateReport")]
    public IActionResult CreateReport()

    {
        var caminhoReport = Path.Combine(_webHostEnv.WebRootPath, @"reports\ReportMvc.frx");
        var reportFile = caminhoReport;
        var freport = new FastReport.Report();
        var productList = _productService.GetProducts();

        freport.Dictionary.RegisterBusinessObject(productList, "productList", 10, true);
        freport.Report.Save(reportFile);

        return Ok($" Relatorio gerado : {caminhoReport}");
    }

    [Route("ProductsReport")]
    public IActionResult ProductsReport()
    {

        var caminhoReport = Path.Combine(_webHostEnv.WebRootPath, @"reports\ReportMvc.frx");
        var reportFile = caminhoReport;
        var freport = new FastReport.Report();
        var productList = _productService.GetProducts();

        freport.Report.Load(reportFile);
        freport.Dictionary.RegisterBusinessObject(productList, "productList", 10, true);
        freport.Prepare();

        var pdfExport = new PDFSimpleExport();

        using MemoryStream ms = new MemoryStream();
        pdfExport.Export(freport, ms);
        ms.Flush();

        return File(ms.ToArray(), "application/pdf");
    }
}


Neste código vamos destacar os dois métodos Action :

 

1- CreateReport

    public IActionResult CreateReport()
    {
        var caminhoReport = Path.Combine(_webHostEnv.WebRootPath, @"reports\ReportMvc.frx");
        var reportFile = caminhoReport;
        var freport = new FastReport.Report();
        var productList = _productService.GetProducts();
        freport.Dictionary.RegisterBusinessObject(productList, "productList", 10, true);
        freport.Report.Save(reportFile);
        return Ok($" Relatorio gerado : {caminhoReport}");
    }

Neste código estamos obtendo o comanho completo do relatório com seu nome ReportMvc.frx e criando uma instância do FastReport. A seguir obtemos os dados dos produtos que vamos usar e registramos este objeto com um nome e a seguir salvamos o relatório na pasta wwwroot/reports.
 

2- ProductsReport

    public IActionResult ProductsReport()
    {
        var caminhoReport = Path.Combine(_webHostEnv.WebRootPath, @"reports\ReportMvc.frx");
        var reportFile = caminhoReport;
        var freport = new FastReport.Report();
        var productList = _productService.GetProducts();
        freport.Report.Load(reportFile);
        freport.Dictionary.RegisterBusinessObject(productList, "productList", 10, true);
        freport.Prepare();
        var pdfExport = new PDFSimpleExport();

        using MemoryStream ms = new MemoryStream();
        pdfExport.Export(freport, ms);
        ms.Flush();
        return File(ms.ToArray(), "application/pdf");
    }

Neste código, após montarmos o relatório com o Designer, vamos gerar o relatório no formato PDF.

 

Então primeiro executar a aplicação e gerar o template ReportMvc.frx clicando no menu - Create Report:
 

 

Vamos obter a resposta abaixo:

 

 

Com isso temos o template gerado na pasta wwwroot/reports.
 

Usando o Designer

 

Ao baixar o FastReport iremos obter o arquivo Designer que é um aplicativo .exe que usamos para montar o relatório.


Acesse o link para download : download FastReport - e baixe o pacote FastReport.Community.2022.2.0.zip com 18.4 MB. A seguir descompacte na sua máquina local.

 

 

Dentre os arquivos você terá o aplicativo Designer que deverá ser executado para criar o relatório.

 

Para abrir o Designer basta executar o aplicativo e selecione File-> Open e informar o local onde esta o template gerado ou onde desejamos salvar os relatórios criados.

 

No nosso exemplo será em :  D:\_Artigos\_reports\WebFastReport\WebFastReport\wwwroot\reports\ReportMvc.frx

 


A seguir vamos montar o leiaute abaixo para o nosso relatório :

 

 

Basta arrastar e soltar os dados que queremos exibir para montar o relatório usando os recursos do Designer.

 

Após Salvar podemos executar o projeto novamente e acessar o método Action ProductsReport :

 

 

Você pode consultar a documentação do FastReport em : https://github.com/FastReports/FastReport.Documentation

 

Na próxima parte do artigo vou mostar outra abordagem que podemos usar para criar relatórios usando o FastReport.

 

Pegue o código aqui :  WebFastReport.zip

 

"E ouvi uma grande voz do céu, que dizia: Eis aqui o tabernáculo de Deus com os homens, pois com eles habitará, e eles serão o seu povo, e o mesmo Deus estará com eles, e será o seu Deus."
Apocalipse 21:3

 

Porque um menino nos nasceu, um filho se nos deu, e o principado está sobre os seus ombros, e se chamará o seu nome: Maravilhoso, Conselheiro, Deus Forte, Pai da Eternidade, Príncipe da Paz.

Isaías 9:6
Porque um menino nos nasceu, um filho se nos deu, e o principado está sobre os seus ombros, e se chamará o seu nome: Maravilhoso, Conselheiro, Deus Forte, Pai da Eternidade, Príncipe da Paz.

Isaías 9:6

Referências:


José Carlos Macoratti