Ir para o conteúdo do rodapé
USANDO O IRONXL

Exportar DataGridView do C# para o Excel: Guia completo com formatação | IronXL

Exportação de C# DataGridView para Excel com Formatação: O Guia Completo: Imagem 1 - Exportação de C# DataGridView para Excel com Formatação

Exportar dados DataGridView para um arquivo Excel é uma das tarefas mais comuns no desenvolvimento de Windows Forms. Ao criar aplicativos de negócios que exibem dados tabulares - seja relatórios de vendas, registros de inventário ou listas de clientes - os usuários esperam clicar em um botão e receber um arquivo Excel devidamente formatado que podem compartilhar ou analisar mais. O desafio é fazer isso de forma limpa, sem depender de uma instalação do Microsoft Excel em cada máquina do usuário final e sem lutar com código de limpeza de interoperabilidade COM que vaza memória ou quebra silenciosamente. Este guia orienta você através do processo completo de exportação de DataGridView para Excel em C# usando IronXL, cobrindo tudo desde a configuração do projeto até a formatação avançada de células, para que você obtenha código pronto para produção.

!{--010011000100100101000010010100100100000101010010010110010101111101000111010001010101010100010111110101001101010100010000010101001001010100010001010100010001011111010101110100100 101010100010010000101111101010000010100100111101000100010101010100001101010100010111110101010001010010010010010010010100000101001100010111110100001001001100010011110100001101001011--}

Como Configurar um Projeto de Windows Forms para Exportação de DataGridView?

As abordagens tradicionais para exportação de dados DataGridView dependiam do Interoperabilidade Microsoft -- você abriria Adicionar Referência, navegaria até a guia COM, selecionaria a Microsoft Excel Object Library e escreveria código frágil que chamasse Marshal.ReleaseComObject para evitar vazamentos de memória. Esse padrão requer que o Microsoft Excel esteja instalado em cada máquina onde o aplicativo é executado, tem um desempenho lento com grandes conjuntos de dados e frequentemente produz erros COMException em ambientes de implantação que não possuem licenças do Office. A própria orientação da Microsoft sobre Automação do Office recomenda explicitamente bibliotecas de terceiros para cenários automatizados e no lado do servidor.

IronXL remove todas essas dependências. É uma biblioteca pura de .NET que lê e escreve arquivos .xlsx, .xls, .csv, e .ods sem Microsoft Office ou qualquer registro COM. Você a instala através do NuGet e começa a escrever código imediatamente.

Instalando IronXL via NuGet

Comece criando um novo projeto de Aplicativo Forms do Windows no Visual Studio visando .NET 10. Adicione um controle DataGridView e um Button à superfície do formulário. Nãomeie o botão btnExport e dê-lhe o rótulo "Exportar para Excel". Em seguida, abra o Console do Gerenciador de Pacotes NuGet e execute:

Install-Package IronXl.Excel
Install-Package IronXl.Excel
SHELL

Adicione os namespaces necessários ao topo do seu arquivo de formulário:

using IronXL;
using System.Data;
using IronXL;
using System.Data;
$vbLabelText   $csharpLabel

Esses dois namespaces cobrem todos os tipos IronXL que você precisa para ler e escrever planilhas do Excel, e os tipos padrão System.Data para trabalhar com objetos DataTable que conectam seu DataGridView ao pipeline de exportação.

Como Carregar Dados de Exemplo em um Controle DataGridView?

Antes de construir a lógica de exportação, preencha seu DataGridView com dados representativos. O evento Form1_Load é o lugar certo para vincular um DataTable como a fonte de dados. Em uma aplicação real, você consultaria um banco de dados ou chamaria um serviço; aqui, um DataTable codificado internamente ilustra claramente a estrutura. A visão geral do controle DataGridView na Microsoft Docs fornece contexto adicional sobre como o controle gerencia as fontes de dados.

Vinculação de um DataTable ao DataGridView

