Saltar al pie de página
USANDO IRONXL

IronXL vs Microsoft Excel Interop para SII/AEAT en Docker: sin licencia Office

Si alguna vez has intentado generar un fichero XLSX del SII (Suministro Inmediato de Información) o de los modelos 303/347/390 de la AEAT usando Microsoft.Office.Interop.Excel en C#, ya conoces la frustración: incompatibilidades de versiones, fugas de objetos COM, y el requisito indispensable de que Microsoft Office esté instalado en cada servidor que ejecute el código. En los entornos de producción españoles —donde los microservicios de cumplimiento fiscal se despliegan en Linux y Docker— Interop simplemente no funciona. En este artículo explicaremos el enfoque tradicional de interoperabilidad, dónde falla para los flujos de trabajo SII/AEAT, y cómo IronXL permite crear, leer y escribir archivos de Excel sin ninguno de esos problemas, en cualquier servidor.

Empiece con IronXL ahora.
green arrow pointer

¿Cómo crea la biblioteca Interop un libro de Excel?

El espacio de nombres Microsoft.Office.Interop.Excel expone el mismo modelo de objetos COM que Excel utiliza internamente. Para leer o crear archivos de Excel a través de esta biblioteca, primero debe instanciar un objeto Application, agregar un nuevo libro de trabajo a su colección Workbooks y, a continuación, acceder a las celdas individuales de la hoja de cálculo. El siguiente ejemplo muestra una aplicación de consola mínima que utiliza Microsoft.Office.Interop.Excel para crear un fichero XLSX y escribir valores en las celdas.

using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
// Create the Excel Application COM object
Excel.Application excelApp = new Excel.Application();
if (excelApp == null)
{
    Console.WriteLine("Error: Excel is not properly installed.");
    return;
}
// Add a new workbook and access the default worksheet
Excel.Workbook xlWorkBook = excelApp.Workbooks.Add(Type.Missing);
Excel.Worksheet xlWorkSheet = (Excel.Worksheet)xlWorkBook.ActiveSheet;
// Write data into specific cells
xlWorkSheet.Cells[1, 1] = "Product";
xlWorkSheet.Cells[1, 2] = "Price";
xlWorkSheet.Cells[2, 1] = "Widget";
xlWorkSheet.Cells[2, 2] = "29.99";
// Save as an XLSX file and clean up COM objects
string filepath = @"C:\Reports\products.xlsx";
xlWorkBook.SaveAs(filepath);
xlWorkBook.Close(false);
excelApp.Quit();
// Release every COM object to prevent orphaned Excel processes
Marshal.ReleaseComObject(xlWorkSheet);
Marshal.ReleaseComObject(xlWorkBook);
Marshal.ReleaseComObject(excelApp);
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
// Create the Excel Application COM object
Excel.Application excelApp = new Excel.Application();
if (excelApp == null)
{
    Console.WriteLine("Error: Excel is not properly installed.");
    return;
}
// Add a new workbook and access the default worksheet
Excel.Workbook xlWorkBook = excelApp.Workbooks.Add(Type.Missing);
Excel.Worksheet xlWorkSheet = (Excel.Worksheet)xlWorkBook.ActiveSheet;
// Write data into specific cells
xlWorkSheet.Cells[1, 1] = "Product";
xlWorkSheet.Cells[1, 2] = "Price";
xlWorkSheet.Cells[2, 1] = "Widget";
xlWorkSheet.Cells[2, 2] = "29.99";
// Save as an XLSX file and clean up COM objects
string filepath = @"C:\Reports\products.xlsx";
xlWorkBook.SaveAs(filepath);
xlWorkBook.Close(false);
excelApp.Quit();
// Release every COM object to prevent orphaned Excel processes
Marshal.ReleaseComObject(xlWorkSheet);
Marshal.ReleaseComObject(xlWorkBook);
Marshal.ReleaseComObject(excelApp);
Imports Excel = Microsoft.Office.Interop.Excel
Imports System.Runtime.InteropServices

