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

Como exportar um DataGridView para o Excel em C# com IronXL

Exportar dados de um DataGridView para um arquivo Excel requer apenas algumas linhas de código C# quando você usa IronXL. Crie um WorkBook, itere pelas colunas e linhas da grade, escreva cada valor de célula na planilha e depois chame SaveAs para produzir um arquivo totalmente formatado .xlsx -- sem necessidade de instalação do Microsoft Office.

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

Windows Forms é uma biblioteca GUI fundamental no ecossistema .NET, amplamente usada para construir aplicativos de desktop. O controle DataGridView é um dos componentes mais usados: ele exibe, edita e gerencia dados tabulares de qualquer fonte vinculável, como um DataTable, um resultado de consulta de banco de dados ou uma lista na memória.

Exportar esses dados da grade para Excel atende a várias necessidades diárias -- enviar relatórios para stakeholders, arquivar instantâneos para auditoria ou alimentar ferramentas analíticas downstream. As duas abordagens tradicionais são Microsoft Interoperação com o Office e bibliotecas de terceiros. O Interop exige uma cópia do Excel instalada em cada máquina que executa o aplicativo, cria problemas de ciclo de vida de objetos COM e tem desempenho ruim em implantações em servidor ou nuvem. Bibliotecas como IronXL, ClosedXML e Syncfusion evitam esses problemas ao escrever diretamente no formato de arquivo Open XML sem qualquer dependência do Office.

Este guia demonstra a abordagem do IronXL em C# visando .NET 10, embora o IronXL suporte .NET Framework 4.6.2 e todas as versões .NET modernas.

Pré-requisitos

Antes de escrever qualquer código de exportação, confirme que os seguintes itens estão no lugar:

  • Visual Studio 2022 ou mais recente
  • SDK .NET 10 instalado
  • Um projeto de aplicativo Windows Forms contendo um controle DataGridView
  • Acesso ao NuGet para instalar o IronXL

Como instalar o IronXL?

Abra o Console do Gerenciador de Pacotes no Visual Studio e execute um dos comandos:

Install-Package IronXL
dotnet add package IronXL
Install-Package IronXL
dotnet add package IronXL
SHELL

Alternativamente, clique com o botão direito no projeto no Solution Explorer, escolha Gerenciar Pacotes NuGet, procure por IronXl.Excel e clique em Instalar.

Exportar Dados de DataGridView para Excel em VB .NET 2010 Usando IronXL: Imagem 1 - Instalação

Uma vez instalado, adicione a diretiva using do IronXL no topo de qualquer arquivo que utilize a funcionalidade do Excel:

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

O IronXL suporta todos os formatos de planilhas comuns: XLSX, XLS, CSV e TSV. Este guia utiliza o formato XLSX ao longo, pois é o formato padrão para as versões modernas do Excel.

Como Preencher um DataGridView com Dados de Exemplo?

Para este passo a passo, o formulário contém um DataGridView chamado DataGridView1 e um botão chamado btnExport. A grade é preenchida no evento Load do formulário com registros de funcionários armazenados em um DataTable:

void Form1_Load(object sender, EventArgs e)
{
    var dt = new DataTable();

    // Define columns with the appropriate .NET type
    dt.Columns.Add("EmployeeID", typeof(int));
    dt.Columns.Add("Name", typeof(string));
    dt.Columns.Add("Department", typeof(string));
    dt.Columns.Add("Salary", typeof(decimal));

    // Add sample rows
    dt.Rows.Add(101, "Sarah Johnson", "Engineering", 85000m);
    dt.Rows.Add(102, "Michael Chen", "Marketing", 72000m);
    dt.Rows.Add(103, "Emily Davis", "Finance", 91000m);
    dt.Rows.Add(104, "James Wilson", "Engineering", 78000m);

    DataGridView1.DataSource = dt;
}
void Form1_Load(object sender, EventArgs e)
{
    var dt = new DataTable();

    // Define columns with the appropriate .NET type
    dt.Columns.Add("EmployeeID", typeof(int));
    dt.Columns.Add("Name", typeof(string));
    dt.Columns.Add("Department", typeof(string));
    dt.Columns.Add("Salary", typeof(decimal));

    // Add sample rows
    dt.Rows.Add(101, "Sarah Johnson", "Engineering", 85000m);
    dt.Rows.Add(102, "Michael Chen", "Marketing", 72000m);
    dt.Rows.Add(103, "Emily Davis", "Finance", 91000m);
    dt.Rows.Add(104, "James Wilson", "Engineering", 78000m);

    DataGridView1.DataSource = dt;
}
$vbLabelText   $csharpLabel

