IRONSOFTWAREHOME
USANDO O IRONXL

Como exportar arquivos do Excel no Blazor usando o IronXL

Curtis Chau
Curtis Chau
Updated: 28 de junho de 2026

Exportar dados para Excel é algo que quase toda aplicação web Blazor precisa -- seja gerando relatórios de vendas, listas de inventário ou faturas para clientes. Em uma aplicação Blazor Server, realizar isso de maneira confiável sem exigir o Microsoft Office pode parecer intimidador. IronXL torna isso simples: você pode criar, formatar e baixar arquivos Excel diretamente do servidor, sem necessidade de instalação do Office. Este guia conduz você através da construção de uma funcionalidade de exportação para Excel pronta para produção em Blazor usando o IronXL -- desde a configuração do projeto e design do serviço a formatação avançada e relatórios multi-planilhas.

Como Configurar o IronXL em um Projeto Blazor Server?

Antes de escrever qualquer lógica de exportação, você precisa adicionar o IronXL a um projeto Blazor Server e configurar um auxiliador de download do lado do navegador.

Criando o Projeto Blazor Server

Comece criando um novo projeto Blazor Server no Visual Studio 2022 ou posterior, direcionando para .NET 10. Uma vez que o projeto esteja pronto, instale o IronXL através do Console do Gerenciador de Pacotes NuGet:

PM > Install-Package IronXL.Excel

O IronXL funciona com o .NET 6 e posteriores, então projetos Blazor existentes podem adotá-lo sem atualizar o framework. Para métodos de instalação alternativos -- como a interface do NuGet ou CLI -- consulte o guia de instalação IronXL.

Adicionando o Auxiliar de Download em JavaScript

O Blazor Server roda no lado do servidor, portanto disparar um download de arquivo requer uma pequena ponte em JavaScript. Na sua pasta wwwroot, adicione um arquivo chamado excelExport.js:

window.downloadFileFromStream = async (fileName, contentStreamReference) => {
    const arrayBuffer = await contentStreamReference.arrayBuffer();
    const blob = new Blob([arrayBuffer]);
    const url = URL.createObjectURL(blob);
    const anchorElement = document.createElement('a');
    anchorElement.href = url;
    anchorElement.download = fileName ?? 'export.xlsx';
    anchorElement.click();
    anchorElement.remove();
    URL.revokeObjectURL(url);
}
JavaScript

Inclua este script em seu arquivo _Host.cshtml (ou App.razor em .NET 8+):

<script src="~/excelExport.js"></script>
HTML

Esta função converte o fluxo de bytes do Blazor em uma URL de blob temporária, dispara o download no navegador, e então limpa o objeto URL para prevenir vazamentos de memória. É intencionalmente minimalista -- o processamento intenso acontece em C# no servidor.

Primeiro passo:
arrow pointer

Como Criar um Serviço de Exportação Excel em C#?

Separar a geração de Excel de seus componentes Razor mantém o código testável e reutilizável em múltiplas páginas. O padrão abaixo encapsula o IronXL dentro de uma classe de serviço dedicada.

Construindo o ExcelExportService

Crie um novo arquivo Services/ExcelExportService.cs:

using IronXL;
using System.IO;
using ExportExcel.Models;

public class ExcelExportService
{
    public byte[] GenerateSalesReport(List<SalesData> salesData)
    {
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        workbook.Metadata.Author = "Sales Department";

        var worksheet = workbook.CreateWorkSheet("Monthly Sales");

        // Add column headers
        worksheet["A1"].Value = "Date";
        worksheet["B1"].Value = "Product";
        worksheet["C1"].Value = "Quantity";
        worksheet["D1"].Value = "Revenue";
        worksheet["E1"].Value = "Profit Margin";

        // Style the header row
        var headerRange = worksheet["A1:E1"];
        headerRange.Style.Font.Bold = true;
        headerRange.Style.BackgroundColor = "#4472C4";
        headerRange.Style.Font.Color = "#FFFFFF";

        // Populate data rows
        int row = 2;
        foreach (var sale in salesData)
        {
            worksheet[$"A{row}"].Value = sale.Date.ToString("yyyy-MM-dd");
            worksheet[$"B{row}"].Value = sale.Product ?? "Unknown";
            worksheet[$"C{row}"].Value = sale.Quantity;
            worksheet[$"D{row}"].Value = sale.Revenue;
            worksheet[$"E{row}"].Value = $"=D{row}*0.15";
            row++;
        }

        worksheet.AutoSizeColumn(0, true);

        using var ms = workbook.ToStream();
        return ms.ToArray();
    }
}