' Create the Excel Application COM object
Dim excelApp As Excel.Application = New Excel.Application()
If excelApp Is Nothing Then
    Console.WriteLine("Error: Excel is not properly installed.")
    Return
End If

' Add a new workbook and access the default worksheet
Dim xlWorkBook As Excel.Workbook = excelApp.Workbooks.Add(Type.Missing)
Dim xlWorkSheet As Excel.Worksheet = CType(xlWorkBook.ActiveSheet, Excel.Worksheet)

' Write data into specific cells
xlWorkSheet.Cells(1, 1) = "Product"
xlWorkSheet.Cells(1, 2) = "Price"
xlWorkSheet.Cells(2, 1) = "Widget"
xlWorkSheet.Cells(2, 2) = "29.99"

' Save as an XLSX file and clean up COM objects
Dim filepath As String = "C:\Reports\products.xlsx"
xlWorkBook.SaveAs(filepath)
xlWorkBook.Close(False)
excelApp.Quit()

' Release every COM object to prevent orphaned Excel processes
Marshal.ReleaseComObject(xlWorkSheet)
Marshal.ReleaseComObject(xlWorkBook)
Marshal.ReleaseComObject(excelApp)
$vbLabelText   $csharpLabel

El código anterior crea un libro de Excel, rellena una hoja con valores, guarda el fichero y libera manualmente cada objeto COM. Esa limpieza final no es opcional: si se omite, aparecen procesos fantasma de EXCEL.EXE consumiendo memoria en el sistema. Si Microsoft Office no está instalado, cada línea generará un error —un problema crítico en servidores Linux de empresas que operan el SII de la AEAT. La versión de la biblioteca de interoperabilidad debe coincidir con la versión de Office instalada; de lo contrario, se producirán FileNotFoundException difíciles de depurar.

¿Qué problemas genera Interop para generar ficheros SII/AEAT en servidores y en la nube?

Microsoft desaconseja explícitamente el uso de Interop en entornos de servidor. La biblioteca inicia una instancia completa de Excel en segundo plano, lo que significa que cada solicitud a un servidor web activa un proceso oculto en el escritorio de Windows. En un servidor Linux, no funcionará en absoluto. Para los departamentos de tecnología que generan ficheros del modelo 303, modelo 347 u operaciones SII desde microservicios en contenedores Docker —ya sea en Azure, AWS o infraestructura propia—, Interop es inviable. Las entidades supervisadas por el Banco de España / CNMV que deben generar informes regulatorios XLSX periódicos tampoco pueden depender de licencias Office en cada nodo del clúster.

Los desarrolladores suelen publicar sobre estos problemas en Stack Overflow y Microsoft Q&A, buscando cómo crear archivos de Excel sin tener Excel instalado. La siguiente tabla resume las principales diferencias.

| Característica | Interoperabilidad de oficina | IronXL| | ---| ---| ---| | Requiere tener Excel instalado. | Sí, solo la máquina del desarrollador y todos los servidores de producción. | No | | Formatos de archivo de Excel compatibles | XLS, XLSX| XLS, XLSX, CSV, TSV, JSON, XML| | Multiplataforma (.NET Core, Linux, macOS) | Sólo para Windows| Windows, Linux, macOS, Azure| | Se requiere la limpieza del objeto COM | Sí, manual Marshal.ReleaseComObject | No | | Implementación en servidor/nube | Microsoft no lo recomienda. | Totalmente compatible| | Rendimiento| Más lento: inicia un proceso oculto de Excel. | Mejor rendimiento: código .NET administrado | | Compatibilidad con .NET Framework y .NET Core | Solo para .NET Framework | .NET Framework, .NET Core, .NET 5–10 | | Generación ficheros SII/AEAT en Linux/Docker | No funciona | Sí, sin Office |

¿Cómo generar ficheros SII AEAT en XLSX sin tener Microsoft Office instalado?

