Saltar al pie de página
USANDO IRONXL

La mejor manera de leer archivos de Excel en C# | Guía paso a paso de IronXL

Leer archivos de Excel en C# es un desafío común para los desarrolladores de .NET . Ya sea que esté creando un proceso de importación de datos, una herramienta de informes o un sistema de procesamiento por lotes, analizar de forma limpia los datos de la hoja de cálculo es importante. IronXL es una biblioteca .NET que maneja archivos XLSX, XLS y CSV sin necesidad de Microsoft Office o Interoperabilidad COM en el servidor. Esta guía lo guía a través del flujo de trabajo completo, desde la instalación hasta las consultas avanzadas, para que pueda elegir el enfoque adecuado para su proyecto.

Empiece con IronXL ahora.
green arrow pointer

¿Cuál es la mejor manera de leer archivos de Excel en C#?

El mejor enfoque es utilizar una biblioteca dedicada e independiente de Office, como IronXL. Los métodos tradicionales como Microsoft.Office.Interop.Excel funcionan en máquinas donde está instalado Excel, pero son frágiles en entornos de servidores o contenedores porque activan un proceso COM detrás de escena. OpenXML SDK es gratuito y seguro para servidores, pero expone un modelo XML de bajo nivel que requiere un código repetitivo significativo para las tareas cotidianas.

IronXL se sitúa entre estos extremos. La API refleja cómo los desarrolladores ya piensan sobre las hojas de cálculo: los libros de trabajo contienen hojas de cálculo, las hojas de cálculo contienen celdas y las celdas contienen valores escritos. La biblioteca maneja la detección de formato, la evaluación de fórmulas y la codificación internamente, por lo que usted dedica tiempo a la lógica empresarial en lugar de analizar los detalles.

Comparación de enfoques de lectura de Excel en C#
Acercarse ¿Requiere Office? ¿Servidor seguro? Simplicidad de la API Soporte de formato
Interoperabilidad COM No Bajo XLSX, XLS
OpenXML SDK No Bajo Solo XLSX
IronXL No Alto XLSX, XLS, CSV

La documentación de lectura de IronXL Excel cubre toda la superficie de la API. Por ahora, las secciones a continuación muestran los patrones principales que utilizarás en cada proyecto.

¿Cómo instalar IronXL en un proyecto .NET ?

La instalación tarda menos de un minuto utilizando el Administrador de paquetes NuGet . Abra una terminal en el directorio de su proyecto y ejecute:

dotnet add package IronXl.Excel
dotnet add package IronXl.Excel
SHELL

Alternativamente, utilice la consola del Administrador de paquetes de Visual Studio:

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

Después de la instalación, agregue la directiva using IronXL; a cualquier archivo que necesite acceso a la hoja de cálculo. La biblioteca es compatible con .NET 10, .NET 8, .NET 6, .NET Framework 4.6.2 y .NET Standard 2.0, por lo que se integra en proyectos existentes sin necesidad de actualizar el entorno de ejecución. Consulte la guía de instalación de IronXL para obtener información específica de cada plataforma y detalles sobre los paquetes NuGet .

No se requieren componentes de ejecución adicionales, entradas de registro ni licencias de Office. El paquete NuGet incluye todo lo que necesita la biblioteca.

Verificación de la instalación

Después de agregar el paquete, compile el proyecto una vez para confirmar que la referencia se resuelve correctamente. Si ve un error CS0246 para los tipos IronXL, verifique que la directiva using IronXL; esté presente y que el marco de destino en su .csproj sea una de las versiones compatibles. La matriz de compatibilidad de IronXL enumera todos los objetivos de tiempo de ejecución confirmados.

¿Cómo cargar y leer un libro de Excel?

Para cargar un libro de trabajo se requiere una única llamada al método. WorkBook.Load acepta una ruta de archivo y devuelve un objeto WorkBook que representa el archivo completo en la memoria.

using IronXL;

