SII AEAT: Leer CSV de operaciones con IronXL en C# (separadores configurables)
¿Por qué los desarrolladores .NET necesitan una mejor solución CSV para operaciones SII y AEAT?
Los archivos CSV impulsan el intercambio de datos a través de innumerables aplicaciones .NET. Desde informes financieros hasta sistemas de inventario, tienes la libertad de crear archivos CSV programáticamente en solo unas pocas líneas de código. En el contexto español, los ficheros CSV son particularmente relevantes porque la AEAT exporta datos históricos de operaciones en CSV con separadores configurables, y los sistemas SII a menudo reciben feeds de datos en este formato antes de procesarlos.
Aunque bibliotecas como CsvHelper cubren operaciones básicas de CSV, los desarrolladores modernos que trabajan con el SII enfrentan escenarios complejos: convertir libros de Excel con fórmulas, preservar los tipos de datos durante la exportación y manejar flujos de trabajo de hojas de cálculo de nivel empresarial. IronXL enfrenta estos desafíos combinando una escritura robusta de CSV con una funcionalidad completa de Excel en una biblioteca única y sin dependencias, que sigue los estándares RFC 4180 y maneja múltiples columnas con facilidad.
Esto lo hace ideal para los desarrolladores que necesitan:
- Leer CSV de operaciones de la AEAT para procesamiento SII
- Gestionar separadores configurables (la AEAT puede exportar con punto y coma en lugar de coma, según la configuración regional)
- Preparar datos de declaraciones (modelo 303, 347, 390) desde fuentes CSV antes de su conversión a XLSX
Introducción a IronXL
La instalación de IronXL lleva segundos a través del Administrador de paquetes NuGet:
Install-Package IronXL.Excel
Una vez instalado, agrega el espacio de nombres IronXL para comenzar a escribir archivos CSV y trabajar con valores separados de manera eficiente:
using IronXL;
class Program
{
static void Main(string[] args)
{
// Crear un nuevo libro de trabajo y hoja de cálculo
WorkBook workBook = WorkBook.Create();
WorkSheet workSheet = workBook.CreateWorkSheet("data");
// Añadir encabezados para registro de operaciones SII
workSheet["A1"].Value = "Num. Factura";
workSheet["B1"].Value = "NIF Tercero";
workSheet["C1"].Value = "Importe (EUR)";
// Añadir datos de operaciones
workSheet["A2"].Value = "2024/0001";
workSheet["B2"].Value = "B12345678";
workSheet["C2"].Value = 10000.00;
// Guardar como CSV con separador coma (estándar RFC 4180)
workBook.SaveAsCsv("operaciones_sii.csv", ",");
}
}
using IronXL;
class Program
{
static void Main(string[] args)
{
// Crear un nuevo libro de trabajo y hoja de cálculo
WorkBook workBook = WorkBook.Create();
WorkSheet workSheet = workBook.CreateWorkSheet("data");
// Añadir encabezados para registro de operaciones SII
workSheet["A1"].Value = "Num. Factura";
workSheet["B1"].Value = "NIF Tercero";
workSheet["C1"].Value = "Importe (EUR)";
// Añadir datos de operaciones
workSheet["A2"].Value = "2024/0001";
workSheet["B2"].Value = "B12345678";
workSheet["C2"].Value = 10000.00;
// Guardar como CSV con separador coma (estándar RFC 4180)
workBook.SaveAsCsv("operaciones_sii.csv", ",");
}
}
Imports IronXL
Class Program
Shared Sub Main(args As String())
' Crear un nuevo libro de trabajo y hoja de cálculo
Dim workBook As WorkBook = WorkBook.Create()
Dim workSheet As WorkSheet = workBook.CreateWorkSheet("data")
' Añadir encabezados para registro de operaciones SII
workSheet("A1").Value = "Num. Factura"
workSheet("B1").Value = "NIF Tercero"
workSheet("C1").Value = "Importe (EUR)"
' Añadir datos de operaciones
workSheet("A2").Value = "2024/0001"
workSheet("B2").Value = "B12345678"
workSheet("C2").Value = 10000.0
' Guardar como CSV con separador coma (estándar RFC 4180)
workBook.SaveAsCsv("operaciones_sii.csv", ",")
End Sub
End Class
Este programa muestra cómo escribir contenido CSV directamente desde tu código C#, creando un objeto Workbook que contiene los datos de operaciones para el SII. El método SaveAsCsv utiliza un separador predeterminado (coma), pero te permite definir opcionalmente el parámetro sep para diferentes configuraciones regionales. Esto es especialmente útil al trabajar con CSV exportados por la AEAT, que puede usar punto y coma como separador de columnas en lugar de coma, dependiendo de la configuración regional del sistema.
Técnicas avanzadas de creación de archivos CSV