IronXL es una biblioteca .NET para Excel que lee, escribe y crea archivos de Excel completamente en código administrado, sin dependencia de Microsoft Office, sin objetos COM que publicar, sin conflictos de versiones. Es la alternativa natural a Microsoft.Office.Interop para generar ficheros SII/AEAT en entornos Docker sin licencia Office. Instálalo a través de NuGet, busca IronXL y listo. Funciona en .NET Framework 4.6.2+, .NET Core y .NET 5 a .NET 10 en todos los sistemas operativos principales.

El siguiente ejemplo crea el mismo fichero que el código Interop, con la mitad de líneas —y sin ninguna dependencia externa que impida desplegarlo en Linux:

using IronXL;
// Create a new Excel workbook — default value is XLSX format
WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
// Add a worksheet and populate cells with data
WorkSheet workSheet = workBook.CreateWorkSheet("Sales");
workSheet["A1"].Value = "Product";
workSheet["B1"].Value = "Price";
workSheet["A2"].Value = "Widget";
workSheet["B2"].Value = 29.99;
// Apply basic formatting
workSheet["A1"].Style.Font.Bold = true;
workSheet["B1"].Style.Font.Bold = true;
// Save the XLSX file
workBook.SaveAs(@"C:\Reports\products.xlsx");
using IronXL;
// Create a new Excel workbook — default value is XLSX format
WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
// Add a worksheet and populate cells with data
WorkSheet workSheet = workBook.CreateWorkSheet("Sales");
workSheet["A1"].Value = "Product";
workSheet["B1"].Value = "Price";
workSheet["A2"].Value = "Widget";
workSheet["B2"].Value = 29.99;
// Apply basic formatting
workSheet["A1"].Style.Font.Bold = true;
workSheet["B1"].Style.Font.Bold = true;
// Save the XLSX file
workBook.SaveAs(@"C:\Reports\products.xlsx");
Imports IronXL

' Create a new Excel workbook — default value is XLSX format
Dim workBook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
' Add a worksheet and populate cells with data
Dim workSheet As WorkSheet = workBook.CreateWorkSheet("Sales")
workSheet("A1").Value = "Product"
workSheet("B1").Value = "Price"
workSheet("A2").Value = "Widget"
workSheet("B2").Value = 29.99
' Apply basic formatting
workSheet("A1").Style.Font.Bold = True
workSheet("B1").Style.Font.Bold = True
' Save the XLSX file
workBook.SaveAs("C:\Reports\products.xlsx")
$vbLabelText   $csharpLabel

Archivo de Excel creado con IronXL

Lectura de archivos Excel con Microsoft Interoperabilidad de oficina Excel C#: Y una forma más rápida de crear archivos Excel sin Office: Imagen 1 - Archivo de salida IronXL

El código anterior logra el mismo resultado que el ejemplo de Interop, pero con la mitad de líneas y sin dependencias externas. WorkBook.Create() inicializa un nuevo libro de trabajo en el formato de archivo de Excel especificado (XLSX por defecto), y CreateWorkSheet añade una hoja con nombre. Los valores de las celdas se establecen mediante una sintaxis de indexación clara, y SaveAs gestiona automáticamente la extensión del archivo. Sin Quit(), sin Marshal.ReleaseComObject, sin proceso oculto. La misma API también permite guardar en XLS, CSV, JSON o XML con una sola llamada. Consulte la documentación de exportación para todas las opciones disponibles.

IronXL también se integra con los objetos System.Data, de modo que los datos del modelo 347 (operaciones con terceros) procedentes de una base de datos a través de un DataTable se pueden escribir directamente en una hoja de cálculo sin iterar manualmente fila por fila.

¿Cómo se pueden leer y escribir los datos de declaraciones AEAT en filas y celdas?