// Load any supported format -- XLSX, XLS, or CSV
WorkBook workbook = WorkBook.Load("financial_report.xlsx");

// Access the first worksheet by position
WorkSheet worksheet = workbook.WorkSheets[0];

// Or retrieve a named worksheet
WorkSheet expenses = workbook.GetWorkSheet("Expenses");

Console.WriteLine($"Sheets loaded: {workbook.WorkSheets.Count}");
Console.WriteLine($"Default sheet rows: {worksheet.RowCount}");
using IronXL;

// Load any supported format -- XLSX, XLS, or CSV
WorkBook workbook = WorkBook.Load("financial_report.xlsx");

// Access the first worksheet by position
WorkSheet worksheet = workbook.WorkSheets[0];

// Or retrieve a named worksheet
WorkSheet expenses = workbook.GetWorkSheet("Expenses");

Console.WriteLine($"Sheets loaded: {workbook.WorkSheets.Count}");
Console.WriteLine($"Default sheet rows: {worksheet.RowCount}");
$vbLabelText   $csharpLabel

La mejor manera de leer un archivo de Excel en C# con IronXL: Imagen 1 - Salida de la consola para la confirmación del libro cargado

El objeto WorkBook mantiene accesibles todos los datos de la hoja de cálculo. Cada instancia de WorkSheet se asigna a una pestaña del archivo. El acceso por índice (WorkSheets[0]) es fiable para archivos de una sola hoja. Acceder por nombre es más seguro cuando el archivo contiene varias pestañas con nombres conocidos.

IronXL evalúa las fórmulas automáticamente cuando lees una celda. Si la celda B10 contiene =SUM(B2:B9), la lectura de sheet["B10"].DecimalValue devuelve el total calculado, no la cadena de fórmula. Para obtener más detalles sobre las opciones de carga de libros de trabajo, consulte la guía práctica de carga de hojas de cálculo .

Trabajar con varias hojas de trabajo

Cuando un libro de trabajo contiene varias pestañas, puedes enumerarlas usando workbook.WorkSheets y procesar cada una por turno. Esto es útil para archivos que dividen datos por mes, departamento o región en pestañas separadas. La propiedad WorkSheet.Name le proporciona la etiqueta de la pestaña como una cadena, que puede usar para el procesamiento condicional o el registro.

¿Cómo leer los valores de celda de una hoja de cálculo?

IronXL proporciona propiedades fuertemente tipadas en cada celda para que pueda leer valores directamente en el tipo .NET correcto sin análisis manual.

using IronXL;

