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

Exportar tabela de dados do Excel em C# | Converter dados do Excel

Exportar dados do Excel para um DataTable oferece acesso estruturado na memória ao conteúdo da planilha que funciona naturalmente com bancos de dados, controles de interface do usuário e consultas LINQ. A direção inversa -- escrever um DataTable de volta em um arquivo Excel -- é tão importante para a geração de relatórios e fluxos de trabalho de armazenamento de dados. O IronXL lida com ambas as direções em .NET puro, sem dependência do Microsoft Office e sem configuração de interoperabilidade COM.

Instale o IronXL antes de executar qualquer um dos exemplos abaixo:

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

Uma vez instalado, os tipos WorkBook e WorkSheet expõem métodos ToDataTable e ToDataSet que mapeiam diretamente para estruturas System.Data. Você também pode reverter o processo escrevendo valores DataRow de volta em uma planilha e salvando o arquivo nos formatos XLSX ou XLS.

Como Você Converte uma Planilha Inteira em um DataTable?

O método ToDataTable converte uma planilha inteira -- ou um intervalo nomeado -- em um System.Data.DataTable. Passe true para tratar a primeira linha como cabeçalhos de coluna, para que os nomes das colunas da tabela resultante correspondam exatamente aos cabeçalhos da planilha.

using IronXL;
using System.Data;

// Load the workbook from disk
WorkBook workbook = WorkBook.Load("customers.xlsx");

// Grab the default (first) worksheet
WorkSheet worksheet = workbook.DefaultWorkSheet;

// Convert the entire sheet; first row becomes column headers
DataTable dataTable = worksheet.ToDataTable(true);

// Iterate every row and print each cell value
foreach (DataRow row in dataTable.Rows)
{
    for (int i = 0; i < dataTable.Columns.Count; i++)
    {
        Console.Write(row[i] + "\t");
    }
    Console.WriteLine();
}
using IronXL;
using System.Data;

// Load the workbook from disk
WorkBook workbook = WorkBook.Load("customers.xlsx");

// Grab the default (first) worksheet
WorkSheet worksheet = workbook.DefaultWorkSheet;

// Convert the entire sheet; first row becomes column headers
DataTable dataTable = worksheet.ToDataTable(true);

// Iterate every row and print each cell value
foreach (DataRow row in dataTable.Rows)
{
    for (int i = 0; i < dataTable.Columns.Count; i++)
    {
        Console.Write(row[i] + "\t");
    }
    Console.WriteLine();
}
$vbLabelText   $csharpLabel

O que o Código Faz

WorkBook.Load lê o arquivo XLSX sem qualquer automação do Office. worksheet.ToDataTable(true) itera em cada célula da planilha e a mapeia para um DataRow, usando a primeira linha como nomes DataColumn. O DataTable resultante é um objeto padrão System.Data -- você pode vinculá-lo a um DataGridView, passá-lo para um SqlBulkCopy ou executar consultas LINQ imediatamente contra ele.

A chamada ToDataTable suporta os formatos XLS e XLSX, de modo que o mesmo código funciona para planilhas antigas sem modificação. Consulte a documentação de DataTable e DataSet do IronXL para a referência completa da API.

Como Você Exporta um Intervalo de Células Específico para um DataTable?

Quando uma planilha contém várias regiões de dados, ou quando você só precisa de um subconjunto de linhas e colunas, você pode exportar um intervalo de células específico em vez da planilha inteira. Essa abordagem é mais eficiente para arquivos grandes porque o IronXL só processa as células selecionadas.

using IronXL;
using System.Data;

WorkBook workbook = WorkBook.Load("financial_report.xlsx");

// Access a named worksheet
WorkSheet worksheet = workbook.GetWorkSheet("Summary");

// Select only the region A1:D20 and convert it
DataTable dt = worksheet["A1:D20"].ToDataTable(true);

Console.WriteLine($"Rows: {dt.Rows.Count}, Columns: {dt.Columns.Count}");

