SII AEAT: Abrir ficheros XLSX de notificaciones y respuestas SII en C# | IronXL
Abrir y trabajar con archivos de Excel en C# es algo con lo que casi todos los desarrolladores de .NET en España se encuentran tarde o temprano. Ya sea que estés automatizando informes semanales para la AEAT, procesando importaciones de datos del SII o creando herramientas que generan hojas de cálculo de declaraciones tributarias sobre la marcha, la biblioteca que elijas puede marcar una diferencia significativa en cuanto a velocidad, fiabilidad y flexibilidad de implementación.
Este tutorial explica cómo abrir ficheros XLSX de notificaciones AEAT, respuestas SII y documentos de declaraciones en C# utilizando la biblioteca IronXL, una biblioteca ligera de Excel que lee, edita y escribe libros de trabajo sin necesidad de tener instalado Microsoft Office. Verás lo sencillo que es cargar datos, acceder a hojas de cálculo y trabajar con celdas mediante programación, todo ello desde tu aplicación C#, incluso en entornos Linux o Docker sin Office.
¿Por qué elegir IronXL en lugar de Microsoft.Office.Interop.Excel para sistemas SII y declaraciones AEAT?
Aunque Microsoft.Office.Interop.Excel ha sido el enfoque tradicional para la automatización de Excel, presenta limitaciones significativas que hacen de IronXL la mejor opción para las aplicaciones modernas. La propia Microsoft desaconseja el uso de Office Interop en servidores, alegando inestabilidad, problemas de escalabilidad y escenarios de implementación no compatibles.
Esto es especialmente importante en el contexto español: los sistemas SII de las empresas grandes generan y procesan miles de ficheros XLSX diariamente en servidores Linux en la nube, donde instalar Office no es una opción. Lo mismo ocurre con las aplicaciones que procesan modelos de la AEAT (303, 347, 390), notificaciones del Banco de España, la CNMV o documentos TicketBAI de las haciendas forales del País Vasco.
| Función | IronXL | Microsoft.Office.Interop.Excel |
|---|---|---|
| Se requiere la instalación de Excel | No | Sí |
| Soporte Multiplataforma | Windows, Linux, macOS | Sólo Windows |
| Implementación en servidor (sistemas SII) | Totalmente compatible | No recomendado por Microsoft |
| Memory Management | Automático | Se requiere limpieza manual de COM |
| Complejidad de la API | Sencillo e intuitivo | Interfaces COM complejas |
| Formatos de archivo compatibles | XLS, XLSX, CSV, TSV, JSON | Limitado a formatos Excel |
| Seguridad de subprocesos | Soportado | Solo de un solo subproceso |
IronXL elimina la dependencia de Microsoft Excel, lo que lo hace ideal para entornos de servidor, contenedores Docker y plataformas en la nube como Azure. La biblioteca ofrece una API limpia y moderna que elimina la necesidad de lidiar con objetos COM o la gestión manual de la memoria. Más allá de abrir archivos, IronXL se encarga de todo, desde la evaluación de fórmulas hasta la generación de gráficos y el estilo de las celdas.
¿Cómo instalar IronXL en un proyecto .NET?
Empezar a utilizar IronXL es muy sencillo: se puede añadir a tu proyecto en cuestión de minutos a través del Gestor de paquetes NuGet. Abra la consola del gestor de paquetes en Visual Studio y ejecute:
Install-Package IronXL
dotnet add package IronXL
Install-Package IronXL
dotnet add package IronXL
Ambos comandos instalan el mismo paquete. Utilice la primera en la consola del Administrador de paquetes de Visual Studio y la segunda con la CLI de .NET. Tras la instalación, puede comprobar que la referencia del paquete aparece en su archivo de proyecto bajo <PackageReference Include="IronXL.Excel" />.
¿Qué versiones de .NET admite IronXL?
IronXL es compatible con toda la gama de versiones modernas de .NET, incluyendo .NET 10, .NET 8, .NET 6, .NET Framework 4.6.2 y superior, y .NET Standard 2.0. Esta amplia compatibilidad significa que puede utilizar IronXL tanto en nuevos proyectos destinados a .NET 10 como en aplicaciones heredadas que se ejecutan en el .NET Framework tradicional.
La biblioteca está disponible como un único paquete NuGet que selecciona automáticamente el binario adecuado para el marco de trabajo de destino. Sin dependencias adicionales, sin instalaciones específicas para cada plataforma y sin necesidad de licencia de Excel. Visite la guía de compatibilidad de IronXL para obtener una lista completa de los entornos de ejecución y plataformas compatibles.
¿Cómo abrir ficheros XLSX de notificaciones AEAT y respuestas SII en C#?
Abrir ficheros XLSX de la AEAT (notificaciones de liquidación, respuestas SII, documentos de modelos enviados por la asesoría) con IronXL requiere solo unas pocas líneas de código. La biblioteca admite la lectura de archivos XLS y XLSX, así como de formatos CSV y TSV, a través de una API unificada. El siguiente ejemplo muestra cómo abrir un fichero XLSX de respuesta del SII:
// Abrir fichero XLSX de respuesta del SII (AEAT)
WorkBook workbook = WorkBook.Load("RespuestaSII_FacturasEmitidas_2024.xlsx");
// Acceder a la primera hoja de trabajo (registros de facturas emitidas)
WorkSheet sheet = workbook.WorkSheets[0];
// O acceder por nombre de hoja
WorkSheet facturasRecibidas = workbook.GetWorkSheet("Facturas Recibidas");
// Leer el NIF del emisor de la primera factura
string nifEmisor = sheet["A2"].StringValue;
Console.WriteLine($"NIF Emisor: {nifEmisor}");
// Leer el importe de base imponible
decimal baseImponible = sheet["D2"].DecimalValue;
Console.WriteLine($"Base Imponible: {baseImponible:N2} EUR");
// Verificar el tipo de dato de la celda antes de leer
var cell = sheet["E2"];
Console.WriteLine($"Tipo: {cell.Type}, Valor: {cell.Value}");
// Abrir fichero XLSX de respuesta del SII (AEAT)
WorkBook workbook = WorkBook.Load("RespuestaSII_FacturasEmitidas_2024.xlsx");
// Acceder a la primera hoja de trabajo (registros de facturas emitidas)
WorkSheet sheet = workbook.WorkSheets[0];
// O acceder por nombre de hoja
WorkSheet facturasRecibidas = workbook.GetWorkSheet("Facturas Recibidas");
// Leer el NIF del emisor de la primera factura
string nifEmisor = sheet["A2"].StringValue;
Console.WriteLine($"NIF Emisor: {nifEmisor}");
// Leer el importe de base imponible
decimal baseImponible = sheet["D2"].DecimalValue;
Console.WriteLine($"Base Imponible: {baseImponible:N2} EUR");
// Verificar el tipo de dato de la celda antes de leer
var cell = sheet["E2"];
Console.WriteLine($"Tipo: {cell.Type}, Valor: {cell.Value}");
Imports IronXL
' Abrir fichero XLSX de respuesta del SII (AEAT)
Dim workbook As WorkBook = WorkBook.Load("RespuestaSII_FacturasEmitidas_2024.xlsx")
' Acceder a la primera hoja de trabajo (registros de facturas emitidas)
Dim sheet As WorkSheet = workbook.WorkSheets(0)
' O acceder por nombre de hoja
Dim facturasRecibidas As WorkSheet = workbook.GetWorkSheet("Facturas Recibidas")
' Leer el NIF del emisor de la primera factura
Dim nifEmisor As String = sheet("A2").StringValue
Console.WriteLine($"NIF Emisor: {nifEmisor}")
' Leer el importe de base imponible
Dim baseImponible As Decimal = sheet("D2").DecimalValue
Console.WriteLine($"Base Imponible: {baseImponible:N2} EUR")
' Verificar el tipo de dato de la celda antes de leer
Dim cell = sheet("E2")
Console.WriteLine($"Tipo: {cell.Type}, Valor: {cell.Value}")
El método WorkBook.Load() detecta automáticamente el formato del archivo (XLS, XLSX, CSV o TSV) y lo analiza sin ninguna configuración adicional. Puede acceder a las hojas de trabajo por índice utilizando workbook.WorkSheets[0] o por nombre utilizando GetWorkSheet(). Los valores individuales de las celdas se pueden leer mediante la notación de corchetes (sheet["A1"]), lo que hace que el código sea conciso y expresivo.
Para el acceso tipado, IronXL expone propiedades como .StringValue, .DecimalValue, .IntValue, .BoolValue, y .DateTimeValue directamente en las celdas. Esto elimina la necesidad de adivinar el tipo, algo habitual en las API genéricas basadas en objetos. Para los ficheros XLSX del Banco de España o la CNMV, que contienen informes prudenciales con importes precisos y fechas de referencia, el acceso tipado de IronXL garantiza la integridad de los datos.
Resultado