void Form1_Load(object sender, EventArgs e)
{
    DataTable dt = new DataTable();
    dt.Columns.Add("ProductID", typeof(int));
    dt.Columns.Add("ProductName", typeof(string));
    dt.Columns.Add("Price", typeof(decimal));
    dt.Columns.Add("Stock", typeof(int));

    dt.Rows.Add(1, "Laptop", 999.99m, 50);
    dt.Rows.Add(2, "Mouse", 29.99m, 200);
    dt.Rows.Add(3, "Keyboard", 79.99m, 150);
    dt.Rows.Add(4, "Monitor", 349.99m, 75);
    dt.Rows.Add(5, "Webcam", 89.99m, 120);

    dataGridView1.DataSource = dt;
}
void Form1_Load(object sender, EventArgs e)
{
    DataTable dt = new DataTable();
    dt.Columns.Add("ProductID", typeof(int));
    dt.Columns.Add("ProductName", typeof(string));
    dt.Columns.Add("Price", typeof(decimal));
    dt.Columns.Add("Stock", typeof(int));

    dt.Rows.Add(1, "Laptop", 999.99m, 50);
    dt.Rows.Add(2, "Mouse", 29.99m, 200);
    dt.Rows.Add(3, "Keyboard", 79.99m, 150);
    dt.Rows.Add(4, "Monitor", 349.99m, 75);
    dt.Rows.Add(5, "Webcam", 89.99m, 120);

    dataGridView1.DataSource = dt;
}
$vbLabelText   $csharpLabel

Este código usa estilo de declaração de nível superior para a assinatura do manipulador de eventos. O DataTable possui quatro colunas tipadas -- integer, string, decimal, e integer -- que o IronXL irá preservar ao escrever no livro do Excel. Colunas tipadas são importantes porque o IronXL escreve colunas numéricas como células numéricas em vez de texto, o que permite aos usuários classificar e somar valores no Excel sem reformatar.

Exportação de C# DataGridView para Excel com Formatação: O Guia Completo: Imagem 2 - IU para o formulário

O DataGridView renderiza automaticamente uma linha de cabeçalho de coluna a partir dos nomes de coluna do DataTable. Quando você exporta, deseja que essa linha de cabeçalho seja preservada no arquivo Excel, o que significa que o seu código de exportação deve tratar cabeçalhos separadamente das linhas de dados - a próxima seção cobre exatamente isso.

Para uso em produção, o mesmo padrão se aplica, quer o DataTable venha do Entity Framework, Dapper, ADO.NET, ou qualquer outra camada de acesso a dados. A vinculação DataGridView é desacoplada do código de exportação, de modo que você pode trocar a fonte de dados sem tocar na lógica de exportação.

Como Exportar Dados do DataGridView para um Arquivo Excel?

A lógica principal de exportação é executada dentro do manipulador de clique do botão. O IronXL fornece um método LoadFromDataTable em WorkSheet que lida automaticamente com o mapeamento de coluna para célula. A abordagem mais limpa extrai um DataTable do DataGridView e o passa diretamente. O Open XML SDK, que sustenta o formato .xlsx, é documentado pela Microsoft e confirma porque soluções puras .NET como o IronXL superam Interop para geração programática.

Manipulador de Exportação ao Clicar no Botão