foreach (DataRow row in dt.Rows)
{
    foreach (var item in row.ItemArray)
    {
        Console.Write(item + "\t");
    }
    Console.WriteLine();
}
using IronXL;
using System.Data;

WorkBook workbook = WorkBook.Load("financial_report.xlsx");

// Access a named worksheet
WorkSheet worksheet = workbook.GetWorkSheet("Summary");

// Select only the region A1:D20 and convert it
DataTable dt = worksheet["A1:D20"].ToDataTable(true);

Console.WriteLine($"Rows: {dt.Rows.Count}, Columns: {dt.Columns.Count}");

foreach (DataRow row in dt.Rows)
{
    foreach (var item in row.ItemArray)
    {
        Console.Write(item + "\t");
    }
    Console.WriteLine();
}
$vbLabelText   $csharpLabel

Por Que a Seleção de Intervalo é Importante

A sintaxe de colchetes worksheet["A1:D20"] retorna um objeto IronXl.Range. Chamar ToDataTable nesse intervalo limita o processamento exatamente àquelas células, o que significa execução mais rápida e um consumo de memória menor quando o arquivo fonte possui dezenas de milhares de linhas.

Você também pode especificar intervalos nomeados ou construir a string de intervalo dinamicamente no tempo de execução -- por exemplo, $"A1:D{lastRow}" -- tornando a abordagem flexível para exportações de dados de comprimento variável. A referência da API da classe Range documenta todos os métodos de seleção e consulta disponíveis.

Como Você Converte um Caderno Multi-Folhas em um DataSet?

Workbooks com múltiplas planilhas mapeiam naturalmente para System.Data.DataSet, onde cada planilha se torna um DataTable separado. O método ToDataSet realiza essa conversão em uma única chamada.

using IronXL;
using System.Data;

WorkBook workbook = WorkBook.Load("multi_sheet.xlsx");

// Each worksheet becomes a DataTable inside the DataSet
DataSet dataSet = workbook.ToDataSet();

foreach (DataTable table in dataSet.Tables)
{
    Console.WriteLine($"Sheet: {table.TableName}");
    Console.WriteLine($"Rows:  {table.Rows.Count}");
    Console.WriteLine();
}
using IronXL;
using System.Data;

WorkBook workbook = WorkBook.Load("multi_sheet.xlsx");

// Each worksheet becomes a DataTable inside the DataSet
DataSet dataSet = workbook.ToDataSet();

foreach (DataTable table in dataSet.Tables)
{
    Console.WriteLine($"Sheet: {table.TableName}");
    Console.WriteLine($"Rows:  {table.Rows.Count}");
    Console.WriteLine();
}
$vbLabelText   $csharpLabel

Acessando Planilhas por Nome

Cada DataTable no DataSet retornado usa o nome original da planilha como sua propriedade TableName, de modo que você pode recuperar uma planilha específica com dataSet.Tables["Summary"] em vez de iterar pela coleção. Isso torna simples construir lógica de relatórios com múltiplas planilhas ou combinar dados de várias planilhas antes de escrever os resultados em um banco de dados.

Para mais maneiras de trabalhar com múltiplas planilhas e navegar na estrutura de livros, veja como abrir e gerenciar planilhas do Excel.

Como Você Exporta um DataTable de Volta para um Arquivo Excel?

A direção de importação para DataTable é apenas metade da história. Quando você precisa escrever dados estruturados de volta como uma planilha -- para relatórios, downloads ou arquivamento -- você cria um novo workbook, preenche células a partir do DataTable e salva.

using IronXL;
using System.Data;

// Build a sample DataTable
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("ProductID", typeof(int)));
dt.Columns.Add(new DataColumn("ProductName", typeof(string)));
dt.Columns.Add(new DataColumn("UnitPrice", typeof(decimal)));
dt.Rows.Add(1, "Widget Pro", 29.99m);
dt.Rows.Add(2, "Gadget Max", 49.99m);
dt.Rows.Add(3, "Sensor Kit", 14.50m);

// Create a new workbook and worksheet
WorkBook workbook = WorkBook.Create();
WorkSheet worksheet = workbook.CreateWorkSheet("Products");