Cada coluna é definida com um tipo .NET específico para que comparações numéricas e formatação funcionem corretamente posteriormente. A propriedade DataSource vincula o DataTable diretamente ao DataGridView e a grade renderiza automaticamente todas as linhas quando o formulário é aberto. Em produção, esses dados viriam tipicamente de uma consulta de banco de dados, um conjunto de resultados de ORM, ou uma resposta de API REST, em vez de valores codificados.

Exportar Dados de DataGridView para Excel em VB .NET 2010 Usando IronXL: Imagem 2 - Saída DataGridView

Compreendendo o Modelo de Dados do DataGridView

Um DataGridView expõe seu conteúdo através de duas coleções: Columns (para metadados como HeaderText e índice de coluna) e Rows (para as células de dados reais). Cada DataGridViewRow contém uma coleção Cells indexada pela posição da coluna. A propriedade Value de cada célula retorna um objeto embalado que você deve lançar ou converter antes de escrevê-lo em uma célula Excel. Compreender essa hierarquia é essencial para escrever um loop de exportação confiável.

O DataTable por trás dos bastidores armazena valores digitados, então um salário decimal não precisa de conversão de string antes de ser escrito em uma planilha IronXL. O método SetCellValue do IronXL aceita sobrecargas string, double, decimal, int, bool e DateTime, permitindo que você preserve o tipo de dado original no arquivo de saída.

Como Exportar Dados do DataGridView para um Arquivo Excel com Cabeçalhos de Coluna?

A lógica de exportação reside dentro do manipulador de clique do botão. O código cria um novo WorkBook, recupera a planilha padrão, escreve os cabeçalhos das colunas na primeira linha e depois escreve cada linha de dados abaixo delas:

void btnExport_Click(object sender, EventArgs e)
{
    var workbook = WorkBook.Create();
    var sheet = workbook.DefaultWorkSheet;

    // Write column headers to row index 0
    for (int col = 0; col < DataGridView1.Columns.Count; col++)
    {
        sheet.SetCellValue(0, col, DataGridView1.Columns[col].HeaderText);
    }

    // Write data rows starting at row index 1
    for (int row = 0; row < DataGridView1.Rows.Count; row++)
    {
        for (int col = 0; col < DataGridView1.Columns.Count; col++)
        {
            object? cellValue = DataGridView1.Rows[row].Cells[col].Value;
            if (cellValue is not null)
            {
                sheet.SetCellValue(row + 1, col, cellValue.ToString()!);
            }
        }
    }

    string outputPath = "EmployeeData.xlsx";
    workbook.SaveAs(outputPath);
    MessageBox.Show("Export complete. File saved to: " + outputPath, "Success");
}
void btnExport_Click(object sender, EventArgs e)
{
    var workbook = WorkBook.Create();
    var sheet = workbook.DefaultWorkSheet;

    // Write column headers to row index 0
    for (int col = 0; col < DataGridView1.Columns.Count; col++)
    {
        sheet.SetCellValue(0, col, DataGridView1.Columns[col].HeaderText);
    }

    // Write data rows starting at row index 1
    for (int row = 0; row < DataGridView1.Rows.Count; row++)
    {
        for (int col = 0; col < DataGridView1.Columns.Count; col++)
        {
            object? cellValue = DataGridView1.Rows[row].Cells[col].Value;
            if (cellValue is not null)
            {
                sheet.SetCellValue(row + 1, col, cellValue.ToString()!);
            }
        }
    }

    string outputPath = "EmployeeData.xlsx";
    workbook.SaveAs(outputPath);
    MessageBox.Show("Export complete. File saved to: " + outputPath, "Success");
}
$vbLabelText   $csharpLabel