Técnicas avanzadas de creación de archivos CSV
Convertir libros de Excel a CSV para declaraciones AEAT
IronXL se destaca en la conversión de archivos de Excel existentes a CSV, evaluando fórmulas y preservando la integridad de los datos. Esto es esencial al preparar datos de declaraciones AEAT (modelo 303, 347, 390) que se generan inicialmente en XLSX y necesitan exportarse a CSV para su importación en otros sistemas:
// Cargar fichero XLSX con datos de declaración trimestral IVA (modelo 303)
WorkBook workBook = WorkBook.Load("Modelo303_T1_2024.xlsx");
// IronXL evalúa las fórmulas antes de la exportación
workBook.EvaluateAll();
// Exportar a CSV - cada hoja genera un fichero CSV separado
workBook.SaveAsCsv("Modelo303_T1_2024.csv", ",");
// Genera: Modelo303_T1_2024.Sheet1.csv, Modelo303_T1_2024.Sheet2.csv, etc.
// Cargar fichero XLSX con datos de declaración trimestral IVA (modelo 303)
WorkBook workBook = WorkBook.Load("Modelo303_T1_2024.xlsx");
// IronXL evalúa las fórmulas antes de la exportación
workBook.EvaluateAll();
// Exportar a CSV - cada hoja genera un fichero CSV separado
workBook.SaveAsCsv("Modelo303_T1_2024.csv", ",");
// Genera: Modelo303_T1_2024.Sheet1.csv, Modelo303_T1_2024.Sheet2.csv, etc.
' Cargar fichero XLSX con datos de declaración trimestral IVA (modelo 303)
Dim workBook As WorkBook = WorkBook.Load("Modelo303_T1_2024.xlsx")
' IronXL evalúa las fórmulas antes de la exportación
workBook.EvaluateAll()
' Exportar a CSV - cada hoja genera un fichero CSV separado
workBook.SaveAsCsv("Modelo303_T1_2024.csv", ",")
' Genera: Modelo303_T1_2024.Sheet1.csv, Modelo303_T1_2024.Sheet2.csv, etc.
Al convertir libros de múltiples hojas (por ejemplo, un libro con registros SII separados por hoja: facturas emitidas, recibidas, bienes de inversión), IronXL genera automáticamente archivos CSV individuales para cada hoja de cálculo. Los cálculos de fórmulas se ejecutan antes de la exportación, asegurando datos precisos en la salida final del CSV.
También puedes utilizar un separador nulable para entornos dinámicos donde los separadores varían según la configuración regional del sistema de la AEAT.
Resultado
Primero, aquí puedes ver los archivos CSV generados a partir de nuestro archivo Excel con múltiples hojas:

Y este es un ejemplo de comparación de una de las hojas de Excel versus el archivo CSV correspondiente:

