Exportar una tabla de datos de Excel en C# | Convertir datos de Excel
La exportación de datos de Excel a un DataTable le proporciona acceso estructurado y en memoria al contenido de la hoja de cálculo, que funciona de forma natural con bases de datos, controles de interfaz de usuario y consultas LINQ. La dirección inversa —escribir un DataTable de nuevo en un archivo de Excel— es igual de importante para los flujos de trabajo de generación de informes y almacenamiento de datos. IronXL gestiona ambas direcciones en .NET puro, sin dependencia de Microsoft Office y sin necesidad de configuración de interoperabilidad COM.
Instala IronXL antes de ejecutar cualquiera de los ejemplos siguientes:
Install-Package IronXL
dotnet add package IronXL
Install-Package IronXL
dotnet add package IronXL
Una vez instalados, los tipos WorkBook y WorkSheet exponen los métodos ToDataTable y ToDataSet que se asignan directamente a las estructuras System.Data. También puede invertir el proceso escribiendo los valores DataRow de nuevo en una hoja de cálculo y guardando el archivo en formato XLSX o XLS.
¿Cómo se convierte una hoja de cálculo completa en una DataTable?
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();
}
Imports IronXL
Imports System.Data
' Load the workbook from disk
Dim workbook As WorkBook = WorkBook.Load("customers.xlsx")
' Grab the default (first) worksheet
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
' Convert the entire sheet; first row becomes column headers
Dim dataTable As DataTable = worksheet.ToDataTable(True)
' Iterate every row and print each cell value
For Each row As DataRow In dataTable.Rows
For i As Integer = 0 To dataTable.Columns.Count - 1
Console.Write(row(i) & vbTab)
Next
Console.WriteLine()
Next
Qué hace el código
WorkBook.Load lee el archivo XLSX sin ninguna automatización de Office. worksheet.ToDataTable(true) recorre cada celda de la hoja y la asigna a un DataRow, utilizando la primera fila como nombres de DataColumn. El resultado DataTable es un objeto estándar System.Data: puede vincularlo a un DataGridView, pasarlo a un SqlBulkCopy o ejecutar consultas LINQ sobre él inmediatamente.
La llamada ToDataTable es compatible con los formatos XLS y XLSX, por lo que el mismo código funciona para hojas de cálculo heredadas sin necesidad de modificaciones. Consulte la documentación de IronXL DataTable y DataSet para obtener la referencia completa de la API.
¿Cómo se exporta 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 necesitas un subconjunto de filas y columnas, puedes exportar un rango de celdas específico en lugar de la hoja completa. Este enfoque es más eficiente para archivos grandes, ya que 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();
}
Imports IronXL
Imports System.Data
Dim workbook As WorkBook = WorkBook.Load("financial_report.xlsx")
' Access a named worksheet
Dim worksheet As WorkSheet = workbook.GetWorkSheet("Summary")
' Select only the region A1:D20 and convert it
Dim dt As DataTable = worksheet("A1:D20").ToDataTable(True)
Console.WriteLine($"Rows: {dt.Rows.Count}, Columns: {dt.Columns.Count}")
For Each row As DataRow In dt.Rows
For Each item In row.ItemArray
Console.Write(item & vbTab)
Next
Console.WriteLine()
Next
Por qué es importante la selección de rangos
La sintaxis entre 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 un menor consumo de memoria cuando el archivo de origen tiene decenas de miles de filas.
También puede especificar rangos con nombre o construir 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 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 se convierte un libro de varias hojas en un conjunto de datos?
Los libros de trabajo con varias hojas se asignan de forma natural a System.Data.DataSet, donde cada hoja se convierte en un 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();
}
Imports IronXL
Imports System.Data
Dim workbook As WorkBook = WorkBook.Load("multi_sheet.xlsx")
' Each worksheet becomes a DataTable inside the DataSet
Dim dataSet As DataSet = workbook.ToDataSet()
For Each table As DataTable In dataSet.Tables
Console.WriteLine($"Sheet: {table.TableName}")
Console.WriteLine($"Rows: {table.Rows.Count}")
Console.WriteLine()
Next
Acceder a hojas por nombre
Cada DataTable en el DataSet devuelto utiliza el nombre original de la hoja de cálculo como su propiedad TableName, por lo que puede recuperar una hoja específica con dataSet.Tables["Summary"] en lugar de iterar por la colección. Esto facilita la creación de lógica de generación de informes en varias hojas o la combinación de datos de varias hojas de cálculo 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, consulta cómo abrir y gestionar hojas de cálculo de Excel.
¿Cómo se exporta una tabla de datos (DataTable) a un archivo de Excel?
La dirección "importar a DataTable" es solo la mitad de la historia. Cuando necesites volver a escribir datos estructurados en una hoja de cálculo —para informes, descargas o archivo—, crea un nuevo libro, rellena las celdas a partir del DataTable y ahorra.
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.");
Imports IronXL
Imports System.Data
' Build a sample DataTable
Dim dt As New DataTable()
dt.Columns.Add(New DataColumn("ProductID", GetType(Integer)))
dt.Columns.Add(New DataColumn("ProductName", GetType(String)))
dt.Columns.Add(New DataColumn("UnitPrice", GetType(Decimal)))
dt.Rows.Add(1, "Widget Pro", 29.99D)
dt.Rows.Add(2, "Gadget Max", 49.99D)
dt.Rows.Add(3, "Sensor Kit", 14.50D)
' Create a new workbook and worksheet
Dim workbook As WorkBook = WorkBook.Create()
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Products")
' Write column headers from DataTable.Columns
For col As Integer = 0 To dt.Columns.Count - 1
worksheet.SetCellValue(0, col, dt.Columns(col).ColumnName)
Next
' Write data rows
For row As Integer = 0 To dt.Rows.Count - 1
For col As Integer = 0 To dt.Columns.Count - 1
worksheet.SetCellValue(row + 1, col, dt.Rows(row)(col))
Next
Next
' Save as XLSX
workbook.SaveAs("products_export.xlsx")
Console.WriteLine("Export complete.")
Cómo funciona el bucle de escritura de celdas
SetCellValue(rowIndex, columnIndex, value) acepta valores object, por lo que se pasan los nombres de las columnas para la fila de encabezado y los valores de las celdas sin formato para las filas de datos sin necesidad de conversión de tipos. 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 ajuste automático del tamaño de las columnas después de escribir los datos, de modo que el contenido se muestre de forma clara sin necesidad de formateo manual.
¿Cómo se vincula la DataTable a un DataGridView?
Una de las razones más comunes para exportar una hoja de Excel a un DataTable es mostrarla en un Windows Forms DataGridView. Una vez que tengas un DataTable, la vinculación se realiza con 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;
Imports IronXL
Imports System.Data
Imports System.Windows.Forms
Dim workbook As WorkBook = WorkBook.Load("inventory.xlsx")
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
Dim dataTable As DataTable = worksheet.ToDataTable(True)
' Bind directly to a DataGridView
dataGridViewInventory.DataSource = dataTable
¿Qué ocurre en el momento de la vinculación?
Al establecer DataSource, se activa DataGridView para leer los nombres de las columnas y los datos de las 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 comportamientos de ordenación, filtrado y selección a través de los controles integrados de la cuadrícula sin necesidad de código adicional.
Este patrón funciona igual de bien con WPF DataGrid, ASP.NET GridView y cualquier otra infraestructura de enlace de datos de .NET. Para obtener una guía paso a paso, consulte cómo exportar un DataGridView a Excel en la dirección inversa.
¿Cómo se utilizan las consultas LINQ en una DataTable exportada?
Después de convertir una hoja de cálculo a 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}");
}
Imports IronXL
Imports System.Data
Imports System.Linq
Dim workbook As WorkBook = WorkBook.Load("sales.xlsx")
Dim dt As DataTable = workbook.DefaultWorkSheet.ToDataTable(True)
' Filter rows where the "Revenue" column exceeds 10000
Dim highRevenue = dt.AsEnumerable() _
.Where(Function(row) row.Field(Of Double)("Revenue") > 10000) _
.OrderByDescending(Function(row) row.Field(Of Double)("Revenue")) _
.ToList()
Console.WriteLine($"High-revenue records: {highRevenue.Count}")
For Each row In highRevenue
Console.WriteLine($"{row("Product")}: {row("Revenue"):C}")
Next
Por qué es útil LINQ en DataTable
Las consultas LINQ le ofrecen una forma legible y fuertemente tipada de filtrar, ordenar, agrupar y proyectar datos de una hoja de cálculo convertida. row.Field<t>(columnName) gestiona la coerción de tipos de forma limpia, lanzando un InvalidCastException si un valor no se puede convertir, en lugar de devolver un null silencioso. Esto facilita la detección temprana de problemas de calidad de los datos.
Combine este enfoque con la exportación basada en rangos de la sección anterior para consultar regiones específicas de la hoja en lugar de hojas de cálculo completas, lo que mantiene bajo el uso de memoria en archivos de gran tamaño.
¿Cómo se gestionan las celdas nulas y vacías durante la exportación?
Las hojas de cálculo de Excel suelen tener huecos: celdas vacías, regiones fusionadas o texto de marcador de posición. IronXL asigna las celdas vacías a DBNull.Value en el DataTable exportado, lo que se ajusta al comportamiento estándar de ADO.NET para que su código de gestión de valores nulos existente funcione sin modificaciones.
| Estado de la celda de Excel | Valor de DataTable | Notas |
|---|---|---|
| Valor del texto | Cadena | Devuelto tal cual |
| Valor numérico | Doble o Decimal | Depende del formato de la celda |
| Valor de fecha | DateTime | Analizado a partir del número de serie |
| Valor booleano | Booleano | VERDADERO/FALSO en Excel |
| Celdilla vacía | DBNull.Value | Nulo estándar de ADO.NET Standard |
| Celdas de fórmula | Resultado calculado | IronXL evalúa primero la fórmula |
Al escribir un DataTable de vuelta a Excel, los campos DBNull.Value producen celdas vacías, preservando la fidelidad de ida y vuelta. Si necesitas una cadena predeterminada para los campos nulos, sustituye DBNull.Value por tu 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 trata en profundidad el manejo de valores nulos, la gestión de restricciones y los estados de las filas.
¿Cómo se ahorra memoria al exportar hojas de cálculo de gran tamaño?
En el caso de hojas de cálculo con muchos miles de filas, al exportar toda la hoja de una sola vez se asignan todos los datos a la memoria simultáneamente. Dos patrones de IronXL reducen el pico de uso 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: Calcule la última fila utilizada con
worksheet.RowCount, luego recorra rangos de tamaño fijo —por ejemplo, 1000 filas a la vez— y procese cada lote antes de pasar al siguiente.
Las propiedades worksheet.RowCount y worksheet.ColumnCount te permiten crear cadenas de rango dinámico sin codificar las dimensiones de forma rígida:
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}");
}
Imports IronXL
Imports System.Data
Dim workbook As WorkBook = WorkBook.Load("large_dataset.xlsx")
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
Dim batchSize As Integer = 1000
Dim totalRows As Integer = worksheet.RowCount
For startRow As Integer = 1 To totalRows Step batchSize
Dim endRow As Integer = Math.Min(startRow + batchSize - 1, totalRows)
Dim rangeAddress As String = $"A{startRow}:Z{endRow}"
Dim batch As DataTable = worksheet(rangeAddress).ToDataTable(False)
' Process each batch -- write to database, transform, etc.
Console.WriteLine($"Processed rows {startRow} to {endRow}")
Next
Este patrón es especialmente relevante para leer archivos Excel de gran tamaño en C#, donde existen limitaciones de memoria.
¿Cómo se escribe la tabla de datos en una base de datos?
Una vez que se dispone de un DataTable, insertarlo en SQL Server mediante SqlBulkCopy es la forma más rápida de trabajar con grandes conjuntos de datos. SqlBulkCopy acepta un DataTable directamente y transmite filas por lotes sin crear sentencias 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.");
Imports IronXL
Imports System.Data
Imports Microsoft.Data.SqlClient
Dim workbook As WorkBook = WorkBook.Load("orders.xlsx")
Dim dataTable As DataTable = workbook.DefaultWorkSheet.ToDataTable(True)
Dim connectionCadena As String = "Server=.;Database=OrdersDB;Trusted_Connection=True;"
Using connection As New SqlConnection(connectionCadena)
connection.Open()
Using bulkCopy As New SqlBulkCopy(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)
End Using
End Using
Console.WriteLine("Bulk insert complete.")
Consideraciones sobre la asignación 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 se emparejará automáticamente por el 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 cómo combinar IronXL con flujos de trabajo de bases de datos, la guía de importación de Excel en C# cubre escenarios de importación adicionales, incluida la validación previa a la inserción.
Para proyectos basados en Entity Framework, convierta primero sus filas DataTable en objetos de modelo tipados y, a continuación, utilice 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 la compatibilidad con transacciones.
¿Cuales son tus próximos pasos?
Ahora dispone de un conjunto completo de herramientas para transferir datos entre Excel y DataTable en ambas direcciones utilizando IronXL:
- Convertir una hoja de cálculo completa con
worksheet.ToDataTable(true)para exportaciones que tengan en cuenta los encabezados - Exportar un rango de celdas específico con la sintaxis
worksheet["A1:D20"].ToDataTable(true) - Convierte libros de varias hojas con
workbook.ToDataSet()para obtener acceso completo aDataSet - Escribir el contenido de
DataTablede nuevo en XLSX iterando los valores deDataRowconSetCellValue - Vincular
DataTablea controles de la interfaz de usuario comoDataGridViewcon una única asignaciónDataSource - Alimentar
SqlBulkCopydirectamente desde unDataTablepara inserciones en bases de datos de alto rendimiento
Para profundizar en tus conocimientos de IronXL, explora estos temas relacionados:
- Exportar DataSet y DataTable -- referencia completa de la API
- Convertir Excel a DataTable en C# sin OleDb
- Tutorial de exportación de DataTable de C# a Excel
- Exportar DataTable a Excel desde ASP.NET
- La forma más rápida de exportar una DataTable a Excel
- Cargar y leer archivos Excel en C#
- Exportar archivos Excel con formato
- Leer archivos Excel en C#: prácticas recomendadas
- Selección y manipulación de rangos en Excel con C#
- Importar datos de Excel a una aplicación C#
Empieza con una licencia de prueba gratuita de IronXL para ejecutar estos ejemplos en tus propios proyectos. Cuando esté listo para la implementación, adquiera una licencia de producción o póngase en contacto con el equipo para obtener orientación sobre las licencias.
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#.



