SII modelo 303: Exportar List de registros AEAT a Excel en C# | IronXL
IronXL permite a los desarrolladores exportar objetos List<T> directamente a ficheros Excel en C# sin dependencias de MS Office, gestionando automáticamente la conversión de tipos y el mapeo de propiedades mediante métodos sencillos que transforman colecciones en hojas de cálculo XLSX profesionales. En el contexto de las obligaciones fiscales españolas, esto significa que puedes exportar registros SII o del modelo 303 directamente desde tus listas de C# a XLSX, listos para el envío a la AEAT desde entornos Linux sin Office.
Exportar colecciones de objetos a archivos de Excel es un requisito fundamental en aplicaciones empresariales españolas. Ya sea para generar declaraciones trimestrales de IVA, compartir datos de operaciones con terceros para el modelo 347, o crear copias de seguridad de registros SII, necesitas una forma fiable de transformar objetos List<T> en hojas de cálculo profesionales. IronXL proporciona una solución que elimina las complejidades tradicionales de crear archivos Excel en .NET, .NET Core o el .NET Framework.
¿Por qué es complicado exportar listas de registros SII/modelo 303 a archivos de Excel?
Los enfoques tradicionales para exportar datos a Excel a menudo implican Microsoft Office Interop, que requiere la instalación de Excel en el servidor y genera complicaciones en la implementación. La población manual de celda por celda usando reflexiones es un proceso que consume tiempo y es propenso a errores. Las potentes funciones de importación de datos de IronXL resuelven estos problemas con un mapeo inteligente de propiedades entre fuentes de datos y encabezados de columnas Excel, sin requerir MS Office ni código de reflexión complejo.
La biblioteca gestiona la conversión de tipos automáticamente, admite objetos anidados y mantiene la integridad de los datos a través de diferentes formatos como archivos CSV y archivos XLSX. Para los desarrolladores que trabajan con operaciones Excel en C# sin Interop, IronXL es ideal para proyectos .NET modernos que necesitan generación de Excel robusta y capacidades de importación/exportación de datos.
Esto resulta especialmente relevante para los equipos de desarrollo que trabajan en España con los siguientes requisitos de cumplimiento:
- SII (Suministro Inmediato de Información): Las empresas inscritas en el SII deben enviar registros de facturas emitidas y recibidas en tiempo casi real. IronXL permite exportar una
List<FacturaSII>directamente a XLSX desde servidores Linux sin Office. - Modelo 303 (declaración trimestral IVA) y modelo 130 (pago fraccionado IRPF autónomos): Genera los ficheros XLSX de soporte exportando tu
List<Liquidacion>con IronXL. - Banco de España / CNMV: Las entidades financieras reguladas pueden exportar sus listas de datos prudenciales a XLSX con IronXL, sin dependencias de Office en los servidores de producción.
La biblioteca también admite la implementación en contenedores Docker, entornos Linux y plataformas en la nube Azure y AWS, lo que la hace adecuada para las arquitecturas de microservicios que utilizan los sistemas SII de las empresas españolas.
Cuando se trabaja con grandes conjuntos de datos (por ejemplo, el histórico anual de facturas para el modelo 390), los métodos tradicionales a menudo tienen problemas de gestión de memoria y rendimiento. IronXL aborda estas preocupaciones con estructuras de datos internas optimizadas que gestionan eficientemente la conversión entre diferentes formatos de hoja de cálculo.
¿Cómo exportar datos de una lista de registros SII a Excel?
Empezar con IronXL requiere una configuración mínima. Primero, instala la biblioteca a través de la Consola del Administrador de Paquetes NuGet:
Install-Package IronXL.Excel
Una vez instalado, puedes comenzar a crear hojas de cálculo Excel desde tus estructuras de datos C#. A continuación se muestra cómo exportar datos usando un modelo de registro SII de facturas emitidas:
using IronXL;
using System.Collections.Generic;
using System.Data;
public class FacturaSII
{
public string NumFactura { get; set; }
public string NifDestinatario { get; set; }
public string NombreDestinatario { get; set; }
public decimal BaseImponible { get; set; }
public decimal CuotaIVA { get; set; }
public DateTime FechaOperacion { get; set; }
}
class Program
{
static void Main(string[] args)
{
// Lista de registros de facturas emitidas para SII (AEAT)
var facturas = new List<FacturaSII>
{
new FacturaSII { NumFactura = "2024/0001", NifDestinatario = "B12345678",
NombreDestinatario = "Empresa Ejemplo SL",
BaseImponible = 10000m, CuotaIVA = 2100m,
FechaOperacion = new DateTime(2024, 1, 15) },
new FacturaSII { NumFactura = "2024/0002", NifDestinatario = "A87654321",
NombreDestinatario = "Corporación Ibérica SA",
BaseImponible = 5000m, CuotaIVA = 1050m,
FechaOperacion = new DateTime(2024, 1, 20) },
new FacturaSII { NumFactura = "2024/0003", NifDestinatario = "B11223344",
NombreDestinatario = "Soluciones Digitales SLU",
BaseImponible = 3500m, CuotaIVA = 735m,
FechaOperacion = new DateTime(2024, 1, 28) }
};
// Convertir la lista de facturas SII a DataTable
DataTable dataTable = new DataTable();
dataTable.Columns.Add("Num. Factura", typeof(string));
dataTable.Columns.Add("NIF Destinatario", typeof(string));
dataTable.Columns.Add("Nombre Destinatario", typeof(string));
dataTable.Columns.Add("Base Imponible (EUR)", typeof(decimal));
dataTable.Columns.Add("Cuota IVA (EUR)", typeof(decimal));
dataTable.Columns.Add("Fecha Operación", typeof(DateTime));
foreach (var factura in facturas)
{
dataTable.Rows.Add(factura.NumFactura, factura.NifDestinatario,
factura.NombreDestinatario, factura.BaseImponible,
factura.CuotaIVA, factura.FechaOperacion);
}
// Exportar DataTable al libro de Excel
var workbook = new WorkBook();
var worksheet = workbook.CreateWorkSheet("Facturas Emitidas SII");
// Escribir encabezados de columna
for (int i = 0; i < dataTable.Columns.Count; i++)
{
worksheet.SetCellValue(0, i, dataTable.Columns[i].ColumnName);
}
// Escribir filas de datos
for (int i = 0; i < dataTable.Rows.Count; i++)
{
for (int j = 0; j < dataTable.Columns.Count; j++)
{
worksheet.SetCellValue(i + 1, j, dataTable.Rows[i][j]);
}
}
// Guardar como fichero XLSX para auditoría AEAT
workbook.SaveAs("FacturasEmitidas_SII_2024.xlsx");
}
}
using IronXL;
using System.Collections.Generic;
using System.Data;
public class FacturaSII
{
public string NumFactura { get; set; }
public string NifDestinatario { get; set; }
public string NombreDestinatario { get; set; }
public decimal BaseImponible { get; set; }
public decimal CuotaIVA { get; set; }
public DateTime FechaOperacion { get; set; }
}
class Program
{
static void Main(string[] args)
{
// Lista de registros de facturas emitidas para SII (AEAT)
var facturas = new List<FacturaSII>
{
new FacturaSII { NumFactura = "2024/0001", NifDestinatario = "B12345678",
NombreDestinatario = "Empresa Ejemplo SL",
BaseImponible = 10000m, CuotaIVA = 2100m,
FechaOperacion = new DateTime(2024, 1, 15) },
new FacturaSII { NumFactura = "2024/0002", NifDestinatario = "A87654321",
NombreDestinatario = "Corporación Ibérica SA",
BaseImponible = 5000m, CuotaIVA = 1050m,
FechaOperacion = new DateTime(2024, 1, 20) },
new FacturaSII { NumFactura = "2024/0003", NifDestinatario = "B11223344",
NombreDestinatario = "Soluciones Digitales SLU",
BaseImponible = 3500m, CuotaIVA = 735m,
FechaOperacion = new DateTime(2024, 1, 28) }
};
// Convertir la lista de facturas SII a DataTable
DataTable dataTable = new DataTable();
dataTable.Columns.Add("Num. Factura", typeof(string));
dataTable.Columns.Add("NIF Destinatario", typeof(string));
dataTable.Columns.Add("Nombre Destinatario", typeof(string));
dataTable.Columns.Add("Base Imponible (EUR)", typeof(decimal));
dataTable.Columns.Add("Cuota IVA (EUR)", typeof(decimal));
dataTable.Columns.Add("Fecha Operación", typeof(DateTime));
foreach (var factura in facturas)
{
dataTable.Rows.Add(factura.NumFactura, factura.NifDestinatario,
factura.NombreDestinatario, factura.BaseImponible,
factura.CuotaIVA, factura.FechaOperacion);
}
// Exportar DataTable al libro de Excel
var workbook = new WorkBook();
var worksheet = workbook.CreateWorkSheet("Facturas Emitidas SII");
// Escribir encabezados de columna
for (int i = 0; i < dataTable.Columns.Count; i++)
{
worksheet.SetCellValue(0, i, dataTable.Columns[i].ColumnName);
}
// Escribir filas de datos
for (int i = 0; i < dataTable.Rows.Count; i++)
{
for (int j = 0; j < dataTable.Columns.Count; j++)
{
worksheet.SetCellValue(i + 1, j, dataTable.Rows[i][j]);
}
}
// Guardar como fichero XLSX para auditoría AEAT
workbook.SaveAs("FacturasEmitidas_SII_2024.xlsx");
}
}
Imports IronXL
Imports System.Collections.Generic
Imports System.Data
Public Class FacturaSII
Public Property NumFactura As String
Public Property NifDestinatario As String
Public Property NombreDestinatario As String
Public Property BaseImponible As Decimal
Public Property CuotaIVA As Decimal
Public Property FechaOperacion As DateTime
End Class
Class Program
Shared Sub Main(ByVal args As String())
' Lista de registros de facturas emitidas para SII (AEAT)
Dim facturas As New List(Of FacturaSII) From {
New FacturaSII With {
.NumFactura = "2024/0001",
.NifDestinatario = "B12345678",
.NombreDestinatario = "Empresa Ejemplo SL",
.BaseImponible = 10000D,
.CuotaIVA = 2100D,
.FechaOperacion = New DateTime(2024, 1, 15)
},
New FacturaSII With {
.NumFactura = "2024/0002",
.NifDestinatario = "A87654321",
.NombreDestinatario = "Corporación Ibérica SA",
.BaseImponible = 5000D,
.CuotaIVA = 1050D,
.FechaOperacion = New DateTime(2024, 1, 20)
},
New FacturaSII With {
.NumFactura = "2024/0003",
.NifDestinatario = "B11223344",
.NombreDestinatario = "Soluciones Digitales SLU",
.BaseImponible = 3500D,
.CuotaIVA = 735D,
.FechaOperacion = New DateTime(2024, 1, 28)
}
}
' Convertir la lista de facturas SII a DataTable
Dim dataTable As New DataTable()
dataTable.Columns.Add("Num. Factura", GetType(String))
dataTable.Columns.Add("NIF Destinatario", GetType(String))
dataTable.Columns.Add("Nombre Destinatario", GetType(String))
dataTable.Columns.Add("Base Imponible (EUR)", GetType(Decimal))
dataTable.Columns.Add("Cuota IVA (EUR)", GetType(Decimal))
dataTable.Columns.Add("Fecha Operación", GetType(DateTime))
For Each factura In facturas
dataTable.Rows.Add(factura.NumFactura, factura.NifDestinatario, factura.NombreDestinatario, factura.BaseImponible, factura.CuotaIVA, factura.FechaOperacion)
Next
' Exportar DataTable al libro de Excel
Dim workbook As New WorkBook()
Dim worksheet = workbook.CreateWorkSheet("Facturas Emitidas SII")
' Escribir encabezados de columna
For i As Integer = 0 To dataTable.Columns.Count - 1
worksheet.SetCellValue(0, i, dataTable.Columns(i).ColumnName)
Next
' Escribir filas de datos
For i As Integer = 0 To dataTable.Rows.Count - 1
For j As Integer = 0 To dataTable.Columns.Count - 1
worksheet.SetCellValue(i + 1, j, dataTable.Rows(i)(j))
Next
Next
' Guardar como fichero XLSX para auditoría AEAT
workbook.SaveAs("FacturasEmitidas_SII_2024.xlsx")
End Sub
End Class
Este código de ejemplo demuestra cómo exportar datos a Excel desde una List<FacturaSII> usando IronXL. Primero convierte la lista de facturas en un DataTable, luego escribe manualmente los encabezados de columna y las filas en una hoja de cálculo. IronXL gestiona los tipos de datos como string, decimal y DateTime automáticamente, asegurando un formato limpio en la hoja de cálculo generada. Finalmente, la función de guardado de Excel produce un fichero XLSX guardado como FacturasEmitidas_SII_2024.xlsx, proporcionando una forma sencilla y eficiente de convertir datos C# estructurados en un informe de Excel profesional listo para la AEAT.