// Write column headers from DataTable.Columns
for (int col = 0; col < dt.Columns.Count; col++)
{
    worksheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
}

// Write data rows
for (int row = 0; row < dt.Rows.Count; row++)
{
    for (int col = 0; col < dt.Columns.Count; col++)
    {
        worksheet.SetCellValue(row + 1, col, dt.Rows[row][col]);
    }
}

// Save as XLSX
workbook.SaveAs("products_export.xlsx");
Console.WriteLine("Export complete.");
using IronXL;
using System.Data;

// Build a sample DataTable
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("ProductID", typeof(int)));
dt.Columns.Add(new DataColumn("ProductName", typeof(string)));
dt.Columns.Add(new DataColumn("UnitPrice", typeof(decimal)));
dt.Rows.Add(1, "Widget Pro", 29.99m);
dt.Rows.Add(2, "Gadget Max", 49.99m);
dt.Rows.Add(3, "Sensor Kit", 14.50m);

// Create a new workbook and worksheet
WorkBook workbook = WorkBook.Create();
WorkSheet worksheet = workbook.CreateWorkSheet("Products");

// Write column headers from DataTable.Columns
for (int col = 0; col < dt.Columns.Count; col++)
{
    worksheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
}

// Write data rows
for (int row = 0; row < dt.Rows.Count; row++)
{
    for (int col = 0; col < dt.Columns.Count; col++)
    {
        worksheet.SetCellValue(row + 1, col, dt.Rows[row][col]);
    }
}

// Save as XLSX
workbook.SaveAs("products_export.xlsx");
Console.WriteLine("Export complete.");
$vbLabelText   $csharpLabel

Como Funciona o Loop de Escrita de Células

SetCellValue(rowIndex, columnIndex, value) aceita valores object, então você passa os nomes das colunas para a linha de cabeçalho e os valores brutos das células para as linhas de dados sem qualquer conversão de tipos. O deslocamento de linha de row + 1 reserva a linha 0 para cabeçalhos. O arquivo XLSX resultante é uma planilha totalmente válida -- sem espaços reservados, sem arquivos temporários.

Para DataTables maiores, considere aplicar redimensionamento automático de colunas após a escrita dos dados para que o conteúdo seja exibido de forma clara sem formatação manual.

Como Você Vincula o DataTable a um DataGridView?

Uma das razões mais comuns para exportar uma planilha do Excel para um DataTable é exibi-la em um DataGridView do Windows Forms. Uma vez que você tem um DataTable, a vinculação é uma única linha de código.

using IronXL;
using System.Data;
using System.Windows.Forms;