void btnExport_Click(object sender, EventArgs e)
{
    try
    {
        DataTable dt = new DataTable();

        foreach (DataGridViewColumn column in dataGridView1.Columns)
            dt.Columns.Add(column.HeaderText);

        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            if (row.IsNewRow) continue;

            DataRow dataRow = dt.NewRow();
            for (int i = 0; i < dataGridView1.Columns.Count; i++)
                dataRow[i] = row.Cells[i].Value ?? DBNull.Value;

            dt.Rows.Add(dataRow);
        }

        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.DefaultWorkSheet;
        worksheet.Name = "Product Data";

        worksheet.LoadFromDataTable(dt, true);

        string outputPath = Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
            "DataGridViewExport.xlsx"
        );

        workbook.SaveAs(outputPath);
        MessageBox.Show($"Exported successfully to:\n{outputPath}", "Export Complete",
            MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Export failed: {ex.Message}", "Error",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}
void btnExport_Click(object sender, EventArgs e)
{
    try
    {
        DataTable dt = new DataTable();

        foreach (DataGridViewColumn column in dataGridView1.Columns)
            dt.Columns.Add(column.HeaderText);

        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            if (row.IsNewRow) continue;

            DataRow dataRow = dt.NewRow();
            for (int i = 0; i < dataGridView1.Columns.Count; i++)
                dataRow[i] = row.Cells[i].Value ?? DBNull.Value;

            dt.Rows.Add(dataRow);
        }

        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.DefaultWorkSheet;
        worksheet.Name = "Product Data";

        worksheet.LoadFromDataTable(dt, true);

        string outputPath = Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
            "DataGridViewExport.xlsx"
        );

        workbook.SaveAs(outputPath);
        MessageBox.Show($"Exported successfully to:\n{outputPath}", "Export Complete",
            MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Export failed: {ex.Message}", "Error",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}
$vbLabelText   $csharpLabel

Exportação de C# DataGridView para Excel com Formatação: O Guia Completo: Imagem 3 - Arquivo Excel gerado

A chamada LoadFromDataTable(dt, true) leva o DataTable e uma flag booleana que informa ao IronXL para escrever os nomes das colunas como a primeira linha do Excel -- essas se tornam suas células de cabeçalho. O livro é salvo na área de trabalho do usuário usando Environment.SpecialFolder.Desktop em vez de um caminho codificado internamente, o que torna o código portátil entre contas de usuário.

A verificação null (?? DBNull.Value) prevents a NullReferenceException quando uma célula não contém valor. Isso é importante para dados do mundo real onde campos opcionais podem estar vazios. O IronXL escreve DBNull como uma célula vazia em vez da string "DBNull", então a saída permanece limpa.

Para mais detalhes sobre como ler dados de volta de arquivos Excel para um DataGridView, veja a documentação do DataTable IronXL, que cobre a operação inversa e como converter Excel para DataSet para livros de multi-planilhas.

Como Aplicar Formatação Profissional ao Arquivo Excel Exportado?

Dados simples em um arquivo Excel são funcionais, mas uma saída formatada profissionalmente -- cabeçalhos em negrito, larguras de coluna ajustadas ao conteúdo, cores alternadas de fundo para as linhas -- faz a diferença entre uma ferramenta que os usuários confiam e uma que eles exportam e imediatamente reformata manualmente. IronXL expõe uma rica API de estilo de célula que abrange fontes, cores, bordas, formatos de números e alinhamento. A especificação OOXML para estilos de planilha define o formato subjacente que o IronXL escreve, garantindo que a saída abra corretamente em qualquer aplicativo compatível.

Aplicando Estilos de Cabeçalho e Cores Alternadas para Linhas

void ExportWithFormatting(object sender, EventArgs e)
{
    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.DefaultWorkSheet;
    worksheet.Name = "Formatted Export";

    string[] headers = { "ID", "Product Name", "Price", "Stock" };

    // Write and style header row
    for (int col = 0; col < headers.Length; col++)
    {
        char colLetter = (char)('A' + col);
        string cellAddress = $"{colLetter}1";

        worksheet.SetCellValue(0, col, headers[col]);
        worksheet[cellAddress].Style.Font.Bold = true;
        worksheet[cellAddress].Style.Font.Height = 12;
        worksheet[cellAddress].Style.SetBackgroundColor("#4472C4");
        worksheet[cellAddress].Style.Font.Color = "#FFFFFF";
        worksheet[cellAddress].Style.HorizontalAlignment =
            IronXl.Styles.HorizontalAlignment.Center;
    }

    // Write data rows with alternating background colors
    int rowIndex = 1;
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        if (row.IsNewRow) continue;

        for (int col = 0; col < dataGridView1.Columns.Count; col++)
        {
            worksheet.SetCellValue(rowIndex, col,
                row.Cells[col].Value?.ToString() ?? string.Empty);
        }

        if (rowIndex % 2 == 0)
        {
            string rangeAddress = $"A{rowIndex + 1}:D{rowIndex + 1}";
            worksheet[rangeAddress].Style.SetBackgroundColor("#D6DCE5");
        }

        rowIndex++;
    }

    // Format the Price column as currency
    worksheet["C2:C100"].Style.Format = "$#,##0.00";

    // Auto-fit column widths
    worksheet.AutoSizeColumn(0);
    worksheet.AutoSizeColumn(1);
    worksheet.AutoSizeColumn(2);
    worksheet.AutoSizeColumn(3);

    string outputPath = Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
        "FormattedExport.xlsx"
    );

    workbook.SaveAs(outputPath);
    MessageBox.Show("Formatted export complete.", "Done",
        MessageBoxButtons.OK, MessageBoxIcon.Information);
}
void ExportWithFormatting(object sender, EventArgs e)
{
    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.DefaultWorkSheet;
    worksheet.Name = "Formatted Export";

    string[] headers = { "ID", "Product Name", "Price", "Stock" };

    // Write and style header row
    for (int col = 0; col < headers.Length; col++)
    {
        char colLetter = (char)('A' + col);
        string cellAddress = $"{colLetter}1";

        worksheet.SetCellValue(0, col, headers[col]);
        worksheet[cellAddress].Style.Font.Bold = true;
        worksheet[cellAddress].Style.Font.Height = 12;
        worksheet[cellAddress].Style.SetBackgroundColor("#4472C4");
        worksheet[cellAddress].Style.Font.Color = "#FFFFFF";
        worksheet[cellAddress].Style.HorizontalAlignment =
            IronXl.Styles.HorizontalAlignment.Center;
    }

    // Write data rows with alternating background colors
    int rowIndex = 1;
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        if (row.IsNewRow) continue;

        for (int col = 0; col < dataGridView1.Columns.Count; col++)
        {
            worksheet.SetCellValue(rowIndex, col,
                row.Cells[col].Value?.ToString() ?? string.Empty);
        }

        if (rowIndex % 2 == 0)
        {
            string rangeAddress = $"A{rowIndex + 1}:D{rowIndex + 1}";
            worksheet[rangeAddress].Style.SetBackgroundColor("#D6DCE5");
        }

        rowIndex++;
    }

    // Format the Price column as currency
    worksheet["C2:C100"].Style.Format = "$#,##0.00";

    // Auto-fit column widths
    worksheet.AutoSizeColumn(0);
    worksheet.AutoSizeColumn(1);
    worksheet.AutoSizeColumn(2);
    worksheet.AutoSizeColumn(3);

    string outputPath = Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
        "FormattedExport.xlsx"
    );

    workbook.SaveAs(outputPath);
    MessageBox.Show("Formatted export complete.", "Done",
        MessageBoxButtons.OK, MessageBoxIcon.Information);
}
$vbLabelText   $csharpLabel