¿Cómo exportar objetos de negocio complejos para declaraciones AEAT?
Las aplicaciones .NET del mundo real a menudo implican estructuras de datos más complejas. Cuando se trata de propiedades anidadas, campos calculados o datos jerárquicos, se necesita un enfoque más sofisticado. IronXL destaca en estos escenarios, proporcionando soporte para trabajar con datos en varios formatos.
A continuación se muestra cómo exportar un inventario de operaciones para el modelo 347 (operaciones con terceros superiores a 3.005,06 €), incluyendo la base imponible calculada acumulada:
using IronXL;
using System.Collections.Generic;
using System.Data;
public class OperacionTercero
{
public string NifTercero { get; set; }
public string RazonSocial { get; set; }
public string ClaveOperacion { get; set; } // A=entregada, B=recibida
public decimal ImporteTrimestre1 { get; set; }
public decimal ImporteTrimestre2 { get; set; }
public decimal ImporteTrimestre3 { get; set; }
public decimal ImporteTrimestre4 { get; set; }
public bool SuperaUmbral { get; set; }
public decimal ImporteAnual => ImporteTrimestre1 + ImporteTrimestre2 + ImporteTrimestre3 + ImporteTrimestre4;
}
class Program
{
static void Main(string[] args)
{
// Lista de operaciones con terceros para modelo 347 AEAT
var operaciones = new List<OperacionTercero>
{
new OperacionTercero
{
NifTercero = "B12345678",
RazonSocial = "Proveedor Industrial SL",
ClaveOperacion = "B",
ImporteTrimestre1 = 5000m,
ImporteTrimestre2 = 4500m,
ImporteTrimestre3 = 6000m,
ImporteTrimestre4 = 3200m,
SuperaUmbral = true
},
new OperacionTercero
{
NifTercero = "A87654321",
RazonSocial = "Cliente Corporativo SA",
ClaveOperacion = "A",
ImporteTrimestre1 = 12000m,
ImporteTrimestre2 = 8500m,
ImporteTrimestre3 = 9000m,
ImporteTrimestre4 = 11000m,
SuperaUmbral = true
},
new OperacionTercero
{
NifTercero = "B99887766",
RazonSocial = "Servicio Pequeño SL",
ClaveOperacion = "B",
ImporteTrimestre1 = 500m,
ImporteTrimestre2 = 600m,
ImporteTrimestre3 = 700m,
ImporteTrimestre4 = 800m,
SuperaUmbral = false
}
};
// Crear libro de Excel e importar datos de la colección
var workbook = WorkBook.Create();
var worksheet = workbook.CreateWorkSheet("Modelo 347 AEAT");
// Exportar lista genérica a Excel con encabezados
var dataTable = new DataTable();
dataTable.Columns.Add("NIF Tercero", typeof(string));
dataTable.Columns.Add("Razón Social", typeof(string));
dataTable.Columns.Add("Clave Operación", typeof(string));
dataTable.Columns.Add("T1 (EUR)", typeof(decimal));
dataTable.Columns.Add("T2 (EUR)", typeof(decimal));
dataTable.Columns.Add("T3 (EUR)", typeof(decimal));
dataTable.Columns.Add("T4 (EUR)", typeof(decimal));
dataTable.Columns.Add("Supera 3.005,06 EUR", typeof(bool));
dataTable.Columns.Add("Importe Anual (EUR)", typeof(decimal));
foreach (var op in operaciones)
{
dataTable.Rows.Add(
op.NifTercero, op.RazonSocial, op.ClaveOperacion,
op.ImporteTrimestre1, op.ImporteTrimestre2, op.ImporteTrimestre3, op.ImporteTrimestre4,
op.SuperaUmbral, op.ImporteAnual
);
}
worksheet["A1"].Value = "NIF Tercero";
worksheet["B1"].Value = "Razón Social";
worksheet["C1"].Value = "Clave Operación";
worksheet["D1"].Value = "T1 (EUR)";
worksheet["E1"].Value = "T2 (EUR)";
worksheet["F1"].Value = "T3 (EUR)";
worksheet["G1"].Value = "T4 (EUR)";
worksheet["H1"].Value = "Supera 3.005,06 EUR";
worksheet["I1"].Value = "Importe Anual (EUR)";
int row = 2;
foreach (DataRow dataRow in dataTable.Rows)
{
worksheet[$"A{row}"].Value = dataRow["NIF Tercero"];
worksheet[$"B{row}"].Value = dataRow["Razón Social"];
worksheet[$"C{row}"].Value = dataRow["Clave Operación"];
worksheet[$"D{row}"].Value = dataRow["T1 (EUR)"];
worksheet[$"E{row}"].Value = dataRow["T2 (EUR)"];
worksheet[$"F{row}"].Value = dataRow["T3 (EUR)"];
worksheet[$"G{row}"].Value = dataRow["T4 (EUR)"];
worksheet[$"H{row}"].Value = dataRow["Supera 3.005,06 EUR"];
worksheet[$"I{row}"].Value = dataRow["Importe Anual (EUR)"];
row++;
}
// Ajuste automático de columnas para visualización óptima
for (int col = 0; col < 9; col++)
{
worksheet.AutoSizeColumn(col);
}
// Guardar en formato Excel XLSX para declaración modelo 347 AEAT
workbook.SaveAs("Modelo347_AEAT_2024.xlsx");
}
}
using IronXL;
using System.Collections.Generic;
using System.Data;
public class OperacionTercero
{
public string NifTercero { get; set; }
public string RazonSocial { get; set; }
public string ClaveOperacion { get; set; } // A=entregada, B=recibida
public decimal ImporteTrimestre1 { get; set; }
public decimal ImporteTrimestre2 { get; set; }
public decimal ImporteTrimestre3 { get; set; }
public decimal ImporteTrimestre4 { get; set; }
public bool SuperaUmbral { get; set; }
public decimal ImporteAnual => ImporteTrimestre1 + ImporteTrimestre2 + ImporteTrimestre3 + ImporteTrimestre4;
}
class Program
{
static void Main(string[] args)
{
// Lista de operaciones con terceros para modelo 347 AEAT
var operaciones = new List<OperacionTercero>
{
new OperacionTercero
{
NifTercero = "B12345678",
RazonSocial = "Proveedor Industrial SL",
ClaveOperacion = "B",
ImporteTrimestre1 = 5000m,
ImporteTrimestre2 = 4500m,
ImporteTrimestre3 = 6000m,
ImporteTrimestre4 = 3200m,
SuperaUmbral = true
},
new OperacionTercero
{
NifTercero = "A87654321",
RazonSocial = "Cliente Corporativo SA",
ClaveOperacion = "A",
ImporteTrimestre1 = 12000m,
ImporteTrimestre2 = 8500m,
ImporteTrimestre3 = 9000m,
ImporteTrimestre4 = 11000m,
SuperaUmbral = true
},
new OperacionTercero
{
NifTercero = "B99887766",
RazonSocial = "Servicio Pequeño SL",
ClaveOperacion = "B",
ImporteTrimestre1 = 500m,
ImporteTrimestre2 = 600m,
ImporteTrimestre3 = 700m,
ImporteTrimestre4 = 800m,
SuperaUmbral = false
}
};
// Crear libro de Excel e importar datos de la colección
var workbook = WorkBook.Create();
var worksheet = workbook.CreateWorkSheet("Modelo 347 AEAT");
// Exportar lista genérica a Excel con encabezados
var dataTable = new DataTable();
dataTable.Columns.Add("NIF Tercero", typeof(string));
dataTable.Columns.Add("Razón Social", typeof(string));
dataTable.Columns.Add("Clave Operación", typeof(string));
dataTable.Columns.Add("T1 (EUR)", typeof(decimal));
dataTable.Columns.Add("T2 (EUR)", typeof(decimal));
dataTable.Columns.Add("T3 (EUR)", typeof(decimal));
dataTable.Columns.Add("T4 (EUR)", typeof(decimal));
dataTable.Columns.Add("Supera 3.005,06 EUR", typeof(bool));
dataTable.Columns.Add("Importe Anual (EUR)", typeof(decimal));
foreach (var op in operaciones)
{
dataTable.Rows.Add(
op.NifTercero, op.RazonSocial, op.ClaveOperacion,
op.ImporteTrimestre1, op.ImporteTrimestre2, op.ImporteTrimestre3, op.ImporteTrimestre4,
op.SuperaUmbral, op.ImporteAnual
);
}
worksheet["A1"].Value = "NIF Tercero";
worksheet["B1"].Value = "Razón Social";
worksheet["C1"].Value = "Clave Operación";
worksheet["D1"].Value = "T1 (EUR)";
worksheet["E1"].Value = "T2 (EUR)";
worksheet["F1"].Value = "T3 (EUR)";
worksheet["G1"].Value = "T4 (EUR)";
worksheet["H1"].Value = "Supera 3.005,06 EUR";
worksheet["I1"].Value = "Importe Anual (EUR)";
int row = 2;
foreach (DataRow dataRow in dataTable.Rows)
{
worksheet[$"A{row}"].Value = dataRow["NIF Tercero"];
worksheet[$"B{row}"].Value = dataRow["Razón Social"];
worksheet[$"C{row}"].Value = dataRow["Clave Operación"];
worksheet[$"D{row}"].Value = dataRow["T1 (EUR)"];
worksheet[$"E{row}"].Value = dataRow["T2 (EUR)"];
worksheet[$"F{row}"].Value = dataRow["T3 (EUR)"];
worksheet[$"G{row}"].Value = dataRow["T4 (EUR)"];
worksheet[$"H{row}"].Value = dataRow["Supera 3.005,06 EUR"];
worksheet[$"I{row}"].Value = dataRow["Importe Anual (EUR)"];
row++;
}
// Ajuste automático de columnas para visualización óptima
for (int col = 0; col < 9; col++)
{
worksheet.AutoSizeColumn(col);
}
// Guardar en formato Excel XLSX para declaración modelo 347 AEAT
workbook.SaveAs("Modelo347_AEAT_2024.xlsx");
}
}
Imports IronXL
Imports System.Collections.Generic
Imports System.Data
Public Class OperacionTercero
Public Property NifTercero As String
Public Property RazonSocial As String
Public Property ClaveOperacion As String ' A=entregada, B=recibida
Public Property ImporteTrimestre1 As Decimal
Public Property ImporteTrimestre2 As Decimal
Public Property ImporteTrimestre3 As Decimal
Public Property ImporteTrimestre4 As Decimal
Public Property SuperaUmbral As Boolean
Public ReadOnly Property ImporteAnual As Decimal
Get
Return ImporteTrimestre1 + ImporteTrimestre2 + ImporteTrimestre3 + ImporteTrimestre4
End Get
End Property
End Class
Module Program
Sub Main(args As String())
' Lista de operaciones con terceros para modelo 347 AEAT
Dim operaciones As New List(Of OperacionTercero) From {
New OperacionTercero With {
.NifTercero = "B12345678",
.RazonSocial = "Proveedor Industrial SL",
.ClaveOperacion = "B",
.ImporteTrimestre1 = 5000D,
.ImporteTrimestre2 = 4500D,
.ImporteTrimestre3 = 6000D,
.ImporteTrimestre4 = 3200D,
.SuperaUmbral = True
},
New OperacionTercero With {
.NifTercero = "A87654321",
.RazonSocial = "Cliente Corporativo SA",
.ClaveOperacion = "A",
.ImporteTrimestre1 = 12000D,
.ImporteTrimestre2 = 8500D,
.ImporteTrimestre3 = 9000D,
.ImporteTrimestre4 = 11000D,
.SuperaUmbral = True
},
New OperacionTercero With {
.NifTercero = "B99887766",
.RazonSocial = "Servicio Pequeño SL",
.ClaveOperacion = "B",
.ImporteTrimestre1 = 500D,
.ImporteTrimestre2 = 600D,
.ImporteTrimestre3 = 700D,
.ImporteTrimestre4 = 800D,
.SuperaUmbral = False
}
}
' Crear libro de Excel e importar datos de la colección
Dim workbook = WorkBook.Create()
Dim worksheet = workbook.CreateWorkSheet("Modelo 347 AEAT")
' Exportar lista genérica a Excel con encabezados
Dim dataTable As New DataTable()
dataTable.Columns.Add("NIF Tercero", GetType(String))
dataTable.Columns.Add("Razón Social", GetType(String))
dataTable.Columns.Add("Clave Operación", GetType(String))
dataTable.Columns.Add("T1 (EUR)", GetType(Decimal))
dataTable.Columns.Add("T2 (EUR)", GetType(Decimal))
dataTable.Columns.Add("T3 (EUR)", GetType(Decimal))
dataTable.Columns.Add("T4 (EUR)", GetType(Decimal))
dataTable.Columns.Add("Supera 3.005,06 EUR", GetType(Boolean))
dataTable.Columns.Add("Importe Anual (EUR)", GetType(Decimal))
For Each op In operaciones
dataTable.Rows.Add(op.NifTercero, op.RazonSocial, op.ClaveOperacion,
op.ImporteTrimestre1, op.ImporteTrimestre2, op.ImporteTrimestre3, op.ImporteTrimestre4,
op.SuperaUmbral, op.ImporteAnual)
Next
worksheet("A1").Value = "NIF Tercero"
worksheet("B1").Value = "Razón Social"
worksheet("C1").Value = "Clave Operación"
worksheet("D1").Value = "T1 (EUR)"
worksheet("E1").Value = "T2 (EUR)"
worksheet("F1").Value = "T3 (EUR)"
worksheet("G1").Value = "T4 (EUR)"
worksheet("H1").Value = "Supera 3.005,06 EUR"
worksheet("I1").Value = "Importe Anual (EUR)"
Dim row As Integer = 2
For Each dataRow As DataRow In dataTable.Rows
worksheet($"A{row}").Value = dataRow("NIF Tercero")
worksheet($"B{row}").Value = dataRow("Razón Social")
worksheet($"C{row}").Value = dataRow("Clave Operación")
worksheet($"D{row}").Value = dataRow("T1 (EUR)")
worksheet($"E{row}").Value = dataRow("T2 (EUR)")
worksheet($"F{row}").Value = dataRow("T3 (EUR)")
worksheet($"G{row}").Value = dataRow("T4 (EUR)")
worksheet($"H{row}").Value = dataRow("Supera 3.005,06 EUR")
worksheet($"I{row}").Value = dataRow("Importe Anual (EUR)")
row += 1
Next
' Ajuste automático de columnas para visualización óptima
For col As Integer = 0 To 8
worksheet.AutoSizeColumn(col)
Next
' Guardar en formato Excel XLSX para declaración modelo 347 AEAT
workbook.SaveAs("Modelo347_AEAT_2024.xlsx")
End Sub
End Module
Este código demuestra cómo generar un informe dinámico de operaciones con terceros para el modelo 347 de la AEAT usando IronXL. Construye una lista de objetos OperacionTercero con los datos trimestrales por NIF, calcula el importe anual como propiedad derivada y la exporta a XLSX. IronXL gestiona sin problemas tipos de datos como decimales y booleanos, asegurando una salida de hoja de cálculo profesional. El resultado, Modelo347_AEAT_2024.xlsx, proporciona una exportación de datos limpia ideal para la presentación de la declaración anual de operaciones con terceros.