¿Cómo se cargan ficheros XLSX de la AEAT desde un flujo o una matriz de bytes?
En aplicaciones web y funciones en la nube (habituales en los sistemas SII), a menudo se reciben datos de ficheros XLSX como un flujo o una matriz de bytes en lugar de una ruta de archivo. IronXL se encarga de ambos casos:
// Cargar desde array de bytes (por ejemplo, desde una base de datos o respuesta HTTP de la AEAT)
byte[] fileBytes = File.ReadAllBytes("NotificacionLiquidacion_AEAT.xlsx");
WorkBook workbookFromBytes = WorkBook.Load(fileBytes);
// Cargar desde MemoryStream (para ficheros XLSX recibidos como flujo)
using var memStream = new MemoryStream(fileBytes);
WorkBook workbookFromStream = WorkBook.Load(memStream);
// Acceder a los datos de la misma forma independientemente del origen
WorkSheet sheet = workbookFromStream.DefaultWorkSheet;
Console.WriteLine(sheet["A2"].StringValue);
// Cargar desde array de bytes (por ejemplo, desde una base de datos o respuesta HTTP de la AEAT)
byte[] fileBytes = File.ReadAllBytes("NotificacionLiquidacion_AEAT.xlsx");
WorkBook workbookFromBytes = WorkBook.Load(fileBytes);
// Cargar desde MemoryStream (para ficheros XLSX recibidos como flujo)
using var memStream = new MemoryStream(fileBytes);
WorkBook workbookFromStream = WorkBook.Load(memStream);
// Acceder a los datos de la misma forma independientemente del origen
WorkSheet sheet = workbookFromStream.DefaultWorkSheet;
Console.WriteLine(sheet["A2"].StringValue);
Imports System.IO
' Cargar desde array de bytes (por ejemplo, desde una base de datos o respuesta HTTP de la AEAT)
Dim fileBytes As Byte() = File.ReadAllBytes("NotificacionLiquidacion_AEAT.xlsx")
Dim workbookFromBytes As WorkBook = WorkBook.Load(fileBytes)
' Cargar desde MemoryStream (para ficheros XLSX recibidos como flujo)
Using memStream As New MemoryStream(fileBytes)
Dim workbookFromStream As WorkBook = WorkBook.Load(memStream)
' Acceder a los datos de la misma forma independientemente del origen
Dim sheet As WorkSheet = workbookFromStream.DefaultWorkSheet
Console.WriteLine(sheet("A2").StringValue)
End Using
La carga basada en secuencias es particularmente útil en los controladores ASP.NET Core, donde se recibe una carga IFormFile. Simplemente llame a formFile.OpenReadStream() y pase el resultado a WorkBook.Load(). Para ver los patrones de integración completos de .NET Core, consulte el tutorial de .NET Core para Excel.
¿Cómo crear nuevos libros Excel con datos de declaraciones AEAT en C#?
Crear nuevos ficheros XLSX con datos de declaraciones es igual de sencillo gracias a las funciones de creación de hojas de cálculo de IronXL. El siguiente ejemplo crea un informe trimestral de IVA con los datos del modelo 303 de la AEAT:
// Crear un nuevo libro en formato XLSX para declaración modelo 303 AEAT
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
// Añadir metadatos del documento
workbook.Metadata.Author = "Departamento Fiscal";
workbook.Metadata.Title = "Modelo 303 - Declaración Trimestral IVA Q1 2024";
// Crear la hoja de trabajo con nombre descriptivo
WorkSheet sheet = workbook.CreateWorkSheet("Modelo 303 T1-2024");
// Añadir encabezados de columna
sheet["A1"].Value = "Concepto";
sheet["B1"].Value = "Base Imponible (EUR)";
sheet["C1"].Value = "Cuota IVA (EUR)";
// Añadir datos de liquidación IVA
sheet["A2"].Value = "IVA Devengado (21%)";
sheet["B2"].Value = 50000;
sheet["C2"].Value = 10500;
sheet["A3"].Value = "IVA Soportado Deducible";
sheet["B3"].Value = 30000;
sheet["C3"].Value = 6300;
// Añadir fórmula de resultado de la liquidación
sheet["C4"].Formula = "=C2-C3";
// Aplicar formato numérico en euros
sheet["B2:C4"].FormatString = "#,##0.00";
// Guardar el fichero XLSX para declaración AEAT
workbook.SaveAs("Modelo303_T1_2024.xlsx");
Console.WriteLine("Fichero Modelo 303 guardado correctamente.");
// Crear un nuevo libro en formato XLSX para declaración modelo 303 AEAT
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
// Añadir metadatos del documento
workbook.Metadata.Author = "Departamento Fiscal";
workbook.Metadata.Title = "Modelo 303 - Declaración Trimestral IVA Q1 2024";
// Crear la hoja de trabajo con nombre descriptivo
WorkSheet sheet = workbook.CreateWorkSheet("Modelo 303 T1-2024");
// Añadir encabezados de columna
sheet["A1"].Value = "Concepto";
sheet["B1"].Value = "Base Imponible (EUR)";
sheet["C1"].Value = "Cuota IVA (EUR)";
// Añadir datos de liquidación IVA
sheet["A2"].Value = "IVA Devengado (21%)";
sheet["B2"].Value = 50000;
sheet["C2"].Value = 10500;
sheet["A3"].Value = "IVA Soportado Deducible";
sheet["B3"].Value = 30000;
sheet["C3"].Value = 6300;
// Añadir fórmula de resultado de la liquidación
sheet["C4"].Formula = "=C2-C3";
// Aplicar formato numérico en euros
sheet["B2:C4"].FormatString = "#,##0.00";
// Guardar el fichero XLSX para declaración AEAT
workbook.SaveAs("Modelo303_T1_2024.xlsx");
Console.WriteLine("Fichero Modelo 303 guardado correctamente.");
' Crear un nuevo libro en formato XLSX para declaración modelo 303 AEAT
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
' Añadir metadatos del documento
workbook.Metadata.Author = "Departamento Fiscal"
workbook.Metadata.Title = "Modelo 303 - Declaración Trimestral IVA Q1 2024"
' Crear la hoja de trabajo con nombre descriptivo
Dim sheet As WorkSheet = workbook.CreateWorkSheet("Modelo 303 T1-2024")
' Añadir encabezados de columna
sheet("A1").Value = "Concepto"
sheet("B1").Value = "Base Imponible (EUR)"
sheet("C1").Value = "Cuota IVA (EUR)"
' Añadir datos de liquidación IVA
sheet("A2").Value = "IVA Devengado (21%)"
sheet("B2").Value = 50000
sheet("C2").Value = 10500
sheet("A3").Value = "IVA Soportado Deducible"
sheet("B3").Value = 30000
sheet("C3").Value = 6300
' Añadir fórmula de resultado de la liquidación
sheet("C4").Formula = "=C2-C3"
' Aplicar formato numérico en euros
sheet("B2:C4").FormatString = "#,##0.00"
' Guardar el fichero XLSX para declaración AEAT
workbook.SaveAs("Modelo303_T1_2024.xlsx")
Console.WriteLine("Fichero Modelo 303 guardado correctamente.")
El método WorkBook.Create() inicializa un nuevo libro de trabajo en el formato especificado. Puede añadir varias hojas de cálculo utilizando CreateWorkSheet(), rellenar celdas con varios tipos de datos, incluyendo cadenas, números, booleanos y fechas, y aplicar fórmulas de Excel directamente a través de la propiedad Formula. La biblioteca gestiona automáticamente la conversión de tipos de datos y los requisitos de formato específicos de Excel.
Para aplicar estilos a los encabezados y añadir bordes, utilice la API de estilo de celdas. Para la generación de informes basados en plantillas (habitual cuando la AEAT o el Banco de España proporcionan plantillas XLSX oficiales), consulte la guía de exportación desde plantillas de Excel existentes.
Resultado