Leer ficheros XLSX existentes —por ejemplo, el borrador del modelo 390 (resumen anual IVA) para revisión antes de la presentación— es igual de sencillo. El método WorkBook.Load acepta una ruta de archivo a cualquier fichero XLS, XLSX o CSV. Cada hoja expone sus filas y celdas como colecciones iterables, facilitando la lectura de datos, la modificación de valores o la carga de resultados en una base de datos. En el contexto del TicketBAI (Bizkaia, Gipuzkoa, Araba), este patrón se usa para leer los registros de facturación XLSX y verificar su estructura antes de generar el XML de presentación.

using IronXL;
// Load an existing Excel file
WorkBook workBook = WorkBook.Load(@"C:\Reports\products.xlsx");
WorkSheet workSheet = workBook.DefaultWorkSheet;
// Read and display each row of data
foreach (var row in workSheet.Rows)
{
    foreach (var cell in row.ToArray())
    {
        Console.Write(cell.Value + "\t");
    }
    Console.WriteLine();
}
// Update a specific cell and save
workSheet["B2"].Value = 34.99;
workBook.SaveAs(@"C:\Reports\products_updated.xlsx");
using IronXL;
// Load an existing Excel file
WorkBook workBook = WorkBook.Load(@"C:\Reports\products.xlsx");
WorkSheet workSheet = workBook.DefaultWorkSheet;
// Read and display each row of data
foreach (var row in workSheet.Rows)
{
    foreach (var cell in row.ToArray())
    {
        Console.Write(cell.Value + "\t");
    }
    Console.WriteLine();
}
// Update a specific cell and save
workSheet["B2"].Value = 34.99;
workBook.SaveAs(@"C:\Reports\products_updated.xlsx");
Imports IronXL

' Load an existing Excel file
Dim workBook As WorkBook = WorkBook.Load("C:\Reports\products.xlsx")
Dim workSheet As WorkSheet = workBook.DefaultWorkSheet

' Read and display each row of data
For Each row In workSheet.Rows
    For Each cell In row.ToArray()
        Console.Write(cell.Value & vbTab)
    Next
    Console.WriteLine()
Next

' Update a specific cell and save
workSheet("B2").Value = 34.99
workBook.SaveAs("C:\Reports\products_updated.xlsx")
$vbLabelText   $csharpLabel

Lectura de archivos de Excel con IronXL

Lectura de archivos Excel con Microsoft Interoperabilidad de oficina Excel C#: Y Una Manera Más Rápida De Crear Archivos Excel Sin Office: Imagen 2 - Leer salida de archivo de Excel con IronXL

Este ejemplo muestra cómo leer archivos de Excel iterando sobre la colección de filas y accediendo a la propiedad Value de cada celda. Tras leer los datos, el código actualiza una sola celda y guarda el libro en un nuevo fichero XLSX, conservando el original —patrón útil para registrar las correcciones aplicadas a una declaración antes de la re-presentación a la AEAT. IronXL recalcula automáticamente cualquier fórmula de Excel cuando se modifica una hoja, a diferencia de la biblioteca de interoperabilidad que necesita iniciar una instancia completa de Excel.

Para escenarios más avanzados —fórmulas de cuota de IVA, formato condicional para marcar discrepancias, combinación de celdas o múltiples hojas para distintos modelos AEAT—, la referencia de la API de IronXL cubre todos los métodos disponibles. La biblioteca también admite el acceso desde controladores ASP.NET, facilitando la generación y descarga de ficheros XLSX de declaraciones AEAT desde una aplicación web sin Office en el servidor. Los datos sujetos a la LOPDGDD (NIF, importes de operaciones) pueden cifrarse con contraseña mediante workbook.Password antes de la transmisión.

¿Cuál es la mejor manera de avanzar en la automatización de Excel con .NET para cumplimiento AEAT?