WorkBook workbook = WorkBook.Load("Products.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;

// Address-based access with typed properties
string productName = sheet["A2"].StringValue;
int quantity       = sheet["B2"].IntValue;
decimal price      = sheet["C2"].DecimalValue;
bool inStock       = sheet["D2"].BoolValue;

// Check for empty cells before processing
var statusCell = sheet["E2"];
if (statusCell.Value != null && statusCell.StringValue.Length > 0)
{
    Console.WriteLine($"Status: {statusCell.StringValue}");
}

// Row/column index access (zero-based)
var firstDataCell = sheet.Rows[1].Columns[0];
Console.WriteLine($"Product: {productName}, Qty: {quantity}, Price: {price:C}");
using IronXL;

WorkBook workbook = WorkBook.Load("Products.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;

// Address-based access with typed properties
string productName = sheet["A2"].StringValue;
int quantity       = sheet["B2"].IntValue;
decimal price      = sheet["C2"].DecimalValue;
bool inStock       = sheet["D2"].BoolValue;

// Check for empty cells before processing
var statusCell = sheet["E2"];
if (statusCell.Value != null && statusCell.StringValue.Length > 0)
{
    Console.WriteLine($"Status: {statusCell.StringValue}");
}

// Row/column index access (zero-based)
var firstDataCell = sheet.Rows[1].Columns[0];
Console.WriteLine($"Product: {productName}, Qty: {quantity}, Price: {price:C}");
$vbLabelText   $csharpLabel

La mejor manera de leer un archivo de Excel en C# con IronXL: Imagen 2 - Salida de lectura simple de Excel con IronXL

La sintaxis sheet["A2"] utiliza la notación estándar de Excel. Las letras de las columnas no distinguen entre mayúsculas y minúsculas, y los números de fila comienzan en 1, lo que coincide con la forma en que Excel etiqueta las celdas. La documentación de lectura de valores de celda muestra accesores tipificados adicionales, incluido DateTimeValue para celdas formateadas como fechas.

Cuando una celda contiene un número almacenado como texto (un problema común de calidad de datos en hojas de cálculo exportadas), StringValue devuelve el texto tal como está, mientras que DecimalValue intenta un análisis y devuelve 0 en caso de error. Siempre valide los datos inesperados antes de tratarlos como un valor escrito en el código de producción.

Manejo de celdas de fecha y booleanas

Las celdas de fecha en Excel se almacenan internamente como números de serie. IronXL expone DateTimeValue para convertirlos en un objeto .NET DateTime sin aritmética manual. Para las celdas que contienen TRUE o FALSE, BoolValue devuelve el valor booleano correcto sin comparación de cadenas. Estos accesores tipificados eliminan una clase de errores de tipo de datos que aparecen comúnmente al leer hojas de cálculo a través de analizadores genéricos basados ​​en texto.

¿Cómo iterar a través de filas y celdas?

Para iterar a través de un conjunto de datos se requiere un rango o una colección de filas. IronXL admite ambos enfoques y puedes combinarlos para que coincidan con la forma de los datos.

using IronXL;

WorkBook workbook = WorkBook.Load("financial_report.xlsx");
WorkSheet sheet = workbook.WorkSheets[0];

// Iterate a cell range -- skips header row
foreach (var cell in sheet["A2:D100"])
{
    Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}

// Row-by-row with column access
for (int rowIndex = 1; rowIndex < sheet.RowCount; rowIndex++)
{
    var row = sheet.Rows[rowIndex];
    var values = new System.Text.StringBuilder();

    foreach (var cell in row)
    {
        if (cell.Value != null)
            values.Append($"{cell.StringValue}\t");
    }

    Console.WriteLine(values.ToString().TrimEnd());
}
using IronXL;

WorkBook workbook = WorkBook.Load("financial_report.xlsx");
WorkSheet sheet = workbook.WorkSheets[0];

// Iterate a cell range -- skips header row
foreach (var cell in sheet["A2:D100"])
{
    Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}

// Row-by-row with column access
for (int rowIndex = 1; rowIndex < sheet.RowCount; rowIndex++)
{
    var row = sheet.Rows[rowIndex];
    var values = new System.Text.StringBuilder();

    foreach (var cell in row)
    {
        if (cell.Value != null)
            values.Append($"{cell.StringValue}\t");
    }

    Console.WriteLine(values.ToString().TrimEnd());
}
$vbLabelText   $csharpLabel

La mejor manera de leer un archivo de Excel en C# con IronXL: Imagen 3 - Salida para iterar a través de filas

La cadena de rango "A2:D100" crea una colección de celdas planas. Las filas dentro del rango se procesan de arriba a abajo y de izquierda a derecha. Este patrón funciona bien para exportar a un List<t>, un DataTable o una base de datos.

La propiedad sheet.RowCount refleja la última fila utilizada en la hoja de cálculo, por lo que el bucle finaliza automáticamente cuando finalizan los datos. La guía de iteración de rangos de Excel cubre patrones de iteración adicionales, incluido el recorrido desde la columna primero.

Omitir filas de encabezado

La mayoría de las hojas de cálculo tienen una fila de encabezado que describe los nombres de las columnas en lugar de contener datos. Inicie la iteración del rango en la fila 2 (por ejemplo, "A2:D100") o comience el bucle de índice en rowIndex = 1 para omitir el encabezado. Si usa ToDataTable(true), IronXL maneja la detección de encabezado automáticamente y asigna los nombres de las columnas de la primera fila.

¿Cómo manejar múltiples formatos de Excel?

IronXL detecta automáticamente el formato del archivo a partir de la extensión y el encabezado del archivo. La API es idéntica para los archivos XLSX, XLS y CSV, lo que significa que el mismo código de análisis funciona en los tres formatos sin lógica condicional.

using IronXL;

// Load different formats with identical API
WorkBook xlsxBook = WorkBook.Load("Modern.xlsx");
WorkBook xlsBook  = WorkBook.Load("Legacy.xls");
WorkBook csvBook  = WorkBook.Load("Export.csv");

// Access worksheets identically across formats
WorkSheet sheet1 = xlsxBook.DefaultWorkSheet;
WorkSheet sheet2 = xlsBook.DefaultWorkSheet;
WorkSheet sheet3 = csvBook.DefaultWorkSheet;

// Cross-format conversion -- save XLSX as CSV, or CSV as XLSX
xlsxBook.SaveAs("converted_output.csv");
csvBook.SaveAs("structured_output.xlsx");

Console.WriteLine($"XLSX rows: {sheet1.RowCount}");
Console.WriteLine($"XLS rows:  {sheet2.RowCount}");
Console.WriteLine($"CSV rows:  {sheet3.RowCount}");
using IronXL;

// Load different formats with identical API
WorkBook xlsxBook = WorkBook.Load("Modern.xlsx");
WorkBook xlsBook  = WorkBook.Load("Legacy.xls");
WorkBook csvBook  = WorkBook.Load("Export.csv");

// Access worksheets identically across formats
WorkSheet sheet1 = xlsxBook.DefaultWorkSheet;
WorkSheet sheet2 = xlsBook.DefaultWorkSheet;
WorkSheet sheet3 = csvBook.DefaultWorkSheet;

// Cross-format conversion -- save XLSX as CSV, or CSV as XLSX
xlsxBook.SaveAs("converted_output.csv");
csvBook.SaveAs("structured_output.xlsx");

Console.WriteLine($"XLSX rows: {sheet1.RowCount}");
Console.WriteLine($"XLS rows:  {sheet2.RowCount}");
Console.WriteLine($"CSV rows:  {sheet3.RowCount}");
$vbLabelText   $csharpLabel

Para los archivos CSV, IronXL respeta las convenciones RFC 4180, incluidos los campos entre comillas que contienen comas, nuevas líneas dentro de valores entre comillas y comillas dobles escapadas. La guía de conversión de CSV a XLSX cubre la personalización de delimitadores para exportaciones CSV no estándar.

Cuando su aplicación debe aceptar archivos de sistemas externos, es una buena práctica inspeccionar la extensión del archivo y validar el contenido antes de cargarlo. IronXL lanza una excepción descriptiva si el archivo está dañado o tiene un formato no compatible, que puedes detectar y mostrarle al usuario.

¿Cómo ejecutar consultas avanzadas en datos de Excel?

Más allá de la lectura celda por celda, IronXL expone funciones agregadas y compatibilidad LINQ que convierten un rango de una hoja de cálculo en una colección consultable.

using IronXL;
using System.Linq;

WorkBook workbook = WorkBook.Load("Financials.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;

// Built-in aggregates -- no manual looping needed
decimal totalSales = sheet["B2:B50"].Sum();
decimal maxRevenue = sheet["C2:C50"].Max(c => c.DecimalValue);
decimal avgMargin  = sheet["D2:D50"].Avg();

// LINQ filtering directly on a range
var highValueRows = sheet["C2:C50"]
    .Where(c => c.DecimalValue > 1000)
    .Select(c => new { c.AddressString, c.DecimalValue });

foreach (var row in highValueRows)
    Console.WriteLine($"Alto value at {row.AddressString}: {row.DecimalValue:C}");

// Write a calculated result back to the sheet
sheet["E2"].Value = totalSales;
workbook.SaveAs("Financials_Updated.xlsx");

Console.WriteLine($"Total: {totalSales:C}, Max: {maxRevenue:C}, Avg: {avgMargin:C}");
using IronXL;
using System.Linq;

WorkBook workbook = WorkBook.Load("Financials.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;

// Built-in aggregates -- no manual looping needed
decimal totalSales = sheet["B2:B50"].Sum();
decimal maxRevenue = sheet["C2:C50"].Max(c => c.DecimalValue);
decimal avgMargin  = sheet["D2:D50"].Avg();

// LINQ filtering directly on a range
var highValueRows = sheet["C2:C50"]
    .Where(c => c.DecimalValue > 1000)
    .Select(c => new { c.AddressString, c.DecimalValue });

foreach (var row in highValueRows)
    Console.WriteLine($"Alto value at {row.AddressString}: {row.DecimalValue:C}");

// Write a calculated result back to the sheet
sheet["E2"].Value = totalSales;
workbook.SaveAs("Financials_Updated.xlsx");

Console.WriteLine($"Total: {totalSales:C}, Max: {maxRevenue:C}, Avg: {avgMargin:C}");
$vbLabelText   $csharpLabel

La mejor manera de leer un archivo de Excel en C# con IronXL: Imagen 4 - Salida de la consola de operaciones de lectura avanzada

La compatibilidad con LINQ es útil cuando necesita filtrar filas antes de importarlas a una base de datos o validar que todos los valores de una columna cumplan con un umbral. La biblioteca evalúa fórmulas antes de que se ejecute LINQ, por lo que las consultas agregadas siempre operan en valores calculados finales en lugar de cadenas de fórmulas.

El tutorial de LINQ con IronXL cubre la unión de hojas de trabajo, la agrupación por columnas y la proyección de resultados en objetos fuertemente tipados: patrones que eliminan una gran cantidad de código repetitivo en el código de canalización de datos.

¿Cómo exportar datos de Excel a una DataTable?

Muchas aplicaciones .NET cargan datos de hojas de cálculo en un ADO.NET DataTable para su posterior procesamiento o inserción en una base de datos. IronXL proporciona un método de conversión directa que elimina la necesidad de mapeo manual de columnas.

using IronXL;
using System.Data;

WorkBook workbook = WorkBook.Load("SalesData.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;

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

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

// Iterate the DataTable normally
foreach (DataRow row in dataTable.Rows)
{
    Console.WriteLine($"{row["ProductName"]} -- {row["Quantity"]} -- {row["Price"]}");
}
using IronXL;
using System.Data;

WorkBook workbook = WorkBook.Load("SalesData.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;

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

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

// Iterate the DataTable normally
foreach (DataRow row in dataTable.Rows)
{
    Console.WriteLine($"{row["ProductName"]} -- {row["Quantity"]} -- {row["Price"]}");
}
$vbLabelText   $csharpLabel

Al pasar true a ToDataTable se trata la primera fila de la hoja de cálculo como encabezados de columna. El DataTable resultante utiliza nombres de columnas de cadena que coinciden con el texto del encabezado, lo que hace que las consultas LINQ-to-DataSet posteriores sean legibles. La documentación de exportación de DataTable cubre las opciones de manejo de valores nulos e inferencia de tipos.

Este patrón es particularmente útil cuando el código descendente ya espera un DataTable, por ejemplo, al llamar a SqlBulkCopy para insertar filas en SQL Server. Puede cargar el archivo XLSX, convertirlo a un DataTable e insertarlo en masa sin escribir ningún código repetitivo de mapeo de columnas.

Referencia de la API de lectura del núcleo de IronXL
Operación API Devoluciones
Cargar archivo `WorkBook.Load(path)` `WorkBook`
Obtener la hoja de trabajo por índice `workbook.WorkSheets[0]` `WorkSheet`
Obtener hoja de trabajo por nombre `workbook.GetWorkSheet("name")` `WorkSheet`
Leer celda de cadena `sheet["A1"].StringValue` `cadena`
Leer celda decimal `sheet["B1"].DecimalValue` `decimal`
Iterar rango `foreach cell in sheet["A2:D100"]` `IEnumerable`
Sumar un rango `sheet["B2:B50"].Sum()` `decimal`
Exportar a DataTable `sheet.ToDataTable(true)` `DataTable`

Para obtener una lista completa de API, consulte la referencia de API de IronXL . La referencia cubre cada propiedad y método con descripciones de parámetros y detalles del tipo de retorno.

¿Cuales son tus próximos pasos?

Leer archivos de Excel en C# es sencillo una vez que tienes la biblioteca adecuada. IronXL elimina la dependencia de Office, simplifica la superficie de la API y maneja los formatos XLSX, XLS y CSV con la misma ruta de código. Los patrones que se tratan aquí (cargar un libro de trabajo, leer valores de celdas tipificados, iterar rangos, ejecutar agregados y exportar a un DataTable) cubren la mayoría de los requisitos de lectura de hojas de cálculo del mundo real.

Para continuar desarrollando estos patrones:

Para los equipos que evalúan IronXL frente a otras bibliotecas, la comparación IronXL vs EPPlus y la comparación IronXL vs NPOI cubren puntos de referencia de rendimiento y diferencias de API. Ambas comparaciones incluyen ejemplos de código para operaciones equivalentes en cada biblioteca.

La especificación del formato de archivo Excel de Microsoft es una referencia útil si encuentra estructuras de hojas de cálculo inusuales en sistemas heredados. El estándar ECMA-376 define el formato OOXML que siguen los archivos XLSX.

Comience con una licencia de prueba gratuita de IronXL para probar la API completa en su propio proyecto antes de comprometerse con una licencia de producción.

Preguntas Frecuentes

¿Cuál es la mejor manera de leer archivos Excel en C#?

La mejor manera de leer archivos de Excel en C# es usar una biblioteca dedicada e independiente de Office, como IronXL. Esta biblioteca admite los formatos XLSX, XLS y CSV sin necesidad de Microsoft Excel ni interoperabilidad COM, lo que la hace segura para entornos de servidor y contenedor.

¿Necesita tener instalado Microsoft Office para utilizar IronXL?

No. IronXL es una biblioteca .NET independiente que se distribuye como paquete NuGet . No requiere Microsoft Office, Excel ni ningún componente COM en el equipo.

¿Qué formatos de archivos de Excel admite IronXL ?

IronXL lee y escribe archivos XLSX, XLS y CSV. La detección de formato es automática según la extensión del archivo y el encabezado del contenido.

¿Cómo instalar IronXL en un proyecto .NET ?

Ejecute 'dotnet add package IronXl.Excel' en la terminal o ' Install-Package IronXl.Excel' en la consola del Administrador de paquetes de Visual Studio.

¿Puede IronXL exportar datos de Excel a una DataTable?

Sí. El método WorkSheet.ToDataTable(true) convierte cualquier hoja de cálculo en una DataTable ADO .NET , y la primera fila se utiliza como encabezado de columna cuando se pasa verdadero.

¿ IronXL admite consultas LINQ en datos de Excel?

Sí. Los rangos de celdas de IronXL implementan IEnumerable, por lo que puede usar métodos LINQ como Where, Select, Sum, Max y Avg directamente en los rangos de la hoja de cálculo.

¿Cómo maneja IronXL las fórmulas de Excel?

IronXL evalúa las fórmulas automáticamente al leer el valor de una celda. Al leer sheet["B10"].DecimalValue en una celda de fórmula, se devuelve el resultado calculado, no la cadena de la fórmula.

¿Qué versiones de .NET admite IronXL ?

IronXL es compatible con .NET 10, .NET 8, .NET 6, .NET Framework 4.6.2 y .NET Standard 2.0.

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