Leer XLSX del Banco de España y SII con IronXL en C# (alternativa StreamReader)
Muchos desarrolladores de C# se enfrentan a un problema habitual al intentar leer archivos de hojas de Excel: su fiel StreamReader, que funciona a la perfección con archivos de texto, falla misteriosamente con los documentos de Excel. Si has intentado leer un archivo de Excel utilizando StreamReader en C# y solo has visto caracteres ilegibles o excepciones, no eres el único. Este tutorial explica por qué StreamReader no puede gestionar archivos de Excel directamente y muestra la solución adecuada utilizando IronXL sin Excel Interop.
A menudo surge la confusión porque los archivos CSV, que Excel puede abrir, funcionan bien con StreamReader. Sin embargo, los verdaderos archivos de Excel (XLSX, XLS) requieren un enfoque fundamentalmente diferente. Entender esta distinción te ahorrará horas de depuración y te llevará a la herramienta adecuada para el trabajo.
En el ámbito de la administración tributaria española, esta distinción resulta especialmente relevante: los organismos como la AEAT y el Banco de España distribuyen ficheros de datos regulatorios tanto en formato XLSX como en CSV. Mientras que los CSV del Modelo 347 o del Modelo 390 pueden procesarse con StreamReader, los informes y plantillas regulatorias en XLSX — habituales en las comunicaciones del Banco de España y la CNMV — requieren necesariamente una biblioteca especializada como IronXL para su lectura e ingesta correcta en aplicaciones .NET.

¿Por qué StreamReader no puede leer archivos de Excel?
StreamReader está diseñado para archivos de texto sin formato, leyendo datos de caracteres línea por línea utilizando una codificación especificada. Los archivos Excel, a pesar de su apariencia de hoja de cálculo, son en realidad estructuras XML binarias o comprimidas en ZIP complejas que StreamReader no puede interpretar.
static void Main(string[] args)
{
// This code will NOT work - demonstrates the problem
using (StreamReader reader = new StreamReader("ProductData.xlsx"))
{
string content = reader.ReadLine(); // read data
Console.WriteLine(content); // Outputs garbled binary data
}
}
static void Main(string[] args)
{
// This code will NOT work - demonstrates the problem
using (StreamReader reader = new StreamReader("ProductData.xlsx"))
{
string content = reader.ReadLine(); // read data
Console.WriteLine(content); // Outputs garbled binary data
}
}
Option Strict On
Imports System.IO
Module Program
Sub Main(args As String())
' This code will NOT work - demonstrates the problem
Using reader As New StreamReader("ProductData.xlsx")
Dim content As String = reader.ReadLine() ' read data
Console.WriteLine(content) ' Outputs garbled binary data
End Using
End Sub
End Module
Cuando ejecutas este fragmento de código de la clase Program, en lugar de ver tus datos de la hoja de cálculo, te encontrarás con datos binarios desconocidos, como "PK♥♦" o caracteres similares del sistema. Esto sucede porque los archivos XLSX son archivos ZIP que contienen múltiples archivos XML, mientras que los archivos XLS utilizan un formato binario propietario. StreamReader espera texto sin formato e intenta interpretar estas estructuras complejas como caracteres, lo que da lugar a un resultado sin sentido.
Entrada de muestra

Resultado

Los archivos modernos de Excel (XLSX) contienen múltiples componentes: hojas de trabajo, estilos, cadenas compartidas y relaciones, todos empaquetados juntos. Esta complejidad requiere bibliotecas especializadas que entiendan la estructura del archivo Excel, lo que nos lleva a IronXL.
¿Cómo leer archivos de Excel con IronXL?
IronXL ofrece una solución sencilla para leer archivos de Excel en C#. A diferencia de StreamReader, IronXL comprende la estructura interna de Excel y ofrece métodos intuitivos para acceder a tus datos. La biblioteca es compatible con Windows, Linux, macOS y contenedores Docker, lo que la hace ideal para aplicaciones modernas multiplataforma.

Primero, instala IronXL a través del Administrador de Paquetes NuGet:
Install-Package IronXL.Excel

