Leer un archivo de Excel en C# es una tarea común para informes, importaciones de datos y automatización. Con Free Spire.XLS for .NET, una edición comunitaria gratuita, puede cargar un libro de Excel y leer sus datos sin instalar Microsoft Excel en la máquina y sin usar Interop. Este artículo muestra cómo leer celdas, hojas de cálculo y filas, exportar una hoja de cálculo a un DataTable y manejar resultados de fórmulas.
Inicio rápido: Leer un archivo de Excel en C#
Instale Free Spire.XLS for .NET desde NuGet. Ejecute este comando en una terminal:
dotnet add package FreeSpire.XLS
O ejecute este comando en la consola del Administrador de paquetes NuGet:
Install-Package FreeSpire.XLS
También puede descargar Free Spire.XLS for .NET y hacer referencia a la DLL manualmente, o encontrar el paquete en NuGet.
El siguiente ejemplo carga un archivo de Excel, obtiene la primera hoja de cálculo e imprime el valor de la celda A1. Reemplace input.xlsx con la ruta completa a su archivo, o asegúrese de que el archivo esté en el directorio de trabajo actual del programa.
using System;
using Spire.Xls;
class Program
{
static void Main()
{
Workbook workbook = new Workbook();
try
{
// Load an existing Excel file
workbook.LoadFromFile("input.xlsx");
// Get the first worksheet
Worksheet sheet = workbook.Worksheets[0];
// Read the value of cell A1 (row 1, column 1)
string value = sheet.Range[1, 1].Value;
Console.WriteLine("Cell A1: " + value);
}
finally
{
workbook.Dispose();
}
}
}
Workbook.LoadFromFile() lee el archivo en memoria. Worksheets[0] devuelve la primera hoja de cálculo, y Range[1, 1].Value devuelve el valor de texto de la celda en la primera fila y la primera columna. El bloque finally libera los recursos del libro cuando haya terminado.