Registrando o Serviço

Adicione o serviço ao contêiner de DI em Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddScoped<ExcelExportService>();

var app = builder.Build();
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");
app.Run();

Este serviço demonstra várias capacidades chave do IronXL. Você pode criar novos livros de trabalho e planilhas com uma única chamada de método, aplicar cabeçalhos estilizados, preencher linhas de qualquer fonte de dados e incorporar fórmulas Excel como =D2*0.15. A chamada AutoSizeColumn garante que as colunas sejam largas o suficiente para exibir seu conteúdo corretamente, independentemente do comprimento dos dados. Para outras opções de formatação, veja o guia de estilo de células.

Como Disparar um Download de Excel de um Componente Blazor?

Uma vez que o serviço está no lugar, você precisa de um componente Razor que o chame e passe os bytes resultantes para o navegador.

Escrevendo o Componente Razor

Crie uma página em Pages/ExcelExportDashboard.razor:

@page "/excel-export"
@using ExportExcel.Models
@inject ExcelExportService ExcelService
@inject IJSRuntime JS

<h3>Excel Export Dashboard</h3>

<div class="export-section">
    <button class="btn btn-primary" @onclick="ExportSalesReport" disabled="@isExporting">
        @if (isExporting)
        {
            <span>Generating...</span>
        }
        else
        {
            <span>Export Sales Report</span>
        }
    </button>

    @if (!string.IsNullOrEmpty(errorMessage))
    {
        <div class="alert alert-danger mt-2">@errorMessage</div>
    }
</div>

@code {
    private bool isExporting = false;
    private string errorMessage = "";

    private async Task ExportSalesReport()
    {
        try
        {
            isExporting = true;
            errorMessage = "";

            var salesData = GetSalesData();
            var fileBytes = ExcelService.GenerateSalesReport(salesData);

            using var stream = new MemoryStream(fileBytes);
            using var streamRef = new DotNetStreamReference(stream);
            await JS.InvokeVoidAsync(
                "downloadFileFromStream",
                $"SalesReport_{DateTime.Now:yyyyMMdd}.xlsx",
                streamRef
            );
        }
        catch (Exception)
        {
            errorMessage = "Export failed. Please try again.";
        }
        finally
        {
            isExporting = false;
        }
    }

    private List<SalesData> GetSalesData()
    {
        return new List<SalesData>
        {
            new() { Date = DateTime.Now, Product = "Widget A", Quantity = 100, Revenue = 5000 },
            new() { Date = DateTime.Now.AddDays(-1), Product = "Widget B", Quantity = 75, Revenue = 3750 }
        };
    }
}

O Que o Componente Faz

A flag isExporting desativa o botão durante a geração, prevenindo solicitações duplicadas. O wrapper DotNetStreamReference lida com o streaming binário eficiente do fluxo de memória .NET para a função JavaScript — evitando grandes strings base64 que aumentariam o tamanho do payload. Nomes de arquivos com carimbo de data/hora como SalesReport_20260228.xlsx mantêm os downloads organizados sem configuração adicional.

Quando você navega para /excel-export no navegador, a página do painel carrega com um botão de exportação:

Blazor Export to Excel: Complete Guide Using IronXL in C#: Image 1 - Sample Blazor page

Clicar no botão gera a planilha e o navegador baixa automaticamente o arquivo:

Blazor Export to Excel: Complete Guide Using IronXL in C#: Image 2 - Data exported to an Excel file

Que Formatação Avançada Você Pode Aplicar às Exportações de Excel?

Exportações básicas de dados satisfazem muitos casos de uso, mas aplicativos de produção frequentemente precisam de formatação condicional, várias planilhas ou validação de dados. IronXL suporta tudo isso nativamente.

Formatação Condicional para Relatórios de Inventário

O serviço a seguir destaca itens com baixo estoque em vermelho -- um requisito comum para aplicativos de gerenciamento de armazéns ou inventário:

using IronXL;
using ExportExcel.Models;
using System.IO;

public class InventoryExportService
{
    public byte[] GenerateInventoryReport(List<InventoryItem> items)
    {
        var workbook = WorkBook.Create();
        var details = workbook.CreateWorkSheet("Inventory Details");

        // Column headers
        details["A1"].Value = "SKU";
        details["B1"].Value = "Name";
        details["C1"].Value = "Quantity";
        details["D1"].Value = "Reorder Level";
        details["E1"].Value = "Status";

        var headerRange = details["A1:E1"];
        headerRange.Style.Font.Bold = true;
        headerRange.Style.BackgroundColor = "#2E75B6";
        headerRange.Style.Font.Color = "#FFFFFF";

        for (int i = 0; i < items.Count; i++)
        {
            int row = i + 2;
            var item = items[i];

            details[$"A{row}"].Value = item.SKU;
            details[$"B{row}"].Value = item.Name;
            details[$"C{row}"].Value = item.Quantity;
            details[$"D{row}"].Value = item.ReorderLevel;
            details[$"E{row}"].Value = item.Quantity < item.ReorderLevel
                ? "Reorder Required"
                : "OK";

            if (item.Quantity < item.ReorderLevel)
            {
                // Highlight the entire row for low-stock items
                details[$"A{row}:E{row}"].Style.BackgroundColor = "#FFB6B6";
                details[$"C{row}"].Style.Font.Bold = true;
            }
        }

        details.AutoSizeColumn(0, true);
        details.AutoSizeColumn(1, true);

        using var stream = workbook.ToStream();
        return stream.ToArray();
    }
}

IronXL aplica formatação a nível de célula com base nos valores dos dados no momento da geração. Você também pode aplicar regras de formatação condicional de forma declarativa, ou gerenciar várias planilhas dentro do mesmo livro -- por exemplo, uma planilha para o estoque atual e outra para pedidos históricos.

Adicionando Várias Planilhas a Uma Única Exportação

Separar dados em planilhas lógicas melhora a legibilidade sem exigir downloads separados:

public byte[] GenerateMultiSheetReport(
    List<SalesData> sales,
    List<InventoryItem> inventory)
{
    var workbook = WorkBook.Create(ExcelFileFormat.XLSX);

    // Sheet 1 -- Sales summary
    var salesSheet = workbook.CreateWorkSheet("Sales");
    salesSheet["A1"].Value = "Date";
    salesSheet["B1"].Value = "Revenue";
    salesSheet["A1:B1"].Style.Font.Bold = true;

    for (int i = 0; i < sales.Count; i++)
    {
        salesSheet[$"A{i + 2}"].Value = sales[i].Date.ToString("yyyy-MM-dd");
        salesSheet[$"B{i + 2}"].Value = sales[i].Revenue;
    }

    // Sheet 2 -- Inventory snapshot
    var invSheet = workbook.CreateWorkSheet("Inventory");
    invSheet["A1"].Value = "SKU";
    invSheet["B1"].Value = "Name";
    invSheet["C1"].Value = "Quantity";
    invSheet["A1:C1"].Style.Font.Bold = true;

    for (int i = 0; i < inventory.Count; i++)
    {
        invSheet[$"A{i + 2}"].Value = inventory[i].SKU;
        invSheet[$"B{i + 2}"].Value = inventory[i].Name;
        invSheet[$"C{i + 2}"].Value = inventory[i].Quantity;
    }

    using var stream = workbook.ToStream();
    return stream.ToArray();
}