Aquí tienes cómo leer un archivo de Excel correctamente:
using IronXL;
// Load the Excel file
WorkBook workbook = WorkBook.Load("sample.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
// Read specific cell values
string cellValue = worksheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");
// Read a range of cells
foreach (var cell in worksheet["A1:C5"])
{
Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}
using IronXL;
// Load the Excel file
WorkBook workbook = WorkBook.Load("sample.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
// Read specific cell values
string cellValue = worksheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");
// Read a range of cells
foreach (var cell in worksheet["A1:C5"])
{
Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}
Imports IronXL
' Load the Excel file
Dim workbook As WorkBook = WorkBook.Load("sample.xlsx")
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
' Read specific cell values
Dim cellValue As String = worksheet("A1").StringValue
Console.WriteLine($"Cell A1 contains: {cellValue}")
' Read a range of cells
For Each cell In worksheet("A1:C5")
Console.WriteLine($"{cell.AddressString}: {cell.Text}")
Next
Este código carga con éxito tu archivo de Excel y proporciona acceso limpio a los valores de las celdas. El método WorkBook.Load detecta automáticamente el formato de archivo (XLSX, XLS, XLSM, CSV) y gestiona internamente todo el análisis sintáctico complejo. Puedes acceder a las celdas usando la notación familiar de Excel como "A1" o rangos como "A1:C5", haciendo que el código sea intuitivo para cualquiera familiarizado con Excel.
¿Cómo leer Excel desde flujos de memoria?
Las aplicaciones del mundo real a menudo necesitan procesar archivos de Excel desde flujos en lugar de archivos de disco. Los escenarios comunes incluyen manejar cargas web, recuperar archivos de bases de datos o procesar datos desde almacenamiento en la nube. IronXL maneja estas situaciones elegantemente:
using IronXL;
using System.IO;
// Read Excel from a memory stream
byte[] fileBytes = File.ReadAllBytes("ProductData.xlsx");
using (MemoryStream stream = new MemoryStream(fileBytes))
{
WorkBook workbook = WorkBook.FromStream(stream);
WorkSheet worksheet = workbook.DefaultWorkSheet;
// Process the data
int rowCount = worksheet.RowCount;
Console.WriteLine($"The worksheet has {rowCount} rows");
// Read all data into a new DataTable, return dt
var dataTable = worksheet.ToDataTable(false);
// Return DataTable row count
Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");
}
using IronXL;
using System.IO;
// Read Excel from a memory stream
byte[] fileBytes = File.ReadAllBytes("ProductData.xlsx");
using (MemoryStream stream = new MemoryStream(fileBytes))
{
WorkBook workbook = WorkBook.FromStream(stream);
WorkSheet worksheet = workbook.DefaultWorkSheet;
// Process the data
int rowCount = worksheet.RowCount;
Console.WriteLine($"The worksheet has {rowCount} rows");
// Read all data into a new DataTable, return dt
var dataTable = worksheet.ToDataTable(false);
// Return DataTable row count
Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");
}
Imports IronXL
Imports System.IO
' Read Excel from a memory stream
Dim fileBytes As Byte() = File.ReadAllBytes("ProductData.xlsx")
Using stream As New MemoryStream(fileBytes)
Dim workbook As WorkBook = WorkBook.FromStream(stream)
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
' Process the data
Dim rowCount As Integer = worksheet.RowCount
Console.WriteLine($"The worksheet has {rowCount} rows")
' Read all data into a new DataTable, return dt
Dim dataTable = worksheet.ToDataTable(False)
' Return DataTable row count
Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows")
End Using
El método WorkBook.FromStream acepta cualquier tipo de flujo, ya sea un MemoryStream, un FileStream o un flujo de red. Esta flexibilidad te permite procesar archivos de Excel desde varias fuentes sin guardarlos primero en el disco. El ejemplo también demuestra convertir datos de hojas de trabajo a un DataTable, lo cual se integra perfectamente con bases de datos y escenarios de vinculación de datos.
Ingesta de ficheros XLSX del Banco de España mediante streaming
Los ficheros de datos publicados por el Banco de España — como las estadísticas de tipos de interés, balances bancarios o ficheros de referencia del sistema financiero — se distribuyen frecuentemente en formato XLSX y pueden alcanzar tamaños considerables. El procesamiento mediante MemoryStream con IronXL permite ingestar estos ficheros directamente desde los endpoints de descarga del Banco de España sin necesidad de persistirlos en disco, respetando así los principios de minimización de datos de la LOPDGDD:
using IronXL;
using System.IO;
using System.Net.Http;
// Descargar el fichero XLSX del Banco de España directamente a memoria
using var httpClient = new HttpClient();
byte[] xlsxBytes = await httpClient.GetByteArrayAsync(
"https://www.bde.es/f/webbde/SES/Secciones/Publicaciones/datos_estadisticos.xlsx");
using MemoryStream bdeStream = new MemoryStream(xlsxBytes);
WorkBook bdeWorkbook = WorkBook.FromStream(bdeStream);
WorkSheet bdeSheet = bdeWorkbook.DefaultWorkSheet;
Console.WriteLine($"Filas de datos BdE: {bdeSheet.RowCount}");
// Procesar y transformar datos para el sistema interno
var bdeDataTable = bdeSheet.ToDataTable(useHeaderRow: true);
// ... pipeline de transformación y carga
using IronXL;
using System.IO;
using System.Net.Http;
// Descargar el fichero XLSX del Banco de España directamente a memoria
using var httpClient = new HttpClient();
byte[] xlsxBytes = await httpClient.GetByteArrayAsync(
"https://www.bde.es/f/webbde/SES/Secciones/Publicaciones/datos_estadisticos.xlsx");
using MemoryStream bdeStream = new MemoryStream(xlsxBytes);
WorkBook bdeWorkbook = WorkBook.FromStream(bdeStream);
WorkSheet bdeSheet = bdeWorkbook.DefaultWorkSheet;
Console.WriteLine($"Filas de datos BdE: {bdeSheet.RowCount}");
// Procesar y transformar datos para el sistema interno
var bdeDataTable = bdeSheet.ToDataTable(useHeaderRow: true);
// ... pipeline de transformación y carga
Imports IronXL
Imports System.IO
Imports System.Net.Http
' Descargar el fichero XLSX del Banco de España directamente a memoria
Dim httpClient As New HttpClient()
Dim xlsxBytes As Byte() = Await httpClient.GetByteArrayAsync("https://www.bde.es/f/webbde/SES/Secciones/Publicaciones/datos_estadisticos.xlsx")
Using bdeStream As New MemoryStream(xlsxBytes)
Dim bdeWorkbook As WorkBook = WorkBook.FromStream(bdeStream)
Dim bdeSheet As WorkSheet = bdeWorkbook.DefaultWorkSheet
Console.WriteLine($"Filas de datos BdE: {bdeSheet.RowCount}")
' Procesar y transformar datos para el sistema interno
Dim bdeDataTable = bdeSheet.ToDataTable(useHeaderRow:=True)
' ... pipeline de transformación y carga
End Using
Este enfoque de streaming resulta igualmente aplicable para los ficheros XLSX remitidos por la CNMV a través de su portal de datos o para los datasets del SII generados por los sistemas de facturación antes de su transformación a XML para la AEAT.
Resultado

¿Cuándo utilizar el objeto remitente para leer datos?
En los casos en que este código se utilice dentro de la programación basada en eventos (por ejemplo, al gestionar un botón de carga de archivos en Windows Forms o ASP.NET), la firma del método suele incluir parámetros como object sender y EventArgs e. Este contexto asegura que la lógica de procesamiento de Excel se vincule correctamente a eventos de UI o servicios.

¿Cómo convertir entre Excel y CSV?
Aunque StreamReader puede gestionar archivos CSV, a menudo es necesario convertir entre los formatos Excel y CSV. IronXL hace que esta conversión sea sencilla:
using IronXL;
// Load an Excel file and save as CSV
WorkBook workbook = WorkBook.Load("data.xlsx");
workbook.SaveAsCsv("output.csv");
// Load a CSV file and save as Excel
WorkBook csvWorkbook = WorkBook.LoadCSV("input.csv");
csvWorkbook.SaveAs("output.xlsx");
// Export specific worksheet to CSV
WorkSheet worksheet = workbook.WorkSheets[0];
worksheet.SaveAsCsv("worksheet1.csv");
using IronXL;
// Load an Excel file and save as CSV
WorkBook workbook = WorkBook.Load("data.xlsx");
workbook.SaveAsCsv("output.csv");
// Load a CSV file and save as Excel
WorkBook csvWorkbook = WorkBook.LoadCSV("input.csv");
csvWorkbook.SaveAs("output.xlsx");
// Export specific worksheet to CSV
WorkSheet worksheet = workbook.WorkSheets[0];
worksheet.SaveAsCsv("worksheet1.csv");
Imports IronXL
' Load an Excel file and save as CSV
Dim workbook As WorkBook = WorkBook.Load("data.xlsx")
workbook.SaveAsCsv("output.csv")
' Load a CSV file and save as Excel
Dim csvWorkbook As WorkBook = WorkBook.LoadCSV("input.csv")
csvWorkbook.SaveAs("output.xlsx")
' Export specific worksheet to CSV
Dim worksheet As WorkSheet = workbook.WorkSheets(0)
worksheet.SaveAsCsv("worksheet1.csv")
Estas conversiones preservan tus datos mientras cambian el formato de archivo. Al convertir Excel a CSV, IronXL aplana la primera hoja de trabajo por defecto, pero puedes especificar qué hoja de trabajo exportar. Convertir de CSV a Excel crea una hoja de cálculo correctamente formateada que preserva los tipos de datos y permite futuras adiciones de formato y fórmulas.
Conclusión
La incapacidad de StreamReader para procesar archivos de Excel se debe a la diferencia fundamental entre el texto sin formato y la compleja estructura de archivos de Excel. Aunque StreamReader funciona perfectamente con CSV y otros formatos de texto, los archivos Excel auténticos requieren una biblioteca especializada como IronXL que comprenda las estructuras binarias y XML que contienen.
IronXL proporciona una solución elegante con su API intuitiva, soporte completo de formatos y capacidades de procesamiento de flujos sin problemas. Ya sea que estés construyendo aplicaciones web, software de escritorio o servicios en la nube, IronXL maneja los archivos de Excel de manera confiable en todas las plataformas.
Para los equipos de desarrollo que trabajan en España con ficheros regulatorios del Banco de España, la CNMV, la AEAT o los sistemas SII y TicketBAI, IronXL ofrece la solución más directa para la ingesta de XLSX mediante streaming sin instalación de Microsoft Office. La compatibilidad con la LOPDGDD se facilita al no requerir persistencia de datos en disco durante el procesamiento de streaming, y la solidez de la biblioteca ante ficheros XLSX de gran tamaño la hace adecuada para los volúmenes de datos habituales en los informes regulatorios españoles.

¿Listo para empezar a trabajar con archivos de Excel correctamente? Descargue la versión de prueba gratuita de IronXL y experimente el procesamiento de Excel sin complicaciones en sus aplicaciones de C#. Para implementaciones de producción, considere las opciones de licencia de IronXL que mejor se adapten a las necesidades de su proyecto.
Preguntas Frecuentes
¿Por qué no puedo utilizar StreamReader para leer archivos Excel en C#?
StreamReader está diseñado para leer archivos de texto y no es compatible con el formato binario ZIP de los archivos XLSX, lo que da lugar a caracteres ilegibles o excepciones. Los ficheros regulatorios del Banco de España, la CNMV y el SII/AEAT en formato XLSX requieren necesariamente una biblioteca especializada como IronXL.
¿Cuál es la forma recomendada de leer ficheros XLSX regulatorios del Banco de España y la CNMV en C#?
La forma recomendada es utilizar IronXL con WorkBook.FromStream(), que permite ingestar ficheros XLSX directamente desde MemoryStream sin persistirlos en disco, cumpliendo con los principios de minimización de datos de la LOPDGDD cuando los ficheros contienen datos personales.
¿Cuáles son las ventajas de utilizar IronXL en lugar de StreamReader para ficheros Excel regulatorios?
IronXL comprende la estructura interna de los ficheros XLSX (ZIP + XML), permite acceder a hojas, celdas y rangos con notación estándar de Excel, y soporta streaming mediante MemoryStream para no persistir en disco datos personales de terceros (cumplimiento LOPDGDD). Admite además los formatos XLSX, XLS y XLSM habituales en los informes del Banco de España y la CNMV.
¿Necesito Excel Interop para usar IronXL?
No, IronXL funciona independientemente de Excel Interop, lo que le permite procesar ficheros XLSX regulatorios del Banco de España, CNMV y SII/AEAT en servidores Linux o contenedores Docker sin Microsoft Excel instalado.
¿Puede IronXL procesar grandes ficheros XLSX del SII o del Banco de España mediante streaming?
Sí, WorkBook.FromStream() acepta cualquier Stream (MemoryStream, FileStream, flujo de red) y maneja ficheros de gran tamaño de forma eficiente. Esto es especialmente valioso para los datasets del Banco de España o los libros de facturas del SII/AEAT, que pueden contener miles de registros.
¿Cómo garantiza el streaming con IronXL el cumplimiento de la LOPDGDD?
Al procesar ficheros XLSX mediante MemoryStream con IronXL, los datos nunca se persisten en ficheros temporales en disco sin controles de acceso, cumpliendo el principio de minimización y seguridad del tratamiento de la LOPDGDD para datos personales de clientes, proveedores o posiciones financieras.
¿Cómo se compara IronXL con otras bibliotecas de C# para la manipulación de Excel?
IronXL ofrece una API fácil de usar, soporte completo para las funciones de Excel y no requiere que Excel esté instalado, lo que lo convierte en una opción sólida en comparación con otras bibliotecas, especialmente para el procesamiento de ficheros regulatorios españoles del Banco de España, la CNMV y la AEAT.