Leer una celda u hoja de cálculo específica
Los siguientes ejemplos asumen que workbook ya se ha cargado con LoadFromFile(). Muestran cómo acceder a una hoja de cálculo por índice o nombre.
Un archivo de Excel puede contener varias hojas de cálculo. Puede obtener una hoja de cálculo por su posición o por su nombre:
// By index (zero-based): the first sheet is 0, the second is 1
Worksheet first = workbook.Worksheets[0];
// By name
Worksheet sales = workbook.Worksheets["Sales"];
También puede leer una celda por sus números de fila y columna, o por su dirección de Excel:
// By row and column numbers (one-based): row 2, column 3
string byIndex = sales.Range[2, 3].Value;
// By Excel address
string byAddress = sales.Range["C2"].Value;
Tenga en cuenta los dos puntos de inicio diferentes. La colección de hojas de cálculo está basada en cero, por lo que la primera hoja de cálculo es Worksheets[0]. Los números de fila y columna de las celdas están basados en uno, por lo que Range[1, 1] es la celda A1.
Para leer un bloque de celdas, pase una dirección de rango y recórralo:
CellRange range = sales.Range["A1:C3"];
foreach (CellRange cell in range.CellList)
{
Console.WriteLine({BODY_CONTENT}quot;{cell.RangeAddress}: {cell.Value}");
}
Leer datos de Excel fila por fila en C#
Para leer todos los datos de una hoja de cálculo, recorra las filas con un bucle externo y las columnas con un bucle interno. Escriba un salto de línea después de cada fila para que la salida de la consola conserve la estructura de la hoja de cálculo:
using System;
using Spire.Xls;
class Program
{
static void Main()
{
Workbook workbook = new Workbook();
try
{
workbook.LoadFromFile("input.xlsx");
Worksheet sheet = workbook.Worksheets[0];
for (int row = 1; row <= sheet.LastDataRow; row++)
{
for (int col = 1; col <= sheet.LastDataColumn; col++)
{
Console.Write({BODY_CONTENT}quot;{sheet.Range[row, col].Value}\t");
}
Console.WriteLine();
}
}
finally
{
workbook.Dispose();
}
}
}
Los bucles van desde la fila 1 y la columna 1 hasta LastDataRow y LastDataColumn, que devuelven la última fila y columna que contienen datos. Esto evita incluir celdas con formato pero vacías que LastRow y LastColumn cubrirían. Si su hoja de cálculo tiene un diseño inusual, verifique el rango real en su archivo de prueba antes de procesar la salida.
Para una hoja de cálculo que contiene los datos de ejemplo a continuación:
| Producto | Categoría | Precio |
|---|---|---|
| Teclado | Accesorios | 25 |
| Monitor | Pantallas | 180 |
la consola muestra cada fila de la hoja de cálculo en su propia línea, con los valores de celda separados por tabulaciones:
Product Category Price
Keyboard Accessories 25
Monitor Displays 180

Leer datos de Excel en un DataTable
Si desea procesar datos de una hoja de cálculo con ADO.NET, enlazarlos a un control o insertarlos en una base de datos, exporte la hoja de cálculo a un DataTable con ExportDataTable():
using System;
using System.Data;
using Spire.Xls;
class Program
{
static void Main()
{
Workbook workbook = new Workbook();
try
{
workbook.LoadFromFile("input.xlsx");
// Recalculate formulas before exporting computed values
workbook.CalculateAllValue();
Worksheet sheet = workbook.Worksheets[0];
DataTable dataTable = sheet.ExportDataTable(
sheet.AllocatedRange,
true, // exportColumnNames
true // computedFormulaValue
);
// Print each row to verify the exported data
foreach (DataRow row in dataTable.Rows)
{
Console.WriteLine(string.Join("\t", row.ItemArray));
}
}
finally
{
workbook.Dispose();
}
}
}
Esta sobrecarga toma tres parámetros:
-
range: el rango de celdas que se va a exportar.
sheet.AllocatedRangedevuelve el rango usado de la hoja de cálculo. Según el formato y la configuración de rango usado del libro, puede incluir celdas vacías. Si solo necesita una región de datos específica, use un rango explícito y verifique sus límites. -
exportColumnNames: cuando es
true, la primera fila del rango se convierte en los nombres de columna delDataTable. Cuando esfalse, la primera fila se exporta como datos normales. -
computedFormulaValue: cuando es
true, el exportador usa valores de fórmula calculados en lugar del texto de la fórmula. Cuando esfalse, las celdas de fórmula se exportan como su texto de fórmula. Si sus datos contienen fórmulas, verifique los valores exportados en su propio archivo de prueba; es posible que sea necesario activar el cálculo de fórmulas antes de exportar para que los resultados se rellenen correctamente.
Para mostrar el resultado en una aplicación de Windows Forms, asigne la tabla a un DataGridView:
dataGridView1.DataSource = dataTable;
Verifique los nombres de columna y los tipos de datos de la tabla exportada con su propio archivo de Excel antes de confiar en ellos en procesamientos posteriores. Para obtener más opciones, como exportar un rango específico, consulte el tutorial detallado sobre convertir Excel a DataTable en C#.

Leer resultados de fórmulas y manejar valores de celdas
Los fragmentos de esta sección asumen que sheet hace referencia a una hoja de cálculo de un libro cargado, como en los ejemplos anteriores.
Una celda que contiene una fórmula tiene dos cosas que quizás desee leer: la fórmula en sí y el resultado que produce. Use HasFormula para comprobar si una celda contiene una fórmula, Formula para obtener el texto de la fórmula y FormulaValue para obtener el resultado calculado. Si necesita resultados de fórmula actualizados, llame a workbook.CalculateAllValue() después de cargar el libro y antes de leer FormulaValue.
CellRange cell = sheet.Range["D2"];
if (cell.HasFormula)
{
Console.WriteLine("Formula: " + cell.Formula);
Console.WriteLine("Result: " + cell.FormulaValue);
}
else
{
Console.WriteLine("Value: " + cell.Value);
}
Para obtener más información sobre cómo trabajar con fórmulas, consulte Agregar o leer fórmulas y funciones en Excel.

Las celdas con diferentes tipos de contenido se pueden leer a través de propiedades con tipo:
CellRange priceCell = sheet.Range["C2"];
CellRange dateCell = sheet.Range["E2"];
double price = priceCell.NumberValue; // numeric value
DateTime date = dateCell.DateTimeValue; // date value
string text = sheet.Range["A2"].Text; // text as displayed
Excel almacena números y fechas de diferentes maneras que el texto sin formato, así que elija la propiedad que coincida con el tipo de datos de la celda.
Leer formatos de número y valores mostrados
Para celdas con formatos de número —porcentajes, moneda, fechas—, el valor almacenado, el código de formato y el texto con formato pueden ser diferentes. Una celda que almacena 0.15 con un formato de porcentaje se muestra como 15%. Use Value para el valor sin formato, NumberFormat para el código de formato y NumberText para el texto tal como aparece en Excel:
| Propiedad | Qué devuelve |
|---|---|
Value |
El valor sin formato de la celda |
NumberFormat |
El código de formato de número (p. ej., 0.00%) |
NumberText |
El texto después de aplicar el formato (p. ej., 15%) |
CellRange cell = sheet.Range["C2"];
Console.WriteLine("Value: " + cell.Value);
Console.WriteLine("Number format: " + cell.NumberFormat);
Console.WriteLine("Formatted text: " + cell.NumberText);
Elija la propiedad que coincida con lo que necesita su lógica posterior: el valor numérico para cálculos o el texto con formato para mostrar. Para obtener más información sobre formatos de número, consulte Establecer formato de número en Excel.
Antes de leer una celda, puede comprobar si está vacía:
if (string.IsNullOrEmpty(sheet.Range["B5"].Value))
{
Console.WriteLine("B5 is empty.");
}
Preguntas frecuentes
¿Puedo leer archivos de Excel en C# sin instalar Microsoft Excel?
Sí. Free Spire.XLS lee archivos de Excel directamente y no requiere Microsoft Excel ni Interop en el equipo o servidor que ejecuta su código.
¿Cómo leo los resultados de fórmulas en lugar de las fórmulas?
Para una sola celda, compruebe CellRange.HasFormula y lea CellRange.FormulaValue. Para leer una hoja de cálculo completa, llame a ExportDataTable() con computedFormulaValue establecido en true. Consulte Leer resultados de fórmulas y manejar valores de celdas.
¿Puedo leer archivos de Excel protegidos con contraseña?
Sí. Establezca la contraseña de apertura antes de cargar el archivo:
Workbook workbook = new Workbook();
workbook.OpenPassword = "your-password";
workbook.LoadFromFile("protected.xlsx");
¿Qué formatos de archivo de Excel admite Free Spire.XLS?
Free Spire.XLS admite los formatos .xls, .xlsx y .xlsm.
¿Cuáles son las limitaciones de la edición gratuita?
Free Spire.XLS for .NET es una edición comunitaria para desarrolladores personales y proyectos pequeños. Cuando se trabaja con el formato .xls, cada libro está limitado a 5 hojas de cálculo y 200 filas por hoja. Cargar y guardar archivos .xlsx no está sujeto a estos límites. Para mayor capacidad o funciones avanzadas, Spire.XLS for .NET está disponible como edición comercial.
Si necesita mayor capacidad o funciones avanzadas, Spire.XLS for .NET es la edición comercial: puede solicitar una licencia de prueba gratuita de 30 días para evaluarla.