Saltar al pie de página
USANDO IRONXL

Exportar una tabla de datos de Excel en C# | Convertir datos de Excel

Exportar datos de Excel a un DataTable le brinda acceso estructurado y en memoria al contenido de la hoja de cálculo que funciona naturalmente con bases de datos, controles de UI y consultas LINQ. La dirección inversa (escribir un DataTable nuevamente en un archivo Excel) es igualmente importante para los flujos de trabajo de generación de informes y almacenamiento de datos. IronXL maneja ambas direcciones en .NET puro, sin dependencia de Microsoft Office y sin configuración de interoperabilidad COM.

Instale IronXL antes de ejecutar cualquiera de los ejemplos siguientes:

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

Una vez instalados, los tipos WorkBook y WorkSheet exponen métodos ToDataTable y ToDataSet que se asignan directamente a estructuras System.Data. También puede revertir el proceso escribiendo los valores DataRow nuevamente en una hoja de cálculo y guardando el archivo en formato XLSX o XLS.

¿Cómo convertir una hoja de cálculo completa en una tabla de datos?

El método ToDataTable convierte una hoja de cálculo completa (o un rango con nombre) en un System.Data.DataTable. Pase true para tratar la primera fila como encabezados de columna, de modo que los nombres de las columnas de la tabla resultante coincidan exactamente con los encabezados de su hoja de cálculo.

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

Qué hace el Código

WorkBook.Load lee el archivo XLSX sin ninguna automatización de Office. worksheet.ToDataTable(true) itera cada celda de la hoja y la asigna a un DataRow, usando la primera fila como DataColumn nombres. El DataTable resultante es un objeto System.Data estándar: puede vincularlo a un DataGridView, pasarlo a un SqlBulkCopy o ejecutar consultas LINQ en él inmediatamente.

La llamada ToDataTable admite formatos XLS y XLSX, por lo que el mismo código funciona para hojas de cálculo heredadas sin modificaciones. Consulte la documentación de IronXL DataTable y DataSet para obtener la referencia completa de la API.

¿Cómo exportar un rango de celdas específico a una tabla de datos?

Cuando una hoja de cálculo contiene varias regiones de datos, o cuando solo necesita un subconjunto de filas y columnas, puede exportar un rango de celdas específico en lugar de la hoja completa. Este enfoque es más eficiente para archivos grandes porque IronXL solo procesa las celdas seleccionadas.

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 qué es importante la selección de rango

La sintaxis de corchetes worksheet["A1:D20"] devuelve un objeto IronXl.Range. Llamar a ToDataTable en ese rango limita el procesamiento exactamente a esas celdas, lo que significa una ejecución más rápida y una menor huella de memoria cuando el archivo de origen tiene decenas de miles de filas.

También puede especificar rangos con nombre o crear la cadena de rango dinámicamente en tiempo de ejecución (por ejemplo, $"A1:D{lastRow}"), lo que hace que el enfoque sea flexible para las exportaciones de datos de longitud variable. La referencia de la API de la clase Range documenta todos los métodos de selección y consulta disponibles.

¿Cómo convertir un libro de trabajo de varias hojas en un conjunto de datos?

Los libros de trabajo con varias hojas se asignan naturalmente a System.Data.DataSet, donde cada hoja se convierte en una DataTable independiente. El método ToDataSet realiza esta conversión en una sola llamada.

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

Acceder a las hojas por nombre

Cada DataTable en el DataSet devuelto usa el nombre de la hoja de trabajo original como su propiedad TableName, por lo que puede recuperar una hoja específica con dataSet.Tables["Summary"] en lugar de iterar la colección. Esto facilita la creación de lógica de informes de varias hojas o la combinación de datos de varias hojas de trabajo antes de escribir los resultados en una base de datos.

Para conocer más formas de trabajar con varias hojas y navegar por la estructura del libro, consulte cómo abrir y administrar hojas de cálculo de Excel .

¿Cómo exportar una tabla de datos a un archivo de Excel?

La dirección de importación a DataTable es solo la mitad de la historia. Cuando necesita volver a escribir datos estructurados como una hoja de cálculo (para informes, descargas o archivos), cree un nuevo libro de trabajo, complete las celdas desde DataTable y guarde.

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

Cómo funciona el ciclo de escritura celular

SetCellValue(rowIndex, columnIndex, value) acepta valores object, por lo que pasa nombres de columnas para la fila de encabezado y valores de celda sin procesar para las filas de datos sin ninguna conversión de tipo. El desplazamiento de fila de row + 1 reserva la fila 0 para los encabezados. El archivo XLSX resultante es una hoja de cálculo totalmente válida: sin marcadores de posición ni archivos temporales.