O objeto WorkBook representa o arquivo Excel inteiro na memória. DefaultWorkSheet retorna a primeira folha sem a necessidade de você criar uma explicitamente. O loop externo escreve o texto do cabeçalho de HeaderText na linha zero. O loop aninhado itera então cada linha de dados, verificando se há nulos antes de converter o valor da célula para uma string. O deslocamento row + 1 desloca os dados abaixo da linha do cabeçalho. SaveAs escreve o livro de trabalho concluído como um arquivo Open XML XLSX para o caminho especificado.

Exportar Dados de DataGridView para Excel em VB .NET 2010 Usando IronXL: Imagem 3 - Saída Excel

O arquivo resultante abre no Excel, Google Sheets ou qualquer aplicativo que leia o formato XLSX. Os cabeçalhos das colunas aparecem na primeira linha, e todas as linhas de dados seguem na mesma ordem em que apareceram no DataGridView.

Como Aplicar Formatação de Célula ao Arquivo Excel Exportado?

Uma transferência de dados simples é funcional, mas não está pronta para apresentação. A API de estilo do IronXL permite aplicar fontes em negrito, cores de fundo, cores de texto e formatos numéricos a qualquer intervalo de células antes de salvar:

void ExportWithFormatting()
{
    var workbook = WorkBook.Create();
    var sheet = workbook.DefaultWorkSheet;

    // Write column headers
    for (int col = 0; col < DataGridView1.Columns.Count; col++)
    {
        sheet.SetCellValue(0, col, DataGridView1.Columns[col].HeaderText);
    }

    // Style the header row: bold white text on blue background
    var headerRange = sheet.GetRange("A1:D1");
    headerRange.Style.Font.Bold = true;
    headerRange.Style.SetBackgroundColor("#4472C4");
    headerRange.Style.Font.SetColor("#FFFFFF");

    // Locate the Salary column index
    int salaryColIndex = -1;
    for (int i = 0; i < DataGridView1.Columns.Count; i++)
    {
        if (string.Equals(DataGridView1.Columns[i].HeaderText, "Salary",
            StringComparison.OrdinalIgnoreCase))
        {
            salaryColIndex = i;
            break;
        }
    }

    // Write data rows, preserving numeric types
    for (int row = 0; row < DataGridView1.Rows.Count; row++)
    {
        if (DataGridView1.Rows[row].IsNewRow) continue;

        for (int col = 0; col < DataGridView1.Columns.Count; col++)
        {
            object? cellValue = DataGridView1.Rows[row].Cells[col].Value;
            if (cellValue is null) continue;

            int targetRow = row + 1;

            if (col == salaryColIndex)
            {
                // Write salary as a true numeric decimal
                if (decimal.TryParse(cellValue.ToString(),
                    System.Globalization.NumberStyles.Number,
                    System.Globalization.CultureInfo.InvariantCulture,
                    out decimal decValue))
                {
                    sheet.SetCellValue(targetRow, col, decValue);
                }
                else
                {
                    sheet.SetCellValue(targetRow, col, cellValue.ToString()!);
                }
            }
            else
            {
                sheet.SetCellValue(targetRow, col, cellValue.ToString()!);
            }
        }
    }

    // Apply currency format to the salary column data range
    var salaryRange = sheet.GetRange("D2:D5");
    salaryRange.FormatString = "$#,##0";

    workbook.SaveAs("FormattedEmployeeData.xlsx");
}
void ExportWithFormatting()
{
    var workbook = WorkBook.Create();
    var sheet = workbook.DefaultWorkSheet;

    // Write column headers
    for (int col = 0; col < DataGridView1.Columns.Count; col++)
    {
        sheet.SetCellValue(0, col, DataGridView1.Columns[col].HeaderText);
    }

    // Style the header row: bold white text on blue background
    var headerRange = sheet.GetRange("A1:D1");
    headerRange.Style.Font.Bold = true;
    headerRange.Style.SetBackgroundColor("#4472C4");
    headerRange.Style.Font.SetColor("#FFFFFF");

    // Locate the Salary column index
    int salaryColIndex = -1;
    for (int i = 0; i < DataGridView1.Columns.Count; i++)
    {
        if (string.Equals(DataGridView1.Columns[i].HeaderText, "Salary",
            StringComparison.OrdinalIgnoreCase))
        {
            salaryColIndex = i;
            break;
        }
    }

    // Write data rows, preserving numeric types
    for (int row = 0; row < DataGridView1.Rows.Count; row++)
    {
        if (DataGridView1.Rows[row].IsNewRow) continue;

        for (int col = 0; col < DataGridView1.Columns.Count; col++)
        {
            object? cellValue = DataGridView1.Rows[row].Cells[col].Value;
            if (cellValue is null) continue;

            int targetRow = row + 1;

            if (col == salaryColIndex)
            {
                // Write salary as a true numeric decimal
                if (decimal.TryParse(cellValue.ToString(),
                    System.Globalization.NumberStyles.Number,
                    System.Globalization.CultureInfo.InvariantCulture,
                    out decimal decValue))
                {
                    sheet.SetCellValue(targetRow, col, decValue);
                }
                else
                {
                    sheet.SetCellValue(targetRow, col, cellValue.ToString()!);
                }
            }
            else
            {
                sheet.SetCellValue(targetRow, col, cellValue.ToString()!);
            }
        }
    }

    // Apply currency format to the salary column data range
    var salaryRange = sheet.GetRange("D2:D5");
    salaryRange.FormatString = "$#,##0";

    workbook.SaveAs("FormattedEmployeeData.xlsx");
}
$vbLabelText   $csharpLabel