Exportação de C# DataGridView para Excel com Formatação: O Guia Completo: Imagem 4 - Saída para o arquivo Excel formatado gerado

O código de formatação aplica várias técnicas. A linha de cabeçalho recebe um fundo azul (#4472C4) com texto branco, fonte em negrito de 12 pontos, e alinhamento centralizado -- um estilo padrão de planilha para negócios. As linhas de dados alternam entre branco e cinza claro (#D6DCE5) em cada linha par, o que facilita a leitura dos usuários através de tabelas largas sem perder o lugar. A coluna de Preço usa o formato de moeda integrado do Excel ($#,##0.00), então os valores são exibidos com sinais de dólar e duas casas decimais na planilha sem alterar os dados numéricos subjacentes. AutoSizeColumn ajusta cada coluna ao seu valor mais longo para que nenhum conteúdo seja truncado.

Você pode estender esse padrão ainda mais com estilo de borda de célula, formatação condicional e regras de validação de dados. Para relatórios que devem corresponder a um modelo corporativo, você também pode definir o layout da página e a área de impressão para que o arquivo exportado esteja pronto para impressão sem ajustes.

Como Lidar com Grandes Conjuntos de Dados e Ajuste de Performance?

Quando um DataGridView é vinculado a milhares de linhas, iterar célula por célula se torna visivelmente lento. Duas otimizações melhoram significativamente o desempenho. Primeiro, use LoadFromDataTable em vez de chamadas SetCellValue por célula. Segundo, se sua fonte de dados for um DataTable, passe-o diretamente para o IronXL em vez de extrair valores através das linhas DataGridView:

void ExportLargeDataset(DataTable sourceTable)
{
    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.DefaultWorkSheet;

    // Direct DataTable load -- fastest path for large data
    worksheet.LoadFromDataTable(sourceTable, true);

    // Apply header styling after load
    int colCount = sourceTable.Columns.Count;
    for (int col = 0; col < colCount; col++)
    {
        char colLetter = (char)('A' + col);
        worksheet[$"{colLetter}1"].Style.Font.Bold = true;
        worksheet[$"{colLetter}1"].Style.SetBackgroundColor("#4472C4");
        worksheet[$"{colLetter}1"].Style.Font.Color = "#FFFFFF";
    }

    workbook.SaveAs(Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
        "LargeExport.xlsx"
    ));
}
void ExportLargeDataset(DataTable sourceTable)
{
    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.DefaultWorkSheet;

    // Direct DataTable load -- fastest path for large data
    worksheet.LoadFromDataTable(sourceTable, true);

    // Apply header styling after load
    int colCount = sourceTable.Columns.Count;
    for (int col = 0; col < colCount; col++)
    {
        char colLetter = (char)('A' + col);
        worksheet[$"{colLetter}1"].Style.Font.Bold = true;
        worksheet[$"{colLetter}1"].Style.SetBackgroundColor("#4472C4");
        worksheet[$"{colLetter}1"].Style.Font.Color = "#FFFFFF";
    }

    workbook.SaveAs(Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
        "LargeExport.xlsx"
    ));
}
$vbLabelText   $csharpLabel