¿Cómo agregar formato profesional para informes AEAT y Banco de España?
Transforma las exportaciones básicas en informes pulidos con las capacidades de estilo de IronXL. El formato profesional es especialmente importante cuando los ficheros XLSX se presentan ante la AEAT, el Banco de España o la CNMV como documentación de soporte, ya que facilita su revisión por parte de los auditores y supervisores. IronXL proporciona opciones de formato extensas incluyendo personalización de fuente y tamaño de celda, patrones de fondo y colores, y configuración de bordes y alineación:
// Después de importar datos, aplicar formato profesional
var headerRange = worksheet["A1:I1"];
headerRange.Style.Font.Bold = true;
headerRange.Style.BackgroundColor = "#4472C4";
headerRange.Style.Font.Color = "#FFFFFF";
// Formatear columnas de importe en euros
var importeRange = worksheet["D2:I100"];
importeRange.Style.NumberFormat = "#,##0.00";
// Aplicar formato condicional: resaltar en rojo las operaciones que superan el umbral del modelo 347
for (int r = 2; r <= operaciones.Count + 1; r++)
{
var umbralCell = worksheet[$"H{r}"];
if (umbralCell.BoolValue == true)
{
umbralCell.Style.BackgroundColor = "#FFD700";
}
}
// Exportar lista formateada a fichero Excel
workbook.SaveAs("Modelo347_AEAT_Formateado.xlsx");
// Después de importar datos, aplicar formato profesional
var headerRange = worksheet["A1:I1"];
headerRange.Style.Font.Bold = true;
headerRange.Style.BackgroundColor = "#4472C4";
headerRange.Style.Font.Color = "#FFFFFF";
// Formatear columnas de importe en euros
var importeRange = worksheet["D2:I100"];
importeRange.Style.NumberFormat = "#,##0.00";
// Aplicar formato condicional: resaltar en rojo las operaciones que superan el umbral del modelo 347
for (int r = 2; r <= operaciones.Count + 1; r++)
{
var umbralCell = worksheet[$"H{r}"];
if (umbralCell.BoolValue == true)
{
umbralCell.Style.BackgroundColor = "#FFD700";
}
}
// Exportar lista formateada a fichero Excel
workbook.SaveAs("Modelo347_AEAT_Formateado.xlsx");
' Después de importar datos, aplicar formato profesional
Dim headerRange = worksheet("A1:I1")
headerRange.Style.Font.Bold = True
headerRange.Style.BackgroundColor = "#4472C4"
headerRange.Style.Font.Color = "#FFFFFF"
' Formatear columnas de importe en euros
Dim importeRange = worksheet("D2:I100")
importeRange.Style.NumberFormat = "#,##0.00"
' Aplicar formato condicional: resaltar en rojo las operaciones que superan el umbral del modelo 347
For r As Integer = 2 To operaciones.Count + 1
Dim umbralCell = worksheet($"H{r}")
If umbralCell.BoolValue = True Then
umbralCell.Style.BackgroundColor = "#FFD700"
End If
Next
' Exportar lista formateada a fichero Excel
workbook.SaveAs("Modelo347_AEAT_Formateado.xlsx")
Estas opciones de estilo transforman exportaciones de datos en bruto en informes listos para auditores y organismos reguladores españoles. Los encabezados en negrita con colores de fondo crean jerarquía visual. El formato numérico asegura que los importes en euros se muestren correctamente con el separador de miles y decimal adecuado para el estándar contable español. El formato condicional resalta las operaciones que superan el umbral de 3.005,06 € para el modelo 347, haciendo la hoja de cálculo exportada inmediatamente útil para la gestión fiscal.
Además del formato básico, IronXL soporta funciones avanzadas como crear gráficos Excel para visualizar los datos exportados, añadir hipervínculos, inmovilizar paneles para mejor navegación de grandes conjuntos de datos, e incluso combinar celdas para crear diseños de informes sofisticados.