O método GetRange aceita notação padrão do Excel (A1:D1) para selecionar um bloco contíguo de células. Definindo Style.Font.Bold, Style.SetBackgroundColor e Style.Font.SetColor aplica esses formatos a cada célula no intervalo selecionado. Para colunas numéricas, escrever o valor como um decimal em vez de uma string mantém o tipo de dado intacto, o que significa que o Excel pode aplicar formatar números como $#,##0 corretamente. Células armazenadas como strings não respondem a códigos de formato numérico.

Exportar Dados de DataGridView para Excel em VB .NET 2010 Usando IronXL: Imagem 4 - Saída Excel Formatada

Você pode estender esse padrão para aplicar sombreamento de linha alternado, ajuste automático da largura da coluna ou congelar painéis consultando a documentação de estilo do IronXL.

Como Exportar Dados do DataGridView para CSV em vez de XLSX?

Alguns fluxos de trabalho requerem saída CSV para compatibilidade com sistemas legados ou pipelines de dados leves. O IronXL lida com a exportação CSV sem necessidade de alteração adicional na configuração principal do código:

void ExportToCsv()
{
    var workbook = WorkBook.Create();
    var sheet = workbook.DefaultWorkSheet;

    for (int col = 0; col < DataGridView1.Columns.Count; col++)
    {
        sheet.SetCellValue(0, col, DataGridView1.Columns[col].HeaderText);
    }

    for (int row = 0; row < DataGridView1.Rows.Count; row++)
    {
        if (DataGridView1.Rows[row].IsNewRow) continue;

        for (int col = 0; col < DataGridView1.Columns.Count; col++)
        {
            object? cell = DataGridView1.Rows[row].Cells[col].Value;
            if (cell is not null)
                sheet.SetCellValue(row + 1, col, cell.ToString()!);
        }
    }

    // Saving with a .csv extension produces a comma-separated file
    workbook.SaveAs("EmployeeData.csv");
}
void ExportToCsv()
{
    var workbook = WorkBook.Create();
    var sheet = workbook.DefaultWorkSheet;

    for (int col = 0; col < DataGridView1.Columns.Count; col++)
    {
        sheet.SetCellValue(0, col, DataGridView1.Columns[col].HeaderText);
    }

    for (int row = 0; row < DataGridView1.Rows.Count; row++)
    {
        if (DataGridView1.Rows[row].IsNewRow) continue;

        for (int col = 0; col < DataGridView1.Columns.Count; col++)
        {
            object? cell = DataGridView1.Rows[row].Cells[col].Value;
            if (cell is not null)
                sheet.SetCellValue(row + 1, col, cell.ToString()!);
        }
    }

    // Saving with a .csv extension produces a comma-separated file
    workbook.SaveAs("EmployeeData.csv");
}
$vbLabelText   $csharpLabel