Para conjuntos de dados com mais de 10.000 linhas, executar a exportação em uma thread de fundo mantém a IU responsiva. Envolva a lógica de exportação em Task.Run e ordene a chamada MessageBox.Show de volta à thread de IU usando Invoke. O IronXL é seguro para threads para operações de gravação em instâncias WorkBook separadas, então você pode executar múltiplas exportações simultaneamente se necessário.

Recursos adicionais de desempenho:

Como Comparar IronXL com Interoperabilidade Microsoft para Exportação de DataGridView?

Muitos desenvolvedores começam com Microsoft Excel Interop porque vem com o Office e não requer pacotes adicionais. Não entanto, Interop tem custos reais que aparecem rapidamente em ambientes de produção. A tabela a seguir resume as principais diferenças:

IronXL vs. Microsoft Excel Interop para Exportação de DataGridView
Capacidade IronXL Interoperabilidade Microsoft
Requer instalação do Microsoft Excel Não Sim
Funciona em ambientes de servidor / nuvem Sim Não (não suportado pela Microsoft)
É necessária limpeza de objetos COM Não Sim (Marshal.ReleaseComObject)
Desempenho com grandes conjuntos de dados Rápido (puro .NET) Lento (sobrecarga de marshalling COM)
Método de instalação NuGet Referência COM / instalação do Office
.NET versões suportadas .NET 4.6.2 -- .NET 10 Somente .NET Framework (limitado)
Suporte para XLSX, CSV, ODS Sim Somente XLSX/XLS via Excel