Si un proyecto está vinculado a un entorno de escritorio Windows heredado donde Microsoft Office ya está instalado y se mantendrá estable, Interop puede funcionar para tareas básicas. Pero para todo lo demás —implementaciones en servidores Linux de la AEAT, microservicios de SII en contenedores Docker, APIs de VeriFactu (Real Decreto-Ley 15/2025), generación de informes regulatorios para el Banco de España / CNMV, o cualquier escenario donde se desee mejor rendimiento sin depender de licencias Office—, una biblioteca .NET Excel independiente es la opción más lógica.

IronXL gestiona todas las operaciones comunes de Excel (creación de libros de trabajo, lectura de datos, escritura en celdas, guardado en múltiples formatos de archivo incluyendo XLS y XLSX) a través de una API limpia que se ejecuta en cualquier lugar donde se ejecute .NET. Es compatible con proyectos de C# y Visual Basic, y el mismo código funciona en Windows, Linux y macOS sin modificaciones —eliminando la principal barrera para automatizar la generación de ficheros SII y declaraciones AEAT en infraestructuras modernas.

Comience una prueba gratuita de 30 días para probarlo en su propio proyecto, o explore las opciones de licencia cuando esté listo para implementarlo.

Preguntas Frecuentes

¿Por qué Microsoft.Office.Interop.Excel no funciona para generar ficheros SII en servidores Linux?

Interop requiere una instancia completa de Excel (proceso COM) en el servidor, que no existe en Linux ni en contenedores Docker. Microsoft desaconseja su uso en entornos de servidor. IronXL es la alternativa: funciona en Linux/Docker sin Office y sin registro COM, siendo la solución adecuada para microservicios de SII AEAT.

¿Cómo genera IronXL ficheros XLSX para el SII y los modelos 303/347/390 sin Office?

IronXL crea libros XLSX completamente en código .NET gestionado: WorkBook.Create() para el libro, CreateWorkSheet() para las hojas (una por modelo AEAT), asignación de valores y fórmulas de cuota IVA con worksheet['A1'].Value/.Formula, y SaveAs() o ToStream() para la salida. Sin Office, sin COM.

¿Cómo proteger ficheros XLSX de declaraciones AEAT con datos personales según la LOPDGDD?

Establezca workbook.Password = 'secret' antes de SaveAs() para cifrar el XLSX con AES-128. Use worksheet.ProtectSheet('password') para impedir la edición. Esto protege los NIF y datos de operaciones sujetos a minimización según la LOPDGDD antes de su transmisión o archivo.

¿Puede IronXL generar informes XLSX para el Banco de España y la CNMV desde servidores Linux?

Sí. IronXL funciona en Linux y macOS sin Office, lo que permite a entidades supervisadas por el Banco de España y la CNMV generar informes regulatorios XLSX periódicos desde microservicios en contenedores, sin depender de licencias Office en cada nodo del clúster.

¿Es IronXL compatible con TicketBAI y VeriFactu?

Sí. IronXL puede generar los ficheros XLSX de datos de facturación para TicketBAI (Bizkaia, Gipuzkoa, Araba) y VeriFactu (Real Decreto-Ley 15/2025) en Linux/Docker. Los datos XLSX generados se usan como fuente para la generación de los XML de presentación requeridos por estos sistemas.

¿Con qué plataformas es compatible IronXL?

IronXL es compatible con Windows, Linux, macOS, Docker y Azure en .NET Framework 4.6.2+, .NET Core 3.1+ y .NET 5 a 10. Es la alternativa multiplataforma a Excel Interop para todos los entornos de servidor donde Office no puede instalarse.

¿Cuáles son las ventajas de IronXL sobre Excel Interop para la automatización fiscal en .NET?

IronXL no requiere Office, no crea objetos COM ni procesos huérfanos de EXCEL.EXE, funciona en Linux/Docker, y es más rápido al procesar en código .NET gestionado. Admite XLSX, XLS, CSV, JSON y XML, cubriendo todos los formatos necesarios para la AEAT, el SII y los sistemas regulatorios del Banco de España/CNMV.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más

Equipo de soporte de Iron

Estamos disponibles online las 24 horas, 5 días a la semana.
Chat
Email
Llámame