A única mudança da exportação XLSX é a extensão do arquivo passada para SaveAs. O IronXL detecta a extensão e serializa o livro de trabalho no formato correto automaticamente. Essa consistência significa que sua lógica de escrita de dados permanece idêntica, independentemente do formato de saída - uma vantagem significativa sobre bibliotecas que requerem caminhos de código separados para cada formato.

A exportação de CSV é especialmente útil quando o consumidor downstream é um script Python pandas, uma ferramenta de importação em massa de banco de dados, ou uma plataforma de análise que não consegue ler arquivos binários XLSX.

Como você lida com conjuntos de dados grandes do DataGridView de forma eficiente?

Para grades contendo dezenas de milhares de linhas, o desempenho se torna uma consideração. O padrão a seguir reduz a pressão de memória construindo o conjunto de dados completo em uma única passagem:

Comparação de métodos de exportação IronXL para grandes conjuntos de dados
Abordagem Linhas processadas Office necessário Preservação de tipo
Microsoft.Office.Interop.Excel Até ~65k (lento) Sim Parcial
IronXL (células de string) 1M+ linhas Não Não (todo o texto)
IronXL (células tipadas) 1M+ linhas Não Sim
IronXL a partir de DataTable 1M+ linhas Não Sim (automático)

Quando o DataGridView é vinculado a um DataTable, você pode carregar a tabela diretamente no IronXL usando o método WorkSheet.LoadDataTable, ignorando a iteração célula a célula inteiramente. Essa abordagem é mais rápida e preserva todos os tipos de coluna automaticamente.

Para grades não suportadas por um DataTable, o padrão célula a célula mostrado anteriormente continua sendo a abordagem padrão. Se você precisar exportar de forma assíncrona para manter a interface responsiva durante grandes exportações, envolva a lógica de exportação em uma chamada Task.Run e await o resultado em um thread de segundo plano. Veja a documentação de operações de arquivo assíncronas para padrões sobre como remeter os resultados de volta para o thread de UI.

Por que o IronXL é melhor do que o Interoperação com o Office para exportação de DataGridView?

Soluções tradicionais .NET usavam Microsoft.Office.Interop.Excel para dirigir um processo Excel em execução. Essa abordagem cria vários problemas de implantação e confiabilidade:

  • Cada máquina que executa o aplicativo precisa de uma cópia licenciada do Microsoft Excel instalada
  • Ambientes de servidor e contêineres em nuvem geralmente não podem instalar o Office
  • O COM Interop requer liberação explícita de cada objeto para evitar vazamentos de memória e processos zombie do Excel
  • O tratamento de erros através da fronteira COM é verboso e frágil
  • O desempenho degrada rapidamente à medida que as contagens de linha aumentam

O IronXL escreve diretamente no formato de arquivo OOXML sem iniciar qualquer processo externo. Os aplicativos são implantados como unidades auto-suficientes. A API da biblioteca é totalmente gerenciada por .NET, então a coleta de lixo gerencia a memória automaticamente sem chamadas Marshal.ReleaseComObject. A velocidade é substancialmente maior porque não ocorre comunicação entre processos.

Para equipes avaliando alternativas, ClosedXML é uma opção popular de código aberto. O IronXL oferece um conjunto de recursos mais amplo, incluindo conversão em PDF, geração de gráficos, e suporte comercial, que podem ser fatores em decisões de aquisição empresarial. Revise as opções de licenciamento do IronXL para corresponder o nível certo ao tamanho da sua equipe e cenário de implantação.

Comparação de recursos: IronXL vs Interoperação com o Office
Recurso IronXL Interoperação com o Office
Instalação do Office necessária Não Sim
Implantação em servidor / nuvem Sim Não (não suportado)
Modelo de memória gerida Sim Não (limpeza de COM necessária)
Formatos XLSX / CSV / XLS Todos os três Depende do Excel instalado
Exportação em PDF de planilha Sim Requer biblioteca adicional