Para uma referência completa da API cobrindo propriedades de livros, operações de intervalo, e suporte a gráficos, visite a documentação da API do IronXL.

Blazor Export to Excel: Complete Guide Using IronXL in C#: Imagem 3 - Exemplo de saída de recursos avançados

Como Você Lida com Erros e Grandes Conjuntos de Dados de Forma Eficiente?

Operações de exportação de Excel podem falhar silenciosamente ou degradar o desempenho quando os conjuntos de dados são grandes. Os padrões abaixo abordam ambas as preocupações.

Tratamento de Erros na Camada de Serviço

Envolver a lógica de geração no serviço (em vez do componente) mantém o tratamento de erros consistente em todas as chamadas. O padrão recomendado é permitir que exceções do IronXL se propaguem, depois envolvê-las em uma exceção específica do domínio com o contexto sobre qual relatório falhou:

Coloque um bloco try/catch em torno da geração do livro de trabalho em GenerateSalesReport, capturando Exception e lançando de novo como InvalidOperationException("Failed to generate sales report", ex). No componente Blazor, capture o InvalidOperationException e exiba uma mensagem amigável ao usuário sem expor detalhes internos. Registre a exceção interna usando ILogger<t> injetado no construtor do serviço, para que a equipe de desenvolvimento possa rastrear falhas de volta a uma operação específica do livro de trabalho. Nunca exiba mensagens de exceção brutas para os usuários finais -- caminhos de arquivos, endereços de memória ou rastreamentos de pilha podem revelar detalhes internos do servidor.

Veja práticas recomendadas de tratamento de erros na documentação oficial da Microsoft para orientação sobre registro de erros estruturado no Blazor. Para mais orientação sobre como construir serviços testáveis em .NET, a documentação da injeção de dependência da Microsoft explica como registrar e resolver serviços de escopo, que é exatamente o padrão usado aqui com ExcelExportService.

Considerações de Desempenho para Grandes Conjuntos de Dados

Para conjuntos de dados que excedem algumas milhares de linhas, considere estas abordagens:

Estratégias de Desempenho de Exportação para Excel
EstratégiaQuando UsarSuporte do IronXL
Transmita diretamente para a respostaFiles >10 MBworkbook.ToStream()
Paginar dados antes de exportarExportações baseadas em UI com filtrosAplique no serviço antes de criar o livro
Trabalho em segundo plano + link de downloadReports taking >5 secondsCombine com SignalR ou polling
Desabilitar AutoSizeColumn em planilhas grandesSheets with >500 rowsDefina larguras de coluna fixas em vez disso

O método ToStream() do IronXL escreve diretamente para um fluxo de saída sem carregar o arquivo inteiro em uma matriz de bytes primeiro, o que mantém o uso de memória mais baixo para grandes livros de trabalho. Para orientações adicionais de desempenho, veja leitura e escrita de arquivos Excel grandes com IronXL.

Quais Outros Recursos do Excel o IronXL Suporta?

Além da exportação básica, o IronXL fornece uma ampla gama de recursos do Excel que cobre requisitos de relatórios do mundo real.

Fórmulas, Intervalos Nomeados e Formatação de Números

Você pode incorporar qualquer fórmula do Excel usando a mesma sintaxe que você digitaria diretamente em uma célula. IronXL avalia fórmulas no momento da leitura, para que os consumidores do arquivo gerado vejam resultados calculados assim que abrirem a planilha. Intervalos nomeados tornam as fórmulas mais legíveis e fáceis de manter ao longo do tempo:

// Aggregate formulas on a summary row
worksheet["E2"].Value = "=SUM(D2:D100)";
worksheet["F2"].Value = "=AVERAGE(C2:C100)";
worksheet["G2"].Value = "=COUNTIF(B2:B100,\"Widget A\")";

// Named ranges improve formula readability
worksheet["D2:D100"].Name = "RevenueColumn";
worksheet["E2"].Value = "=SUM(RevenueColumn)";