¿Cómo leer y procesar datos de declaraciones AEAT de forma masiva?
IronXL gestiona la extracción de datos y el procesamiento masivo de forma eficiente mediante operaciones basadas en rangos y la conversión a DataTable, lo que resulta especialmente útil para procesar grandes volúmenes de registros SII o datos del modelo 390 (resumen anual de IVA):
// Cargar fichero XLSX del modelo 390 (resumen anual IVA)
WorkBook workbook = WorkBook.Load("Modelo390_Anual_2024.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;
// Leer un rango de registros de liquidación
var range = sheet["A1:F100"];
foreach (var cell in range)
{
Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}
// Convertir la hoja a DataTable para integración con base de datos
System.Data.DataTable dataTable = sheet.ToDataTable(useFirstRowAsColumnHeaders: true);
Console.WriteLine($"Registros: {dataTable.Rows.Count}, Columnas: {dataTable.Columns.Count}");
// Usar funciones de agregación directamente sobre rangos
decimal totalBaseImponible = sheet["B2:B100"].Sum();
decimal totalCuotaIVA = sheet["C2:C100"].Sum();
Console.WriteLine($"Base Imponible Total: {totalBaseImponible:N2} EUR");
Console.WriteLine($"Cuota IVA Total: {totalCuotaIVA:N2} EUR");
// Filtrar con LINQ para encontrar registros por encima del umbral del modelo 347
var operacionesGrandes = dataTable.AsEnumerable()
.Where(row => row.Field<decimal>("Importe") > 3005.06m)
.ToList();
Console.WriteLine($"Operaciones > 3.005,06 EUR (modelo 347): {operacionesGrandes.Count}");
// Cargar fichero XLSX del modelo 390 (resumen anual IVA)
WorkBook workbook = WorkBook.Load("Modelo390_Anual_2024.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;
// Leer un rango de registros de liquidación
var range = sheet["A1:F100"];
foreach (var cell in range)
{
Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}
// Convertir la hoja a DataTable para integración con base de datos
System.Data.DataTable dataTable = sheet.ToDataTable(useFirstRowAsColumnHeaders: true);
Console.WriteLine($"Registros: {dataTable.Rows.Count}, Columnas: {dataTable.Columns.Count}");
// Usar funciones de agregación directamente sobre rangos
decimal totalBaseImponible = sheet["B2:B100"].Sum();
decimal totalCuotaIVA = sheet["C2:C100"].Sum();
Console.WriteLine($"Base Imponible Total: {totalBaseImponible:N2} EUR");
Console.WriteLine($"Cuota IVA Total: {totalCuotaIVA:N2} EUR");
// Filtrar con LINQ para encontrar registros por encima del umbral del modelo 347
var operacionesGrandes = dataTable.AsEnumerable()
.Where(row => row.Field<decimal>("Importe") > 3005.06m)
.ToList();
Console.WriteLine($"Operaciones > 3.005,06 EUR (modelo 347): {operacionesGrandes.Count}");
Imports IronXL
Imports System.Data
Imports System.Linq
' Cargar fichero XLSX del modelo 390 (resumen anual IVA)
Dim workbook As WorkBook = WorkBook.Load("Modelo390_Anual_2024.xlsx")
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
' Leer un rango de registros de liquidación
Dim range = sheet("A1:F100")
For Each cell In range
Console.WriteLine($"{cell.AddressString}: {cell.Text}")
Next
' Convertir la hoja a DataTable para integración con base de datos
Dim dataTable As DataTable = sheet.ToDataTable(useFirstRowAsColumnHeaders:=True)
Console.WriteLine($"Registros: {dataTable.Rows.Count}, Columnas: {dataTable.Columns.Count}")
' Usar funciones de agregación directamente sobre rangos
Dim totalBaseImponible As Decimal = sheet("B2:B100").Sum()
Dim totalCuotaIVA As Decimal = sheet("C2:C100").Sum()
Console.WriteLine($"Base Imponible Total: {totalBaseImponible:N2} EUR")
Console.WriteLine($"Cuota IVA Total: {totalCuotaIVA:N2} EUR")
' Filtrar con LINQ para encontrar registros por encima del umbral del modelo 347
Dim operacionesGrandes = dataTable.AsEnumerable() _
.Where(Function(row) row.Field(Of Decimal)("Importe") > 3005.06D) _
.ToList()
Console.WriteLine($"Operaciones > 3.005,06 EUR (modelo 347): {operacionesGrandes.Count}")
La sintaxis de selección de rango (sheet["A1:F100"]) proporciona una forma elegante de trabajar con varias celdas a la vez. El método ToDataTable() convierte los datos de la hoja de cálculo en un System.Data.DataTable, que se integra directamente con Entity Framework, controles de enlace de datos y operaciones de copia masiva SQL. IronXL también es compatible con funciones de agregación — Sum(), Avg(), Max(), y Min() — directamente en rangos, eliminando la necesidad de escribir código de iteración manual.

¿Cómo se filtran y se buscan celdas en ficheros XLSX de la AEAT?
Más allá del acceso basado en rangos, IronXL te permite buscar celdas por valor, aplicar lógica condicional e iterar por filas y columnas mediante programación. Esto resulta especialmente útil para validar los datos de los ficheros XLSX del SII antes de enviarlos a la AEAT o para detectar anomalías en los registros de facturas TicketBAI:
WorkBook workbook = WorkBook.Load("FacturasEmitidas_SII_2024.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;
// Obtener el número total de registros del fichero SII
int rowCount = sheet.RowCount;
int colCount = sheet.ColumnCount;
Console.WriteLine($"Registros en fichero SII: {rowCount} filas x {colCount} columnas");
// Iterar sobre todos los registros y validar
for (int row = 2; row <= rowCount; row++)
{
for (int col = 1; col <= colCount; col++)
{
var cell = sheet.GetCellAt(row, col);
if (cell != null && !string.IsNullOrEmpty(cell.Text))
{
Console.WriteLine($"[{row},{col}] = {cell.Text}");
}
}
}
// Buscar registros con NIF en blanco (error en datos SII)
var nifEnBlanco = sheet["A2:A1000"]
.FirstOrDefault(c => string.IsNullOrWhiteSpace(c.StringValue));
if (nifEnBlanco != null)
{
Console.WriteLine($"NIF en blanco encontrado en: {nifEnBlanco.AddressString}");
}
WorkBook workbook = WorkBook.Load("FacturasEmitidas_SII_2024.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;
// Obtener el número total de registros del fichero SII
int rowCount = sheet.RowCount;
int colCount = sheet.ColumnCount;
Console.WriteLine($"Registros en fichero SII: {rowCount} filas x {colCount} columnas");
// Iterar sobre todos los registros y validar
for (int row = 2; row <= rowCount; row++)
{
for (int col = 1; col <= colCount; col++)
{
var cell = sheet.GetCellAt(row, col);
if (cell != null && !string.IsNullOrEmpty(cell.Text))
{
Console.WriteLine($"[{row},{col}] = {cell.Text}");
}
}
}
// Buscar registros con NIF en blanco (error en datos SII)
var nifEnBlanco = sheet["A2:A1000"]
.FirstOrDefault(c => string.IsNullOrWhiteSpace(c.StringValue));
if (nifEnBlanco != null)
{
Console.WriteLine($"NIF en blanco encontrado en: {nifEnBlanco.AddressString}");
}
Imports System
Dim workbook As WorkBook = WorkBook.Load("FacturasEmitidas_SII_2024.xlsx")
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
' Obtener el número total de registros del fichero SII
Dim rowCount As Integer = sheet.RowCount
Dim colCount As Integer = sheet.ColumnCount
Console.WriteLine($"Registros en fichero SII: {rowCount} filas x {colCount} columnas")
' Iterar sobre todos los registros y validar
For row As Integer = 2 To rowCount
For col As Integer = 1 To colCount
Dim cell = sheet.GetCellAt(row, col)
If cell IsNot Nothing AndAlso Not String.IsNullOrEmpty(cell.Text) Then
Console.WriteLine($"[{row},{col}] = {cell.Text}")
End If
Next
Next
' Buscar registros con NIF en blanco (error en datos SII)
Dim nifEnBlanco = sheet("A2:A1000").FirstOrDefault(Function(c) String.IsNullOrWhiteSpace(c.StringValue))
If nifEnBlanco IsNot Nothing Then
Console.WriteLine($"NIF en blanco encontrado en: {nifEnBlanco.AddressString}")
End If
Este patrón es habitual en los flujos de validación de datos del SII, donde es necesario verificar la completitud y corrección de los registros de facturas antes de proceder al envío a la AEAT.
¿Qué escenarios de implementación admite este enfoque para sistemas de cumplimiento fiscal en España?
Una de las ventajas más prácticas de utilizar IronXL es su capacidad para funcionar sin necesidad de tener Microsoft Office instalado en el sistema. Esto genera una flexibilidad de implementación que las soluciones basadas en Interop simplemente no pueden igualar, y que es fundamental para los sistemas SII, TicketBAI y VeriFactu de las empresas españolas.
Implementación en la nube y en contenedores
IronXL se ejecuta en Azure App Service, AWS Lambda y Google Cloud Run sin necesidad de ninguna configuración especial. Al no depender de Office, se evitan tanto los costes de licencia como la complejidad de incluir Office en una imagen de contenedor. Esto es particularmente relevante para los sistemas SII de las grandes empresas españolas, que procesan millones de registros de facturas en entornos de microservicios en la nube.
La implementación basada en Docker es igualmente sencilla. La guía de IronXL para Docker abarca configuraciones de contenedores para Debian, Alpine y Windows.
Cumplimiento LOPDGDD en el procesamiento de ficheros XLSX
Al abrir ficheros XLSX de la AEAT que contienen datos personales (NIF, nombres, direcciones), la LOPDGDD exige tratar esos datos con cuidado. IronXL permite leer únicamente las celdas necesarias para cada proceso, sin cargar datos personales innecesarios. Esto se aplica, por ejemplo, al procesar los ficheros de respuesta del SII, donde solo se necesitan los importes y las fechas para la reconciliación contable, no los datos de identificación de los terceros.
Uso del servidor y del canal de CI/CD para sistemas de declaraciones
Los entornos de servidor suelen carecer de una interfaz gráfica de usuario (GUI) y no pueden ejecutar aplicaciones que dependan de una sesión de escritorio de Windows. IronXL se ejecuta íntegramente en modo sin interfaz gráfica, lo que lo hace adecuado para:
- Generación automatizada de ficheros XLSX para declaraciones SII, modelos 303, 347 y 390
- Procesamiento de hojas de cálculo cargadas en las API de validación de la AEAT
- Exportación de datos de facturas TicketBAI a XLSX para las haciendas forales del País Vasco
- Generación de registros VeriFactu (Real Decreto-Ley 15/2025) en XLSX
- Creación de informes prudenciales XLSX para el Banco de España y la CNMV
Desarrollo multiplataforma
IronXL está orientado a .NET Standard 2.0 y se ejecuta de forma nativa en Linux y macOS, lo que permite flujos de trabajo de desarrollo multiplataforma. Los desarrolladores que utilizan macOS pueden escribir y probar el código de generación y procesamiento de ficheros XLSX localmente con la plena confianza de que el mismo binario funcionará de forma idéntica en un servidor de producción Linux.
¿Cómo gestionas las operaciones habituales de Excel más allá de la lectura básica?
La lectura y escritura de celdas es solo la base. La automatización de Excel en la práctica suele implicar el formato, las fórmulas, la gestión de hojas de cálculo y la conversión de formatos.
Formateo de celdas y aplicación de estilos para informes AEAT
IronXL ofrece una API de estilo que abarca fuentes, colores, bordes, alineación y formatos numéricos, adecuada para generar ficheros XLSX de aspecto profesional para la AEAT, el Banco de España o la CNMV:
WorkBook workbook = WorkBook.Load("Modelo303_T1_2024.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;
// Aplicar negrita, tamaño de fuente y color de fondo a la fila de encabezados
var headerRange = sheet["A1:F1"];
headerRange.Style.Font.Bold = true;
headerRange.Style.Font.Height = 12;
headerRange.Style.SetBackgroundColor("#4472C4");
headerRange.Style.Font.Color = "#FFFFFF";
headerRange.Style.HorizontalAlignment = IronXL.Styles.HorizontalAlignment.Center;
// Formatear columna de importes en euros (formato español: punto de miles, coma decimal)
sheet["B2:C100"].FormatString = "#,##0.00";
// Aplicar formato de fecha
sheet["D2:D100"].FormatString = "dd/MM/yyyy";
// Añadir bordes al rango de datos
var dataRange = sheet["A1:F20"];
dataRange.Style.Border.Bottom.Type = IronXL.Styles.BorderType.Thin;
dataRange.Style.Border.Right.Type = IronXL.Styles.BorderType.Thin;
workbook.SaveAs("Modelo303_T1_2024_Formateado.xlsx");
WorkBook workbook = WorkBook.Load("Modelo303_T1_2024.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;
// Aplicar negrita, tamaño de fuente y color de fondo a la fila de encabezados
var headerRange = sheet["A1:F1"];
headerRange.Style.Font.Bold = true;
headerRange.Style.Font.Height = 12;
headerRange.Style.SetBackgroundColor("#4472C4");
headerRange.Style.Font.Color = "#FFFFFF";
headerRange.Style.HorizontalAlignment = IronXL.Styles.HorizontalAlignment.Center;
// Formatear columna de importes en euros (formato español: punto de miles, coma decimal)
sheet["B2:C100"].FormatString = "#,##0.00";
// Aplicar formato de fecha
sheet["D2:D100"].FormatString = "dd/MM/yyyy";
// Añadir bordes al rango de datos
var dataRange = sheet["A1:F20"];
dataRange.Style.Border.Bottom.Type = IronXL.Styles.BorderType.Thin;
dataRange.Style.Border.Right.Type = IronXL.Styles.BorderType.Thin;
workbook.SaveAs("Modelo303_T1_2024_Formateado.xlsx");
Imports IronXL
Dim workbook As WorkBook = WorkBook.Load("Modelo303_T1_2024.xlsx")
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
' Aplicar negrita, tamaño de fuente y color de fondo a la fila de encabezados
Dim headerRange = sheet("A1:F1")
headerRange.Style.Font.Bold = True
headerRange.Style.Font.Height = 12
headerRange.Style.SetBackgroundColor("#4472C4")
headerRange.Style.Font.Color = "#FFFFFF"
headerRange.Style.HorizontalAlignment = IronXL.Styles.HorizontalAlignment.Center
' Formatear columna de importes en euros (formato español: punto de miles, coma decimal)
sheet("B2:C100").FormatString = "#,##0.00"
' Aplicar formato de fecha
sheet("D2:D100").FormatString = "dd/MM/yyyy"
' Añadir bordes al rango de datos
Dim dataRange = sheet("A1:F20")
dataRange.Style.Border.Bottom.Type = IronXL.Styles.BorderType.Thin
dataRange.Style.Border.Right.Type = IronXL.Styles.BorderType.Thin
workbook.SaveAs("Modelo303_T1_2024_Formateado.xlsx")
Para obtener una guía completa de las opciones de estilo, consulta cómo aplicar estilos a celdas, bordes y fuentes.
Conversión entre formatos Excel y CSV para flujos de trabajo AEAT
IronXL gestiona la conversión de formatos directamente, lo que le permite cargar un CSV (por ejemplo, datos exportados desde el portal de la AEAT) y guardarlo como XLSX, o exportar un archivo XLSX a CSV para su procesamiento posterior:
// Cargar CSV de datos AEAT y guardar como XLSX para análisis
WorkBook csvBook = WorkBook.Load("datos_aeat_export.csv");
csvBook.SaveAs("datos_aeat.xlsx");
// Cargar XLSX de declaración y exportar como CSV para integración
WorkBook xlsxBook = WorkBook.Load("Modelo347_2024.xlsx");
xlsxBook.DefaultWorkSheet.SaveAsCsv("Modelo347_2024.csv");
// Cargar CSV de datos AEAT y guardar como XLSX para análisis
WorkBook csvBook = WorkBook.Load("datos_aeat_export.csv");
csvBook.SaveAs("datos_aeat.xlsx");
// Cargar XLSX de declaración y exportar como CSV para integración
WorkBook xlsxBook = WorkBook.Load("Modelo347_2024.xlsx");
xlsxBook.DefaultWorkSheet.SaveAsCsv("Modelo347_2024.csv");
' Cargar CSV de datos AEAT y guardar como XLSX para análisis
Dim csvBook As WorkBook = WorkBook.Load("datos_aeat_export.csv")
csvBook.SaveAs("datos_aeat.xlsx")
' Cargar XLSX de declaración y exportar como CSV para integración
Dim xlsxBook As WorkBook = WorkBook.Load("Modelo347_2024.xlsx")
xlsxBook.DefaultWorkSheet.SaveAsCsv("Modelo347_2024.csv")
Para obtener más detalles sobre el manejo de CSV, incluida la configuración de delimitadores y las opciones de codificación, consulte el tutorial del lector de CSV de C# y la guía de conversión de CSV a XLSX.
¿Cómo empezar con una prueba gratuita?
IronXL está disponible para su descarga con una licencia de desarrollo gratuita que le permite probar todas las funciones antes de comprometerse a la compra. No hay restricciones de funciones durante la prueba: la biblioteca que se ejecuta en producción es la misma que se evalúa.
Para empezar:
- Instala el paquete a través de NuGet:
dotnet add package IronXLdotnet add package IronXLSHELL - Visita la página de licencias de IronXL para obtener una clave de prueba gratuita.
- Aplica la clave en el código antes de cualquier llamada a IronXL:
IronXL.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";IronXL.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";Imports IronXL IronXL.License.LicenseKey = "YOUR-LICENSE-KEY-HERE"$vbLabelText $csharpLabel
Hay licencias disponibles para desarrolladores individuales, equipos y organizaciones. La página del producto IronXL ofrece información completa sobre precios y opciones de implementación, incluidos los derechos de distribución libres de regalías. Para obtener una visión más amplia de todos los productos de Iron Software y de cómo se integran, consulte la suite de productos de Iron Software.
Preguntas Frecuentes
¿Cómo puedo abrir un fichero XLSX de respuesta del SII o notificación AEAT en C# sin Office?
Usa IronXL: var workbook = WorkBook.Load('RespuestaSII.xlsx'); para abrir cualquier fichero XLSX de la AEAT. IronXL detecta automáticamente el formato (XLS, XLSX, CSV) y se ejecuta en Linux y Docker sin Office, siendo idóneo para sistemas SII en la nube.
¿IronXL cumple con la LOPDGDD al abrir ficheros XLSX de la AEAT con datos personales?
Sí. IronXL permite leer únicamente las celdas necesarias (NIF, importes, fechas) desde los ficheros XLSX de la AEAT, sin cargar datos personales innecesarios en memoria. Esto aplica el principio de minimización de datos de la LOPDGDD al procesar ficheros del SII, modelos 303/347/390 o TicketBAI.
¿Puede IronXL abrir ficheros XLSX de TicketBAI recibidos de las haciendas forales del País Vasco?
Sí. IronXL puede abrir y procesar cualquier fichero XLSX de TicketBAI de Bizkaia, Gipuzkoa y Araba, leyendo los registros de facturas y validando los datos directamente desde C# en servidores Linux sin dependencias de Office.
¿Cuáles son los beneficios de usar IronXL para sistemas SII y declaraciones AEAT en C#?
IronXL se ejecuta sin Office en Linux y Docker, gestiona automáticamente la memoria, soporta multihilo y es compatible con .NET 10, .NET 8 y .NET Framework. Esto lo hace ideal para sistemas SII en la nube que procesan millones de registros de facturas con alta concurrencia.
¿IronXL puede abrir informes prudenciales XLSX del Banco de España o la CNMV?
Sí. IronXL puede abrir y procesar informes prudenciales o de supervisión en formato XLSX del Banco de España y la CNMV, sin necesidad de Office en los servidores regulados, con acceso tipado a las celdas para garantizar la precisión de los datos financieros.