A seção de tutoriais do IronXL cobre leitura de arquivos Excel existentes, modificação de modelos, geração de gráficos e aplicação de formatação condicional - todas as capacidades que se estendem naturalmente a partir do padrão de exportação de DataGridView mostrado aqui.

Quais são os seus próximos passos?

Agora você tem o código C# funcional para exportar um DataGridView para um arquivo Excel formatado usando IronXL. A partir daqui, considere as seguintes direções:

  • Adicione tratamento de erros: Envolva o código de exportação em um bloco try/catch e exiba uma mensagem amigável ao usuário se o arquivo estiver bloqueado ou o caminho for inválido
  • Suporte à seleção de caminho de arquivo: Use SaveFileDialog para permitir que os usuários escolham a localização e o nome do arquivo de saída em tempo de execução
  • Carregar dados reais: Substitua o exemplar DataTable por uma consulta de banco de dados usando ADO.NET ou Entity Framework
  • Ler arquivos existentes: Use WorkBook.Load para abrir uma planilha existente e atualizá-la em vez de sempre criar uma nova
  • Exportar para várias planilhas: Crie objetos WorkSheet adicionais no mesmo WorkBook para organizar conjuntos de dados relacionados
  • Aplicar formatação condicional: Destaque células que excedem limites usando a API de formatação condicional do IronXL
  • Revisar as opções de licenciamento: Um teste gratuito está disponível; Os níveis de licenciamento cobrem desenvolvedores individuais até implantações empresariais
  • Navegar na referência completa da API: A referência de objeto do IronXL documenta cada classe e método disponível

Perguntas frequentes

Qual é a maneira mais fácil de exportar dados de um DataGridView para o Excel em C#?

Usando o IronXL, você pode exportar dados do DataGridView para o Excel em C# com um pequeno loop que grava os cabeçalhos das colunas e as linhas de dados em um objeto WorkBook e, em seguida, chama o comando SaveAs para gerar um arquivo XLSX. Não é necessário instalar o Microsoft Office.

Como usar o IronXL para manipular arquivos Excel em uma aplicação Windows Forms em C#?

Instale o IronXL via NuGet, adicione uma diretiva `using IronXL , crie uma planilha com `WorkBook.Create()`, escreva os dados usando `SetCellValue` e salve com `SaveAs`. O IronXL suporta os formatos XLSX, XLS e CSV.

O IronXL suporta a exportação de grandes conjuntos de dados DataGridView para o Excel?

Sim, o IronXL lida com grandes conjuntos de dados de forma eficiente. Para DataGridViews baseados em um DataTable, você pode usar o método LoadDataTable para evitar a iteração célula por célula e obter um desempenho ainda melhor.

Você precisa ter o Microsoft Excel instalado para usar o IronXL?

Não. O IronXL grava diretamente no formato de arquivo Open XML sem abrir o Excel ou qualquer automação COM. Os aplicativos criados com o IronXL são implantados em servidores e ambientes de nuvem onde o Office não está disponível.

Quais são as vantagens de usar o IronXL para exportar para o Excel em vez do Office Interop?

O IronXL não requer a instalação do Office, evita problemas de vazamento de memória COM, suporta implantação em servidor e nuvem e fornece uma API .NET gerenciada e limpa para leitura e gravação de arquivos XLSX, XLS e CSV.

O IronXL consegue exportar dados do DataGridView para CSV, além de XLSX?

Sim. Passar o caminho de um arquivo .csv para WorkBook.SaveAs gera um arquivo separado por vírgulas. O código de gravação de dados é idêntico para ambos os formatos — apenas a extensão do arquivo muda.

Como aplicar formatação às células do Excel exportadas com o IronXL?

Use WorkSheet.GetRange para selecionar um intervalo de células e, em seguida, acesse a propriedade Style para definir Font.Bold, SetBackgroundColor, Font.SetColor e FormatString para os formatos de número.

Como começar a usar o IronXL em um projeto C#?

Execute o comando `Install-Package IronXL ou `dotnet add package IronXL no seu projeto, adicione `using IronXL no início do seu arquivo e siga os exemplos na documentação do IronXL em ironsoftware.com/csharp/excel/.

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