Para tablas de datos más grandes, considere aplicar el tamaño automático de las columnas después de escribir los datos para que el contenido se muestre claramente sin formato manual.

¿Cómo vincular una DataTable a un DataGridView?

Una de las razones más comunes para exportar una hoja de Excel a un DataTable es mostrarla en un formulario Windows Forms DataGridView. Una vez que tenga un DataTable, la vinculación es una sola línea 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

¿Qué sucede en el momento de la vinculación?

La configuración de DataSource activa DataGridView para leer los nombres de columnas y los datos de filas de DataTable. Cada DataColumn se convierte en una columna de la cuadrícula y cada DataRow se convierte en una fila visible. Puede aplicar funciones de clasificación, filtrado y selección a través de los controles integrados de la cuadrícula sin ningún código adicional.

Este patrón funciona igualmente bien con WPF DataGrid, ASP.NET GridView y cualquier otra infraestructura de enlace de datos .NET . Para obtener una guía paso a paso, consulte cómo exportar un DataGridView a Excel para la dirección inversa.

¿Cómo utilizar consultas LINQ en una tabla de datos exportada?

Después de convertir una hoja de cálculo en un DataTable, puede ejecutar consultas LINQ utilizando el método de extensión AsEnumerable(), que transforma cada DataRow en un elemento consultable.

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 qué es útil LINQ en DataTable?

Las consultas LINQ le brindan una manera legible y fuertemente tipada de filtrar, ordenar, agrupar y proyectar datos de una hoja de cálculo convertida. row.Field<t>(columnName) maneja la coerción de tipo de manera limpia, arrojando un InvalidCastException si no se puede convertir un valor en lugar de devolver un nulo silencioso. Esto hace que sea más fácil detectar problemas de calidad de los datos de forma temprana.

Combine este enfoque con la exportación basada en rango de la sección anterior para consultar regiones de hojas específicas en lugar de hojas de trabajo completas, lo que mantiene bajo el uso de memoria para archivos grandes.

¿Cómo manejar celdas nulas y vacías durante la exportación?

Las hojas de cálculo de Excel suelen tener espacios en blanco (celdas vacías, regiones fusionadas o texto de marcador de posición). IronXL asigna celdas vacías a DBNull.Value en el DataTable exportado, lo que coincide con el comportamiento estándar de ADO .NET para que su código de manejo de valores nulos existente funcione sin modificaciones.

Cómo IronXL asigna los estados de las celdas de Excel a los valores de DataTable
Estado de celda de Excel Valor de DataTable Notas
Valor del texto Cadena Devuelto tal cual
Valor numérico Doble o decimal Depende del formato de celda
Valor de fecha Fecha y hora Analizado a partir del número de serie
valor booleano Booleano VERDADERO/FALSO en Excel
Celda vacía DBNull.Value Estándar ADO .NET null
Celda de fórmula Resultado calculado IronXL evalúa primero la fórmula

Al escribir un DataTable en Excel, los campos DBNull.Value producen celdas vacías, lo que preserva la fidelidad del viaje de ida y vuelta. Si necesita una cadena predeterminada para campos nulos, reemplace DBNull.Value con su marcador de posición antes de llamar a SetCellValue.

Para obtener más orientación sobre la preparación de datos, la documentación de la clase DataTable de Microsoft cubre en profundidad el manejo de valores nulos, la gestión de restricciones y los estados de fila.

¿Cómo ahorrar memoria al exportar hojas de trabajo grandes?

Para hojas de trabajo con miles de filas, exportar toda la hoja de una vez asigna todos los datos en la memoria simultáneamente. Dos patrones IronXL reducen el uso máximo de memoria:

  • Exportación de rango : utilice worksheet["A1:D5000"].ToDataTable(true) para procesar una región delimitada en lugar de la hoja completa.
  • Procesamiento por lotes : calcula la última fila utilizada con worksheet.RowCount, luego recorre rangos de tamaño fijo (por ejemplo, 1000 filas a la vez) y procesa cada lote antes de pasar al siguiente.

Las propiedades worksheet.RowCount y worksheet.ColumnCount le permiten crear cadenas de rango dinámico sin codificar dimensiones:

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 patrón es particularmente relevante para leer archivos grandes de Excel en C# donde se aplican restricciones de memoria.

¿Cómo se escribe la tabla de datos en una base de datos?

Una vez que tenga un DataTable, insertarlo en SQL Server a través de SqlBulkCopy es la ruta más rápida para conjuntos de datos grandes. SqlBulkCopy acepta un DataTable directamente y transmite filas en lotes sin crear declaraciones INSERT individuales.

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

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

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

using SqlConnection connection = new(connectionCadena);
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 connectionCadena = "Server=.;Database=OrdersDB;Trusted_Connection=True;";