¿Cómo exportar listas para TicketBAI y VeriFactu desde C#?
Las empresas del País Vasco deben generar exportaciones XLSX conformes con TicketBAI (vigente en Bizkaia, Gipuzkoa y Araba). IronXL permite exportar una List<FacturaTicketBAI> con todos los campos requeridos (NIF emisor, serie, número, fecha, importes) directamente a XLSX desde código C#, listo para integración con los sistemas de firma y envío a las haciendas forales.
Por otro lado, el Real Decreto-Ley 15/2025 sobre VeriFactu (VERI*FACTU) exige que los sistemas de facturación generen registros verificables. Con IronXL puedes construir un List<RegistroVeriFactu> y exportarlo a XLSX como copia de soporte de los registros de facturas VERI*FACTU, sin dependencias de Office en los servidores de producción.
En lo que respecta a la LOPDGDD, al exportar List<T> con IronXL puedes seleccionar explícitamente qué propiedades mapear a columnas Excel, exportando únicamente los datos mínimos necesarios para cada declaración AEAT y evitando incluir datos personales adicionales que no sean exigidos por la normativa fiscal.
¿Cuál es la mejor manera de empezar con IronXL?
IronXL transforma la compleja tarea de generación de Excel en un código sencillo y mantenible. Su método ImportData elimina la necesidad de dependencias de Microsoft Office, proporcionando resultados profesionales que cumplen los requisitos empresariales y regulatorios españoles. El conjunto de características de la biblioteca gestiona desde exportaciones de listas básicas hasta transformaciones de datos complejas con estilo y formato.
Empezar con IronXL es directo. La biblioteca soporta varios escenarios de implementación incluyendo contenedores Docker (ideal para arquitecturas SII en la nube), entornos Linux y sistemas macOS. Para implementaciones empresariales, IronXL proporciona opciones de licenciamiento completas.
La biblioteca también destaca en operaciones de intercambio de datos. Puedes convertir XLSX a CSV, escribir ficheros CSV, leer datos CSV, e incluso convertir DataTables a CSV. Para aplicaciones web, IronXL se integra con ASP.NET MVC y Blazor.
¿Listo para optimizar tus exportaciones de Excel en C# para cumplimiento SII y AEAT? Descarga IronXL ahora con el plan que se ajusta a tus necesidades. Visita nuestra documentación completa para más tutoriales y ejemplos. Explora la referencia API para especificaciones técnicas detalladas y descubre cómo IronXL puede transformar tus flujos de trabajo de automatización de Excel.
Preguntas Frecuentes
¿Cómo puedo exportar una List de registros SII a XLSX para la AEAT sin Microsoft Office?
Con IronXL en C# puedes convertir tu List
¿Puedo generar el modelo 303, 347 y 390 de la AEAT como XLSX exportando listas de C# con IronXL?
Sí. El flujo habitual es: crear una List
¿IronXL cumple con la LOPDGDD al exportar listas de C# a Excel para la AEAT?
IronXL permite exportar únicamente las propiedades necesarias de cada objeto al XLSX, aplicando el principio de minimización de datos de la LOPDGDD. Solo se exportan los campos exigidos por la AEAT (NIF, importes, fechas), sin incluir datos personales adicionales.
¿Puede usarse IronXL con .NET Core en entornos Linux para sistemas SII?
Sí, IronXL es compatible con .NET Core, .NET 8, .NET 10 y se ejecuta de forma nativa en Linux y Docker, lo que lo hace ideal para las arquitecturas de microservicios en la nube que utilizan los sistemas SII de las grandes empresas españolas.
¿Puede IronXL generar XLSX para TicketBAI exportando listas de C#?
Sí. Puedes crear una List
¿Qué tipos de listas de C# pueden ser exportadas usando IronXL para declaraciones AEAT?
IronXL puede exportar cualquier List
¿Soporta IronXL la creación de hojas de cálculo XLSX para el Banco de España y la CNMV?
Sí. Las entidades financieras reguladas pueden exportar sus listas de datos prudenciales y supervisores a XLSX con IronXL, que se ejecuta sin Office en los servidores de producción, cumpliendo los requisitos de informes regulatorios del Banco de España y la CNMV.
¿Qué beneficio proporciona IronXL sobre los métodos tradicionales de creación de archivos Excel?
IronXL elimina las complejidades tradicionales y las dependencias de Office Interop, ofreciendo una solución que funciona en Linux, Docker y la nube sin necesidad de instalar Microsoft Office, lo que es fundamental para los entornos de producción de los sistemas SII y de declaraciones AEAT.