// Number and date formatting prevents type misinterpretation
worksheet["D2"].Value = 12345.67m;
worksheet["D2"].FormatString = "#,##0.00";
worksheet["A2"].Value = DateTime.Now;
worksheet["A2"].FormatString = "dd/MM/yyyy";

Para definir intervalos nomeados e definir o formato de número explicitamente, o IronXL expõe ambos como propriedades no objeto de intervalo. Isso impede o Excel de tratar valores monetários como texto simples -- um problema comum ao exportar dados financeiros de bancos de dados que armazenam valores como strings.

Formatos de Arquivos Excel Suportados

O IronXL pode ler e escrever múltiplos formatos de Excel, incluindo .xlsx, .xls, .csv, e .tsv. O formato é determinado no momento da gravação, então a mesma classe de serviço pode suportar exportações Excel e CSV com uma pequena alteração de parâmetro:

// Export as CSV for systems that consume flat files
workbook.SaveAs("report.csv");

// Or stream as CSV for download
using var ms = workbook.ToStream(ExcelFileFormat.CSV);

Essa flexibilidade é importante em integrações onde sistemas a jusante -- como plataformas ERP ou armazéns de dados -- esperam um formato de arquivo específico. Para uma comparação completa de recursos entre IronXL e outras bibliotecas Excel, visite o página de recursos do IronXL.

A Microsoft fornece uma boa referência para entender formatos de arquivo OOXML se você precisar entender a estrutura interna de arquivos .xlsx ao depurar saídas inesperadas. O pacote NuGet para IronXL também está listado no NuGet.org com histórico completo de versões e notas de compatibilidade.

Como começar com o IronXL para projetos Blazor?

IronXL está disponível sob uma licença de desenvolvimento gratuita que permite criar e testar sem limite de tempo. Para aplicações de produção, é necessária uma licença de implantação.

Você pode baixar uma avaliação gratuita diretamente do NuGet -- não é necessário registro para começar. Quando estiver pronto para implantar, revise as opções de licenciamento do IronXL para encontrar o plano que se adequa à escala da aplicação.

O IronXL funciona em todos os principais tipos de aplicações .NET -- Blazor Server, Blazor WebAssembly (renderizado no servidor), ASP.NET Core MVC, aplicações de console e aplicativos de desktop Windows. A biblioteca visa o .NET Standard 2.0, por isso é compatível com todas as versões .NET suportadas desde o .NET Framework 4.6.2 até o .NET 10. Se o projeto também exigir geração de PDF, o IronPDF integra-se ao IronXL sem conflitos, permitindo exportar dados como Excel ou PDF a partir do mesmo nível de serviço.

Para explorar mais exemplos específicos de Blazor, veja o tutorial de exportação Excel com Blazor e o guia de exportação ASP.NET Core. Para ler planilhas existentes, o tutorial do leitor de Excel em C# cobre cenários comuns de importação. Você também pode revisar como criar um novo livro de Excel do zero para projetos que precisam criar arquivos programaticamente em vez de usar modelos.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais bem estruturados e visualmente atraentes.

...
Leia mais

Artigos relacionados

Key in blue circle

Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.

Your trial license will be sent to your email address

Sem limitações. 100% desbloqueado. Sem cartão de crédito.

bullet_checkedNão é necessário cartão de crédito nem criação de conta.Sem limitações. 100% desbloqueado. Sem cartão de crédito.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Agende sua demonstração ao vivo gratuita.
Booking Badge

Aprovado por milhões de engenheiros em todo o mundo.

Logotipos dos clientes da Iron Software
Agende sua consulta sem compromisso.
Preencha o formulário abaixo ou envie um e-mail para sales@ironsoftware.com
Os seus dados serão sempre mantidos em sigilo.
Aprovado por milhões de engenheiros em todo o mundo.
Logotipos dos clientes da Iron Software
Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.
Não é necessário cartão de crédito nem criação de conta.