using SqlConnection connection = new(connectionCadena);
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

Consideraciones sobre el mapeo de columnas

La colección ColumnMappings hace coincidir los nombres de las columnas DataTable con los nombres de las columnas de la base de datos. Si ambos nombres son idénticos, puede omitir las asignaciones individuales y SqlBulkCopy coincidirá automáticamente por nombre. Las asignaciones explícitas son más seguras cuando el orden de las columnas de la hoja de cálculo difiere del esquema de la base de datos.

Para obtener más información sobre la combinación de IronXL con flujos de trabajo de bases de datos, la guía de importación de C# Excel cubre escenarios de importación adicionales, incluida la validación antes de la inserción.

Para proyectos basados ​​en Entity Framework, primero convierta sus filas DataTable en objetos de modelo tipificados y luego use DbContext.BulkInsert de una biblioteca como EFCore.BulkExtensions para la inserción por lotes compatible con ORM. La documentación de SqlBulkCopy de Microsoft explica en detalle las opciones de procesamiento por lotes y el soporte de transacciones.

¿Cuales son tus próximos pasos?

Ahora tienes un conjunto de herramientas completo para mover datos entre Excel y DataTable en ambas direcciones usando IronXL:

  • Convierta una hoja de cálculo completa con worksheet.ToDataTable(true) para exportaciones que tengan en cuenta el encabezado
  • Exportar un rango de celdas específico con la sintaxis worksheet["A1:D20"].ToDataTable(true)
  • Convierta libros de trabajo de varias hojas con workbook.ToDataSet() para obtener acceso completo a DataSet
  • Escribe el contenido de DataTable en XLSX iterando los valores de DataRow con SetCellValue
  • Vincula DataTable a controles de UI como DataGridView con una única asignación DataSource
  • Alimente SqlBulkCopy directamente desde un DataTable para inserciones de bases de datos de alto rendimiento

Para profundizar sus habilidades en IronXL , explore estos temas relacionados:

Comience con una licencia de prueba gratuita de IronXL para ejecutar estos ejemplos en sus propios proyectos. Cuando esté listo para implementar, compre una licencia de producción o chatee con el equipo para obtener orientación sobre la licencia.

Empiece con IronXL ahora.
green arrow pointer

Preguntas Frecuentes

¿Cómo puedo exportar datos de Excel a una DataTable en C# usando IronXL?

Puede exportar datos de Excel a una DataTable en C# usando IronXL cargando el archivo de Excel en IronXL, seleccionando la hoja de cálculo o el rango y luego usando el método ExportToDataTable para convertir los datos en un objeto DataTable.

¿Cuáles son los beneficios de convertir datos de Excel a una DataTable?

La conversión de datos de Excel a una DataTable proporciona datos estructurados ideales para operaciones de bases de datos, la vinculación de datos a controles de interfaz de usuario y una integración fluida con .NET. Además, facilita la manipulación y el procesamiento de datos en aplicaciones de C#.

¿Puede IronXL gestionar tanto la importación como la exportación de datos entre Excel y DataTable?

Sí, IronXL maneja de manera eficiente tanto la importación de datos de Excel a una DataTable como la exportación de datos de una DataTable a Excel, lo que lo convierte en una herramienta versátil para administrar el intercambio de datos en aplicaciones C#.

¿Es posible convertir rangos específicos dentro de una hoja de Excel a una DataTable usando IronXL?

Sí, IronXL le permite seleccionar rangos específicos dentro de una hoja de Excel y convertirlos en una DataTable, lo que le brinda flexibilidad en la manipulación y extracción de datos.

¿Necesito tener instalado Microsoft Office para usar IronXL para la conversión de datos de Excel?

No, no necesita tener Microsoft Office instalado en su equipo para usar IronXL y convertir datos de Excel a DataTable o viceversa. IronXL funciona independientemente de Microsoft Office.

¿Qué tipos de datos se pueden convertir de Excel a DataTable usando IronXL?

IronXL puede convertir varios tipos de datos de Excel, incluidos números, texto, fechas y fórmulas, a un formato DataTable, preservando la integridad y la estructura de los datos.

¿Puede IronXL exportar un DataTable a un archivo Excel?

Sí, IronXL puede exportar una DataTable a un archivo Excel, lo que le permite generar informes o crear soluciones de almacenamiento de datos directamente desde sus aplicaciones C#.

Jordi Bardia
Ingeniero de Software
Jordi es más competente en Python, C# y C++. Cuando no está aprovechando sus habilidades en Iron Software, está programando juegos. Compartiendo responsabilidades para pruebas de productos, desarrollo de productos e investigación, Jordi agrega un valor inmenso a la mejora continua del producto. La experiencia variada lo mantiene ...
Leer más

Iron Support Team

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