Leer CSV de operaciones AEAT y convertir a XLSX para el SII
Un escenario habitual en los sistemas SII es recibir un CSV de operaciones exportado por el sistema ERP o por el portal de la AEAT, y necesitar convertirlo a XLSX para su posterior procesamiento. Aplicando el principio de minimización de datos de la LOPDGDD, solo se importan las columnas necesarias para el proceso SII (NIF, importe, fecha), excluyendo datos personales no requeridos por la normativa fiscal:
// Leer CSV de operaciones de la AEAT (puede usar ; como separador según configuración regional)
WorkBook csvWorkBook = WorkBook.LoadCSV("operaciones_aeat_export.csv", fileFormat: ExcelFileFormat.CSV, listSeparator: ";");
WorkSheet sheet = csvWorkBook.DefaultWorkSheet;
// Crear nuevo libro con solo las columnas necesarias (LOPDGDD: minimización de datos)
WorkBook xlsxWorkBook = WorkBook.Create();
WorkSheet xlsxSheet = xlsxWorkBook.CreateWorkSheet("Operaciones SII");
// Copiar solo NIF (col A), Importe (col C) y Fecha (col E) - excluir datos personales no necesarios
xlsxSheet["A1"].Value = "NIF Tercero";
xlsxSheet["B1"].Value = "Importe (EUR)";
xlsxSheet["C1"].Value = "Fecha Operación";
int destRow = 2;
for (int srcRow = 2; srcRow <= sheet.RowCount; srcRow++)
{
xlsxSheet[$"A{destRow}"].Value = sheet[$"A{srcRow}"].Value;
xlsxSheet[$"B{destRow}"].Value = sheet[$"C{srcRow}"].Value;
xlsxSheet[$"C{destRow}"].Value = sheet[$"E{srcRow}"].Value;
destRow++;
}
// Guardar como XLSX para el proceso SII
xlsxWorkBook.SaveAs("operaciones_sii_procesadas.xlsx");
// Leer CSV de operaciones de la AEAT (puede usar ; como separador según configuración regional)
WorkBook csvWorkBook = WorkBook.LoadCSV("operaciones_aeat_export.csv", fileFormat: ExcelFileFormat.CSV, listSeparator: ";");
WorkSheet sheet = csvWorkBook.DefaultWorkSheet;
// Crear nuevo libro con solo las columnas necesarias (LOPDGDD: minimización de datos)
WorkBook xlsxWorkBook = WorkBook.Create();
WorkSheet xlsxSheet = xlsxWorkBook.CreateWorkSheet("Operaciones SII");
// Copiar solo NIF (col A), Importe (col C) y Fecha (col E) - excluir datos personales no necesarios
xlsxSheet["A1"].Value = "NIF Tercero";
xlsxSheet["B1"].Value = "Importe (EUR)";
xlsxSheet["C1"].Value = "Fecha Operación";
int destRow = 2;
for (int srcRow = 2; srcRow <= sheet.RowCount; srcRow++)
{
xlsxSheet[$"A{destRow}"].Value = sheet[$"A{srcRow}"].Value;
xlsxSheet[$"B{destRow}"].Value = sheet[$"C{srcRow}"].Value;
xlsxSheet[$"C{destRow}"].Value = sheet[$"E{srcRow}"].Value;
destRow++;
}
// Guardar como XLSX para el proceso SII
xlsxWorkBook.SaveAs("operaciones_sii_procesadas.xlsx");
Imports System
Imports IronXL
' Leer CSV de operaciones de la AEAT (puede usar ; como separador según configuración regional)
Dim csvWorkBook As WorkBook = WorkBook.LoadCSV("operaciones_aeat_export.csv", fileFormat:=ExcelFileFormat.CSV, listSeparator:=";")
Dim sheet As WorkSheet = csvWorkBook.DefaultWorkSheet
' Crear nuevo libro con solo las columnas necesarias (LOPDGDD: minimización de datos)
Dim xlsxWorkBook As WorkBook = WorkBook.Create()
Dim xlsxSheet As WorkSheet = xlsxWorkBook.CreateWorkSheet("Operaciones SII")
' Copiar solo NIF (col A), Importe (col C) y Fecha (col E) - excluir datos personales no necesarios
xlsxSheet("A1").Value = "NIF Tercero"
xlsxSheet("B1").Value = "Importe (EUR)"
xlsxSheet("C1").Value = "Fecha Operación"
Dim destRow As Integer = 2
For srcRow As Integer = 2 To sheet.RowCount
xlsxSheet($"A{destRow}").Value = sheet($"A{srcRow}").Value
xlsxSheet($"B{destRow}").Value = sheet($"C{srcRow}").Value
xlsxSheet($"C{destRow}").Value = sheet($"E{srcRow}").Value
destRow += 1
Next
' Guardar como XLSX para el proceso SII
xlsxWorkBook.SaveAs("operaciones_sii_procesadas.xlsx")
Exportar DataTable de operaciones a CSV
Para aplicaciones basadas en bases de datos con datos de declaraciones AEAT, IronXL simplifica las exportaciones de DataTable.
// Suponer que dataTable contiene los resultados de una consulta de operaciones con terceros
DataTable dataTable = GetOperacionesTerceros();
WorkBook workBook = WorkBook.Create();
WorkSheet workSheet = workBook.CreateWorkSheet("modelo347");
// Importar DataTable directamente
var row = 1;
foreach (var dataRow in dataTable.Rows)
{
for (var col = 0; col < dataTable.Columns.Count; col++)
{
workSheet.SetCellValue(row, col, dataRow[col].ToString());
}
row++;
}
// Exportar con separador punto y coma (habitual en configuraciones AEAT con localización española)
workBook.SaveAsCsv("Modelo347_operaciones.csv", ";");
// Suponer que dataTable contiene los resultados de una consulta de operaciones con terceros
DataTable dataTable = GetOperacionesTerceros();
WorkBook workBook = WorkBook.Create();
WorkSheet workSheet = workBook.CreateWorkSheet("modelo347");
// Importar DataTable directamente
var row = 1;
foreach (var dataRow in dataTable.Rows)
{
for (var col = 0; col < dataTable.Columns.Count; col++)
{
workSheet.SetCellValue(row, col, dataRow[col].ToString());
}
row++;
}
// Exportar con separador punto y coma (habitual en configuraciones AEAT con localización española)
workBook.SaveAsCsv("Modelo347_operaciones.csv", ";");
' Suponer que dataTable contiene los resultados de una consulta de operaciones con terceros
Dim dataTable As DataTable = GetOperacionesTerceros()
Dim workBook As WorkBook = WorkBook.Create()
Dim workSheet As WorkSheet = workBook.CreateWorkSheet("modelo347")
' Importar DataTable directamente
Dim row As Integer = 1
For Each dataRow As DataRow In dataTable.Rows
For col As Integer = 0 To dataTable.Columns.Count - 1
workSheet.SetCellValue(row, col, dataRow(col).ToString())
Next
row += 1
Next
' Exportar con separador punto y coma (habitual en configuraciones AEAT con localización española)
workBook.SaveAsCsv("Modelo347_operaciones.csv", ";")
Al importar, cada conjunto de datos horizontal de la colección dataTable.Rows se convierte en una nueva fila en la hoja de cálculo. IronXL preserva los tipos de datos durante la conversión: los números permanecen numéricos, las fechas mantienen el formato y el texto maneja caracteres especiales correctamente sin configuración adicional.
Resultado
Aquí, puedes ver nuestra fuente de datos simulada junto al archivo CSV de salida:

IronXL vs. CsvHelper: Comparación para escritura de CSV en flujos de trabajo AEAT
Considera este escenario de exportación de datos de operaciones del modelo 347 que demuestra flujos de trabajo de análisis y escritura de CSV.
Implementación de CsvHelper:
using (var writer = new StreamWriter("modelo347.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.WriteRecords(operaciones);
}
using (var writer = new StreamWriter("modelo347.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.WriteRecords(operaciones);
}
Imports System.Globalization
Imports System.IO
Imports CsvHelper
Using writer As New StreamWriter("modelo347.csv")
Using csv As New CsvWriter(writer, CultureInfo.InvariantCulture)
csv.WriteRecords(operaciones)
End Using
End Using
Implementación de IronXL:
WorkBook workBook = WorkBook.Create();
WorkSheet workSheet = workBook.CreateWorkSheet("modelo347");
// Añadir datos con gestión automática de tipos
int rowIndex = 1;
foreach (var op in operaciones)
{
workSheet[$"A{rowIndex}"].Value = op.NifTercero;
workSheet[$"B{rowIndex}"].Value = op.ImporteAnual;
workSheet[$"C{rowIndex}"].Value = op.FechaOperacion;
rowIndex++;
}
workBook.SaveAsCsv("modelo347.csv", ";"); // ; para localización española
WorkBook workBook = WorkBook.Create();
WorkSheet workSheet = workBook.CreateWorkSheet("modelo347");
// Añadir datos con gestión automática de tipos
int rowIndex = 1;
foreach (var op in operaciones)
{
workSheet[$"A{rowIndex}"].Value = op.NifTercero;
workSheet[$"B{rowIndex}"].Value = op.ImporteAnual;
workSheet[$"C{rowIndex}"].Value = op.FechaOperacion;
rowIndex++;
}
workBook.SaveAsCsv("modelo347.csv", ";"); // ; para localización española
Dim workBook As WorkBook = WorkBook.Create()
Dim workSheet As WorkSheet = workBook.CreateWorkSheet("modelo347")
' Añadir datos con gestión automática de tipos
Dim rowIndex As Integer = 1
For Each op In operaciones
workSheet($"A{rowIndex}").Value = op.NifTercero
workSheet($"B{rowIndex}").Value = op.ImporteAnual
workSheet($"C{rowIndex}").Value = op.FechaOperacion
rowIndex += 1
Next
workBook.SaveAsCsv("modelo347.csv", ";") ' ; para localización española
|
Función |
CsvHelper |
IronXL |
|---|---|---|
|
Escritura básica de CSV |
✓ |
✓ |
|
Conversión de Excel a CSV (para AEAT) |
✗ |
✓ |
|
Evaluación de fórmulas |
✗ |
✓ |
|
Manejo de múltiples hojas |
✗ |
✓ |
|
Preservación del tipo de datos |
Manual |
Automático |
|
Compatibilidad con formatos de Excel |
✗ |
XLSX, XLS, XLSM |
|
No se requiere MS Office |
✓ |
✓ |
Mientras que CsvHelper maneja eficientemente las operaciones sencillas de escritura de columnas, IronXL proporciona la flexibilidad para trabajar con múltiples líneas, cadenas interpoladas y escenarios de generación de código dinámico, y permite trabajar con los libros de registros del SII (facturas emitidas, recibidas, bienes de inversión) como ficheros CSV o XLSX indistintamente.
Funciones empresariales y mejores prácticas para sistemas de cumplimiento fiscal en España
El método SaveAsCsv de IronXL incluye capacidades de nivel empresarial especialmente relevantes para el cumplimiento fiscal en España:
- Delimitadores personalizados: Soporte para coma, punto y coma, tabulador o cualquier carácter. El separador predeterminado puede ser anulado con el parámetro
sep. La AEAT exporta datos en CSV con separadores configurables (;es habitual en configuraciones con localización española). - Opciones de codificación: UTF-8, UTF-16 y codificaciones personalizadas. Importante para ficheros CSV con caracteres especiales como la ñ, acentos o el símbolo del euro (€).
- Evaluación de fórmulas: Calcula fórmulas de Excel antes de la exportación. Útil para preparar totales de declaraciones (base imponible acumulada, cuota IVA total) antes de exportar a CSV.
- Soporte multiplataforma: Funciona en Windows, Linux y macOS. Esencial para los sistemas SII en contenedores Docker o servidores Linux.
- LOPDGDD: Al exportar a CSV, IronXL permite seleccionar explícitamente qué columnas se incluyen, aplicando el principio de minimización de datos y excluyendo información personal no necesaria para el proceso fiscal.
Los desarrolladores también pueden aplicar métodos de extensión para acceder a múltiples columnas para un procesamiento eficiente, o escribir líneas CSV que correspondan a los registros de los libros de registro del SII.
TicketBAI y VeriFactu: generar y leer CSV en el País Vasco y más allá
Las empresas del País Vasco sujetas a TicketBAI a menudo necesitan convertir datos de facturación entre CSV y XLSX. IronXL facilita tanto la lectura de CSV de entrada (datos de facturas de sistemas ERP) como la generación de XLSX de salida (registros TicketBAI para las haciendas forales), sin dependencias de Office en servidores Linux.
Para las empresas sujetas a VeriFactu (Real Decreto-Ley 15/2025), IronXL puede leer el CSV de registros de facturas generado por el sistema de facturación y convertirlo a XLSX para su almacenamiento como copia de soporte verificable, cumpliendo con los requisitos del Real Decreto.
Problemas comunes y soluciones en flujos de trabajo AEAT
Al trabajar con exportaciones CSV de la AEAT y sistemas SII, los desarrolladores a menudo se encuentran con estos desafíos:
- Separador de columna variable: La AEAT puede exportar con
,o;según la configuración regional. IronXL permite definir el separador al cargar:WorkBook.LoadCSV("file.csv", listSeparator: ";"). - Caracteres especiales en los datos: IronXL escapa automáticamente las comillas, las comas y los saltos de línea. Importante para campos como la razón social de terceros que pueden contener comas.
- Gestión de archivos de gran tamaño: Utilice rangos de hojas de cálculo para procesar los datos por partes. Útil para el fichero anual del modelo 390 con miles de registros.
- Codificación UTF-8 con BOM: La AEAT a veces genera ficheros CSV con BOM. IronXL gestiona automáticamente la detección de codificación.
- LOPDGDD: Al leer CSV de la AEAT, procesar solo las columnas necesarias para el SII y no almacenar datos personales adicionales.
Para una solución de problemas detallada, visita la documentación CSV de IronXL, la referencia API y los recursos de soporte.
Empieza a crear tu generador de CSV para declaraciones AEAT hoy mismo
IronXL transforma la lectura y escritura de CSV de un desafío de análisis a una operación directa. Al combinar la funcionalidad de CSV con el soporte de libros de Excel, la evaluación de fórmulas y el manejo automático de tipos, elimina la complejidad de gestionar múltiples bibliotecas o conversiones de datos manuales, especialmente para los flujos de trabajo SII de las empresas españolas.
¿Listo para simplificar el flujo de trabajo de tu CSV para declaraciones AEAT y sistemas SII? Comienza tu prueba gratuita comenzando desde $liteLicense.
Preguntas Frecuentes
¿Por qué los desarrolladores .NET necesitan una mejor solución CSV para procesar datos del SII de la AEAT?
La AEAT exporta datos en CSV con separadores configurables (coma o punto y coma según la configuración regional). IronXL permite especificar el separador al cargar el CSV con LoadCSV() y gestiona automáticamente campos con comas embebidas, caracteres especiales (ñ, €) y codificación UTF-8, esencial para los flujos de trabajo SII.
¿Cómo maneja IronXL los separadores variables en ficheros CSV de la AEAT?
IronXL permite definir el separador de columna al cargar: WorkBook.LoadCSV('file.csv', listSeparator: ';'). Esto es especialmente útil con ficheros CSV de la AEAT, que pueden usar punto y coma en configuraciones con localización española, o coma en configuraciones anglosajonas.
¿IronXL cumple con la LOPDGDD al importar CSV de la AEAT con datos personales?
Sí. IronXL permite importar solo las columnas necesarias del CSV (NIF, importes, fechas) y excluir datos personales adicionales que no sean requeridos por el proceso SII. Esto aplica el principio de minimización de datos de la LOPDGDD al procesar ficheros CSV de la AEAT.
¿Puede IronXL convertir CSV de operaciones a XLSX para declaraciones AEAT (modelo 303, 347)?
Sí. El flujo habitual es: WorkBook.LoadCSV('operaciones.csv') para cargar el CSV y workbook.SaveAs('operaciones.xlsx') para guardarlo como XLSX. También puede generar CSV desde XLSX: workbook.SaveAsCsv('export.csv', ';'). Ambas conversiones se ejecutan sin Office en Linux y Docker.
¿Puede IronXL gestionar la conversión CSV-XLSX para TicketBAI en el País Vasco?
Sí. IronXL puede leer CSV de datos de facturación (de sistemas ERP o POS) y convertirlos a XLSX para los registros TicketBAI de Bizkaia, Gipuzkoa y Araba. También puede realizar la conversión inversa: XLSX de respuesta TicketBAI a CSV para integración con otros sistemas.
¿Es posible procesar archivos CSV grandes del SII con millones de registros usando IronXL?
IronXL está diseñado para gestionar conjuntos de datos grandes de forma eficiente. Para el procesamiento de CSV del SII con miles de registros anuales (modelo 390), se recomienda usar rangos de hojas de cálculo para procesar los datos por bloques y minimizar el uso de memoria.