WorkBook workbook = WorkBook.Load("inventory.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
DataTable dataTable = worksheet.ToDataTable(true);

// Bind directly to a DataGridView
dataGridViewInventory.DataSource = dataTable;
using IronXL;
using System.Data;
using System.Windows.Forms;

WorkBook workbook = WorkBook.Load("inventory.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
DataTable dataTable = worksheet.ToDataTable(true);

// Bind directly to a DataGridView
dataGridViewInventory.DataSource = dataTable;
$vbLabelText   $csharpLabel

O Que Acontece no Momento da Vinculação

Configurar DataSource aciona o DataGridView para ler os nomes das colunas e os dados das linhas do DataTable. Cada DataColumn se torna uma coluna de grade, e cada DataRow uma linha visível. Você pode aplicar comportamento de ordenação, filtragem e seleção através dos controles embutidos da grade sem qualquer código adicional.

Esse padrão funciona igualmente bem com DataGrid de WPF, GridView do ASP.NET e qualquer outra infraestrutura de vinculação de dados .NET. Para um guia passo a passo, veja como exportar um DataGridView para Excel para a direção reversa.

Como Você Usa Consultas LINQ em um DataTable Exportado?

Após converter uma planilha para um DataTable, você pode executar consultas LINQ usando o método de extensão AsEnumerable(), que transforma cada DataRow em um elemento consultável.

using IronXL;
using System.Data;
using System.Linq;

WorkBook workbook = WorkBook.Load("sales.xlsx");
DataTable dt = workbook.DefaultWorkSheet.ToDataTable(true);

// Filter rows where the "Revenue" column exceeds 10000
var highRevenue = dt.AsEnumerable()
    .Where(row => row.Field<double>("Revenue") > 10000)
    .OrderByDescending(row => row.Field<double>("Revenue"))
    .ToList();

Console.WriteLine($"High-revenue records: {highRevenue.Count}");
foreach (var row in highRevenue)
{
    Console.WriteLine($"{row["Product"]}: {row["Revenue"]:C}");
}
using IronXL;
using System.Data;
using System.Linq;

WorkBook workbook = WorkBook.Load("sales.xlsx");
DataTable dt = workbook.DefaultWorkSheet.ToDataTable(true);

// Filter rows where the "Revenue" column exceeds 10000
var highRevenue = dt.AsEnumerable()
    .Where(row => row.Field<double>("Revenue") > 10000)
    .OrderByDescending(row => row.Field<double>("Revenue"))
    .ToList();

Console.WriteLine($"High-revenue records: {highRevenue.Count}");
foreach (var row in highRevenue)
{
    Console.WriteLine($"{row["Product"]}: {row["Revenue"]:C}");
}
$vbLabelText   $csharpLabel

Por Que LINQ em DataTable É Útil

As consultas LINQ fornecem uma maneira legível e fortemente tipada de filtrar, ordenar, agrupar e projetar dados de uma planilha convertida. row.Field<t>(columnName) lida com coerção de tipo de forma limpa, lançando um InvalidCastException se um valor não puder ser convertido em vez de retornar um nulo silencioso. Isso torna mais fácil capturar problemas de qualidade de dados cedo.

Combine esta abordagem com a exportação baseada em intervalo da seção anterior para consultar regiões específicas da planilha em vez de planilhas completas, mantendo o uso de memória baixo para arquivos grandes.

Como Você Lida com Células Nulas e Vazias Durante a Exportação?

Planilhas do Excel frequentemente têm lacunas -- células vazias, regiões mescladas ou texto de espaço reservado. IronXL mapeia células vazias para DBNull.Value no DataTable exportado, correspondendo ao comportamento padrão do ADO.NET, para que seu código existente de tratamento de nulos funcione sem modificação.

Como IronXL mapeia estados de células do Excel para valores do DataTable
Estado da célula do Excel Valor do DataTable Notas
Valor de texto String Retornado como está
Valor numérico Duplo ou Decimal Depende do formato da célula
Valor de data DateTime Analisado a partir do número de série
Valor booleano Boolean VERDADEIRO/FALSO no Excel
Célula vazia DBNull.Value Null padrão do ADO.NET
Célula de fórmula Resultado calculado O IronXL avalia a fórmula primeiro

Ao escrever um DataTable de volta no Excel, campos DBNull.Value produzem células vazias, preservando a fidelidade de ida e volta. Se você precisar de uma string padrão para campos nulos, substitua DBNull.Value por seu placeholder antes de chamar SetCellValue.

Para mais orientações sobre preparação de dados, a documentação da classe DataTable da Microsoft cobre o tratamento de nulos, gerenciamento de restrições e estados de linhas em detalhes.

Como Você Economiza Memória Ao Exportar Planilhas Grandes?

Para planilhas com muitos milhares de linhas, exportar a planilha inteira de uma vez aloca todos os dados na memória simultaneamente. Dois padrões IronXL reduzem o uso máximo de memória:

  • Exportação de intervalo: Use worksheet["A1:D5000"].ToDataTable(true) para processar uma região delimitada em vez da planilha completa.
  • Processamento em lote: Calcule a última linha usada com worksheet.RowCount, depois faça um loop sobre intervalos de tamanho fixo -- por exemplo, 1.000 linhas por vez -- e processe cada lote antes de passar para o próximo.

As propriedades worksheet.RowCount e worksheet.ColumnCount permitem que você construa strings de intervalo dinâmicos sem codificar dimensões:

using IronXL;
using System.Data;

WorkBook workbook = WorkBook.Load("large_dataset.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;

int batchSize = 1000;
int totalRows = worksheet.RowCount;

for (int startRow = 1; startRow <= totalRows; startRow += batchSize)
{
    int endRow = Math.Min(startRow + batchSize - 1, totalRows);
    string rangeAddress = $"A{startRow}:Z{endRow}";

    DataTable batch = worksheet[rangeAddress].ToDataTable(false);
    // Process each batch -- write to database, transform, etc.
    Console.WriteLine($"Processed rows {startRow} to {endRow}");
}
using IronXL;
using System.Data;

WorkBook workbook = WorkBook.Load("large_dataset.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;

int batchSize = 1000;
int totalRows = worksheet.RowCount;

for (int startRow = 1; startRow <= totalRows; startRow += batchSize)
{
    int endRow = Math.Min(startRow + batchSize - 1, totalRows);
    string rangeAddress = $"A{startRow}:Z{endRow}";

    DataTable batch = worksheet[rangeAddress].ToDataTable(false);
    // Process each batch -- write to database, transform, etc.
    Console.WriteLine($"Processed rows {startRow} to {endRow}");
}
$vbLabelText   $csharpLabel

Este padrão é particularmente relevante para ler grandes arquivos Excel em C# onde há restrições de memória.

Como Você Escreve a DataTable em um Banco de Dados?

Uma vez que você tem um DataTable, inseri-lo no SQL Server via SqlBulkCopy é o caminho mais rápido para grandes conjuntos de dados. SqlBulkCopy aceita um DataTable diretamente e faz streaming das linhas em lotes sem construir declarações INSERT individuais.

using IronXL;
using System.Data;
using Microsoft.Data.SqlClient;

WorkBook workbook = WorkBook.Load("orders.xlsx");
DataTable dataTable = workbook.DefaultWorkSheet.ToDataTable(true);

string connectionString = "Server=.;Database=OrdersDB;Trusted_Connection=True;";

using SqlConnection connection = new(connectionString);
connection.Open();

using SqlBulkCopy bulkCopy = new(connection);
bulkCopy.DestinationTableName = "dbo.Orders";
bulkCopy.BatchSize = 500;
bulkCopy.BulkCopyTimeout = 60;

// Map DataTable columns to database columns
bulkCopy.ColumnMappings.Add("OrderID", "OrderID");
bulkCopy.ColumnMappings.Add("CustomerName", "CustomerName");
bulkCopy.ColumnMappings.Add("TotalAmount", "TotalAmount");

bulkCopy.WriteToServer(dataTable);
Console.WriteLine("Bulk insert complete.");
using IronXL;
using System.Data;
using Microsoft.Data.SqlClient;

WorkBook workbook = WorkBook.Load("orders.xlsx");
DataTable dataTable = workbook.DefaultWorkSheet.ToDataTable(true);

string connectionString = "Server=.;Database=OrdersDB;Trusted_Connection=True;";

using SqlConnection connection = new(connectionString);
connection.Open();

using SqlBulkCopy bulkCopy = new(connection);
bulkCopy.DestinationTableName = "dbo.Orders";
bulkCopy.BatchSize = 500;
bulkCopy.BulkCopyTimeout = 60;

// Map DataTable columns to database columns
bulkCopy.ColumnMappings.Add("OrderID", "OrderID");
bulkCopy.ColumnMappings.Add("CustomerName", "CustomerName");
bulkCopy.ColumnMappings.Add("TotalAmount", "TotalAmount");

bulkCopy.WriteToServer(dataTable);
Console.WriteLine("Bulk insert complete.");
$vbLabelText   $csharpLabel

Considerações Sobre Mapeamento de Colunas

A coleção ColumnMappings combina nomes de colunas DataTable com nomes de colunas de banco de dados. Se ambos os nomes forem idênticos, você pode omitir mapeamentos individuais e SqlBulkCopy fará correspondência automática por nome. Mapeamentos explícitos são mais seguros quando a ordem das colunas da planilha difere do esquema do banco de dados.

Para mais sobre a combinação do IronXL com fluxos de trabalho de banco de dados, o guia de importação do Excel em C# cobre cenários adicionais de importação, incluindo validação antes da inserção.

Para projetos baseados em Entity Framework, converta suas linhas DataTable em objetos de modelo tipados primeiro, depois use DbContext.BulkInsert de uma biblioteca como EFCore.BulkExtensions para inserção em lote com reconhecimento de ORM. A documentação do SqlBulkCopy da Microsoft explica opções de agrupamento e suporte a transações em detalhes.

Quais são os seus próximos passos?

Agora você tem um kit de ferramentas completo para mover dados entre o Excel e DataTable em ambas as direções usando IronXL:

  • Converta uma planilha completa com worksheet.ToDataTable(true) para exportações com reconhecimento de cabeçalho
  • Exporte um intervalo de células específico com a sintaxe worksheet["A1:D20"].ToDataTable(true)
  • Converta workbooks de várias planilhas com workbook.ToDataSet() para acesso completo DataSet
  • Escreva conteúdo DataTable de volta para XLSX iterando valores DataRow com SetCellValue
  • Vincule o DataTable a controles de interface como DataGridView com uma única atribuição DataSource
  • Alimente SqlBulkCopy diretamente de um DataTable para inserções de banco de dados de alta taxa de transferência

Para aprofundar suas habilidades em IronXL, explore estes tópicos relacionados:

Comece com uma licença de teste gratuita do IronXL para executar esses exemplos em seus próprios projetos. Quando estiver pronto para implantar, compre uma licença de produção ou converse com a equipe para orientação de licenciamento.

!{--010011000100100101000010010100100100000101010010010110010101111101000111010001010101010100010111110101001101010100010000010101001001010100010001010100010001011111010101110100100 101010100010010000101111101010000010100100111101000100010101010100001101010100010111110101010001010010010010010010010100000101001100010111110100001001001100010011110100001101001011--}

Perguntas frequentes

Como posso exportar dados do Excel para um DataTable em C# usando o IronXL?

É possível exportar dados do Excel para um DataTable em C# usando o IronXL, carregando o arquivo Excel no IronXL, selecionando a planilha ou o intervalo e, em seguida, usando o método ExportToDataTable para converter os dados em um objeto DataTable.

Quais são os benefícios de converter dados do Excel em um DataTable?

Converter dados do Excel em um DataTable fornece dados estruturados ideais para operações de banco de dados, vinculação de dados a controles de interface do usuário e integração perfeita com o .NET. Também facilita a manipulação e o processamento de dados em aplicativos C#.

O IronXL consegue lidar com a importação e exportação de dados entre o Excel e o DataTable?

Sim, o IronXL lida de forma eficiente tanto com a importação de dados do Excel para um DataTable quanto com a exportação de dados de um DataTable para o Excel, tornando-se uma ferramenta versátil para gerenciar a troca de dados em aplicações C#.

É possível converter intervalos específicos de uma planilha do Excel em um DataTable usando o IronXL?

Sim, o IronXL permite selecionar intervalos específicos em uma planilha do Excel e convertê-los em um DataTable, oferecendo flexibilidade na manipulação e extração de dados.

Preciso ter o Microsoft Office instalado para usar o IronXL na conversão de dados do Excel?

Não, você não precisa ter o Microsoft Office instalado em seu computador para usar o IronXL para converter dados do Excel em DataTable ou vice-versa. O IronXL funciona independentemente do Microsoft Office.

Que tipos de dados podem ser convertidos do Excel para o DataTable usando o IronXL?

O IronXL pode converter vários tipos de dados do Excel, incluindo números, texto, datas e fórmulas, em um formato DataTable, preservando a integridade e a estrutura dos dados.

O IronXL consegue exportar um DataTable de volta para um arquivo Excel?

Sim, o IronXL pode exportar um DataTable de volta para um arquivo Excel, permitindo que você gere relatórios ou crie soluções de armazenamento de dados diretamente de seus aplicativos C#.

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