A própria documentação da Microsoft adverte contra o uso do Office Interop em servidores ou em contas de serviço, citando preocupações de estabilidade e licenciamento. IronXL funciona corretamente no Azure App Service, hosts de Serviço do Windows, contêineres Docker e qualquer outro ambiente sem interface gráfica onde a execução de um aplicativo de desktop como o Excel não é viável.

Para equipes que já usam Interop e queiram migrar, a API do IronXL mapeia suficientemente próximo para que a maioria das operações WorkBook e WorkSheet sejam traduzidas diretamente. O Guia de migração do IronXL cobre padrões comuns do Interop e seus equivalentes no IronXL.

Quais são os seus próximos passos?

Exportar dados DataGridView para Excel usando o IronXL requer apenas uma instalação de pacote NuGet e algumas linhas de código, substituindo a abordagem frágil de interop COM por uma solução limpa e sustentável que funciona em qualquer ambiente de implantação. As técnicas abordadas aqui -- exportação básica, saída formatada, otimização para grandes conjuntos de dados e uma tabela de comparação -- dão a você tudo o que precisa para implementar esse recurso em um aplicativo de produção Windows Forms.

A partir daqui, explore essas capacidades relacionadas:

Inicie um teste gratuito do IronXL para testar o conjunto completo de recursos no seu projeto, ou revise as opções de licenciamento do IronXL quando estiver pronto para a implantação em produção.

Perguntas frequentes

Como posso exportar dados do DataGridView para o Excel em C#?

Instale o IronXL via NuGet, extraia um DataTable do seu DataGridView, crie um WorkBook e um WorkSheet, chame worksheet.LoadFromDataTable(dt, true) e salve com workbook.SaveAs.

Quais opções de formatação estão disponíveis ao exportar um DataGridView para o Excel?

O IronXL suporta fontes em negrito, cores de fundo, cores de fonte, alinhamento horizontal, formatos de número (como moeda), dimensionamento automático de colunas, estilos de borda e formatação condicional.

Preciso ter o Microsoft Excel instalado para exportar dados do DataGridView?

Não. O IronXL é uma biblioteca .NET pura que gera arquivos Excel sem exigir o Microsoft Office ou qualquer registro COM na máquina.

Posso estilizar os cabeçalhos ao exportar o DataGridView para o Excel?

Sim. Depois de escrever a linha de cabeçalho, acesse cada célula do cabeçalho pelo endereço e defina as propriedades Style.Font.Bold, Style.SetBackgroundColor e Style.Font.Color.

Como faço para aplicar cores alternadas nas linhas no Excel ao exportar de um DataGridView?

Acompanhe o índice da linha enquanto itera pelas linhas do DataGridView e, para linhas pares, aplique um estilo de intervalo usando worksheet[rangeAddress].Style.SetBackgroundColor com a cor hexadecimal escolhida.

Como lidar com grandes conjuntos de dados ao exportar um DataGridView para o Excel?

Passe o DataTable subjacente diretamente para worksheet.LoadFromDataTable em vez de iterar pelas células uma a uma. Para conjuntos de dados muito grandes, execute a exportação em uma thread em segundo plano usando Task.Run.

Como o IronXL se compara ao Microsoft Excel Interop para exportação de DataGridView?

O IronXL não requer o Microsoft Excel, funciona em ambientes de servidor e nuvem, não precisa de código de limpeza COM e tem um desempenho significativamente mais rápido com grandes conjuntos de dados.

Jordi Bardia
Engenheiro de Software
Jordi é extremamente proficiente em Python, C# e C++, e quando não está utilizando suas habilidades na Iron Software, dedica-se à programação de jogos. Compartilhando as responsabilidades por testes, desenvolvimento e pesquisa de produtos, Jordi agrega imenso valor à melhoria contínua dos produtos. Essa experiência diversificada o mantém ...
Leia mais

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me