SII AEAT: Exportar tabla HTML a Excel en C# sin Office | IronXL
Exportar tablas HTML a Excel en C# es un requisito frecuente en las aplicaciones empresariales españolas, especialmente cuando se necesita preparar ficheros XLSX para declaraciones AEAT o auditorías del SII (Suministro Inmediato de Información). Ya sea para migrar datos contables, generar informes tributarios o procesar páginas web que contienen transacciones, esta guía ofrece pasos claros para exportar datos de tablas HTML a formato Excel utilizando IronXL y HTML Agility Pack.
En el contexto del SII de la AEAT, muchas empresas mantienen sus operaciones de IVA en páginas web internas o portales de gestión. Exportar esas tablas HTML de transacciones SII a XLSX permite preparar el fichero de auditoría sin necesidad de Microsoft Office, lo que resulta especialmente útil en entornos Docker o servidores Linux donde no es posible instalar Office.
Cuando necesites exportar una tabla HTML a Excel, es esencial comprender la relación entre las estructuras de las hojas de cálculo de Excel y las tablas HTML. Esta guía muestra cómo transferir eficazmente datos de tablas HTML a formato Excel, creando hojas de cálculo Excel profesionales que mantienen la integridad de los datos.
IronXL ofrece una forma flexible de convertir el contenido de tablas HTML en una hoja de cálculo de Excel, combinando sus potentes capacidades de manipulación de Excel con el análisis sintáctico de HTML para exportar tablas HTML a Excel en C#. Tanto si necesitas descargar datos de una URL como procesar contenido de una base de datos, esta solución gestiona diversos escenarios de entrada sin necesidad de tener Microsoft Office instalado en el equipo: un requisito clave para los flujos de trabajo SII que se ejecutan en servidores en la nube.
¿Por qué debería utilizar IronXL para exportar datos de tablas HTML en entornos de cumplimiento AEAT?
IronXL destaca por su capacidad para crear y manipular archivos de Excel sin necesidad de instalar Microsoft Office, lo que lo hace ideal para entornos de servidor y aplicaciones multiplataforma. Cuando se combina con HTML Agility Pack, un potente analizador de archivos y contenido HTML, IronXL se convierte en una solución versátil para convertir cualquier estructura de tabla HTML en datos de hoja de Excel.
Este enfoque resulta especialmente relevante para las empresas españolas que deben cumplir con las obligaciones fiscales de la AEAT:
- SII (Suministro Inmediato de Información): Las empresas con facturación superior a 6 millones de euros deben enviar registros de IVA en tiempo casi real. IronXL permite construir los ficheros XLSX de preparación de datos SII desde tablas HTML en servidores Linux sin Office.
- Modelo 303 (declaración trimestral IVA) y modelo 390 (resumen anual IVA): Generar estos modelos como XLSX directamente desde tablas HTML de datos contables.
- Modelo 347 (operaciones con terceros > 3.005,06 €): Exportar la tabla HTML de proveedores/clientes a XLSX para su posterior validación y envío a la AEAT.
- LOPDGDD: Al exportar solo las columnas necesarias (base imponible, cuota, NIF del tercero) desde la tabla HTML, se aplica el principio de minimización de datos exigido por la normativa española de protección de datos.
A diferencia de bibliotecas como XlsIO de la biblioteca Syncfusion Excel, que ofrece una función ImportHtmlTable limitada a formatos HTML y estructuras de tablas específicos, el enfoque de IronXL ofrece a los desarrolladores un control total sobre el proceso de análisis y conversión. Esta flexibilidad significa que los desarrolladores pueden manejar escenarios complejos como tablas anidadas, formato de datos personalizado y extracción selectiva de columnas que los métodos rígidos incorporados no pueden acomodar.
IronXL también ofrece una Suite completa de funciones de Excel, incluyendo compatibilidad con fórmulas, estilo de celdas, gestión de múltiples hojas de cálculo y varios formatos de exportación (XLSX, XLS, JSON y CSV). Puede crear gráficos, exportar a PDF y gestionar datos de campos ocultos, lo que la convierte en una solución completa para la automatización de Excel más allá de la simple conversión de tablas HTML.
¿Cómo se instalan las bibliotecas necesarias?
Instala tanto IronXL como HTML Agility Pack a través del gestor de paquetes NuGet. IronXL ofrece una prueba gratuita para probar todas las funciones antes de adquirir una licencia.
Consola del administrador de paquetes
Install-Package IronXL.Excel
Install-Package HtmlAgilityPack
Install-Package IronXL.Excel
Install-Package HtmlAgilityPack
CLI de .NET
dotnet add package IronXL.Excel
dotnet add package HtmlAgilityPack
dotnet add package IronXL.Excel
dotnet add package HtmlAgilityPack
Estos paquetes NuGet le permiten crear, cargar y guardar documentos Excel programáticamente. Después de instalar ambos paquetes, añade las declaraciones using necesarias al principio de tu archivo C#:
using IronXL;
using HtmlAgilityPack;
using System;
using System.Linq;
using IronXL;
using HtmlAgilityPack;
using System;
using System.Linq;
Imports IronXL
Imports HtmlAgilityPack
Imports System
Imports System.Linq
Estas bibliotecas funcionan bien juntas: HTML Agility Pack se encarga del análisis sintáctico del HTML, mientras que la biblioteca IronXL gestiona la creación y manipulación de archivos Excel. Este ejemplo muestra un enfoque claro para convertir tablas HTML al formato XLSX, que es el formato aceptado por la AEAT para determinados envíos de datos.
¿Cómo exportar una tabla HTML de transacciones SII a XLSX para auditoría AEAT?
Un caso de uso habitual en empresas españolas es exportar la tabla HTML que muestra el registro de facturas emitidas del SII a un fichero XLSX para revisión interna o auditoría. HTML Agility Pack ofrece una forma sencilla de navegar por documentos HTML utilizando expresiones XPath. El siguiente código muestra cómo extraer datos de una tabla HTML de operaciones SII y prepararlos para exportar:
// Tabla HTML de ejemplo con datos de operaciones para SII (AEAT)
string htmlContent = @"
<table>
<thead>
<tr>
<th>Num. Factura</th>
<th>NIF Destinatario</th>
<th>Base Imponible (EUR)</th>
<th>Cuota IVA (EUR)</th>
<th>Fecha Operación</th>
</tr>
</thead>
<tbody>
<tr>
<td>2024/0001</td>
<td>B12345678</td>
<td>10000,00</td>
<td>2100,00</td>
<td>2024-01-15</td>
</tr>
<tr>
<td>2024/0002</td>
<td>A87654321</td>
<td>5000,00</td>
<td>1050,00</td>
<td>2024-01-20</td>
</tr>
<tr>
<td>2024/0003</td>
<td>B11223344</td>
<td>3500,00</td>
<td>735,00</td>
<td>2024-01-28</td>
</tr>
</tbody>
</table>";
// Cargar documento HTML para análisis
var doc = new HtmlDocument();
doc.LoadHtml(htmlContent);
// Seleccionar el elemento de tabla HTML usando XPath
var table = doc.DocumentNode.SelectSingleNode("//table");
// Tabla HTML de ejemplo con datos de operaciones para SII (AEAT)
string htmlContent = @"
<table>
<thead>
<tr>
<th>Num. Factura</th>
<th>NIF Destinatario</th>
<th>Base Imponible (EUR)</th>
<th>Cuota IVA (EUR)</th>
<th>Fecha Operación</th>
</tr>
</thead>
<tbody>
<tr>
<td>2024/0001</td>
<td>B12345678</td>
<td>10000,00</td>
<td>2100,00</td>
<td>2024-01-15</td>
</tr>
<tr>
<td>2024/0002</td>
<td>A87654321</td>
<td>5000,00</td>
<td>1050,00</td>
<td>2024-01-20</td>
</tr>
<tr>
<td>2024/0003</td>
<td>B11223344</td>
<td>3500,00</td>
<td>735,00</td>
<td>2024-01-28</td>
</tr>
</tbody>
</table>";
// Cargar documento HTML para análisis
var doc = new HtmlDocument();
doc.LoadHtml(htmlContent);
// Seleccionar el elemento de tabla HTML usando XPath
var table = doc.DocumentNode.SelectSingleNode("//table");
' Tabla HTML de ejemplo con datos de operaciones para SII (AEAT)
Dim htmlContent As String = "
<table>
<thead>
<tr>
<th>Num. Factura</th>
<th>NIF Destinatario</th>
<th>Base Imponible (EUR)</th>
<th>Cuota IVA (EUR)</th>
<th>Fecha Operación</th>
</tr>
</thead>
<tbody>
<tr>
<td>2024/0001</td>
<td>B12345678</td>
<td>10000,00</td>
<td>2100,00</td>
<td>2024-01-15</td>
</tr>
<tr>
<td>2024/0002</td>
<td>A87654321</td>
<td>5000,00</td>
<td>1050,00</td>
<td>2024-01-20</td>
</tr>
<tr>
<td>2024/0003</td>
<td>B11223344</td>
<td>3500,00</td>
<td>735,00</td>
<td>2024-01-28</td>
</tr>
</tbody>
</table>"
' Cargar documento HTML para análisis
Dim doc As New HtmlDocument()
doc.LoadHtml(htmlContent)
' Seleccionar el elemento de tabla HTML usando XPath
Dim table = doc.DocumentNode.SelectSingleNode("//table")
Este código carga el contenido HTML en un objeto HtmlDocument y utiliza XPath para consultar y seleccionar el elemento de tabla. El método SelectSingleNode devuelve la primera tabla encontrada en el HTML, lo que facilita seleccionar tablas específicas cuando hay varias. A continuación, se procesa cada fila de la tabla para extraer el valor de la celda que se va a convertir. Al exportar solo las columnas necesarias (NIF, base imponible, cuota IVA), se aplica el principio de minimización de datos conforme a la LOPDGDD española.
¿Qué expresiones XPath funcionan mejor para el análisis de tablas?
En el caso de las tablas HTML estándar, la expresión XPath //table selecciona la primera tabla del documento. Cuando se trabaje con páginas más complejas que contengan varias tablas, se pueden utilizar selectores posicionales como (//table)[2] para seleccionar una tabla específica por su índice. Los selectores basados en atributos, como //table[@id='data-table'] o //table[@class='products'], también resultan útiles cuando las tablas contienen identificadores significativos.
Cuando el HTML proviene de una URL activa, puedes cargar el documento directamente utilizando la clase HtmlWeb:
var web = new HtmlWeb();
var remoteDoc = web.Load("https://example.com/data-page");
var remoteTable = remoteDoc.DocumentNode.SelectSingleNode("//table[@class='data-table']");
var web = new HtmlWeb();
var remoteDoc = web.Load("https://example.com/data-page");
var remoteTable = remoteDoc.DocumentNode.SelectSingleNode("//table[@class='data-table']");
Dim web As New HtmlWeb()
Dim remoteDoc = web.Load("https://example.com/data-page")
Dim remoteTable = remoteDoc.DocumentNode.SelectSingleNode("//table[@class='data-table']")
Esto te permite extraer tablas directamente de páginas web públicas sin tener que ahorrar primero el código HTML manualmente.
¿Cómo se exportan los datos analizados a Excel utilizando IronXL?
Con IronXL, puede convertir los datos de la tabla HTML analizada en una hoja de cálculo de Excel Professional con el formato adecuado. El siguiente código muestra cómo exportar los datos con un estilo personalizado, listo para ser utilizado como soporte documental en declaraciones AEAT (modelo 303, 347 o 390):
// Crear un nuevo libro de Excel
WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet workSheet = workBook.CreateWorkSheet("Registros SII AEAT");
// Extraer y escribir encabezados
var headers = table.SelectNodes(".//thead/tr/th");
if (headers != null)
{
for (int col = 0; col < headers.Count; col++)
{
workSheet.SetCellValue(0, col, headers[col].InnerText.Trim());
// Aplicar formato a los encabezados
var headerCell = workSheet.GetCellAt(0, col);
headerCell.Style.Font.Bold = true;
headerCell.Style.BackgroundColor = "#4CAF50";
}
}
// Extraer y escribir filas de datos
var rows = table.SelectNodes(".//tbody/tr");
if (rows != null)
{
for (int row = 0; row < rows.Count; row++)
{
var cells = rows[row].SelectNodes("td");
if (cells != null)
{
for (int col = 0; col < cells.Count; col++)
{
string cellValue = cells[col].InnerText.Trim();
workSheet.SetCellValue(row + 1, col, cellValue);
}
}
}
}
// Ajuste automático de columnas para mejor legibilidad
for (int col = 0; col < headers?.Count; col++)
{
workSheet.AutoSizeColumn(col);
}
// Guardar el fichero Excel para auditoría AEAT
workBook.SaveAs("Registros_SII_AEAT_2024.xlsx");
// Crear un nuevo libro de Excel
WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet workSheet = workBook.CreateWorkSheet("Registros SII AEAT");
// Extraer y escribir encabezados
var headers = table.SelectNodes(".//thead/tr/th");
if (headers != null)
{
for (int col = 0; col < headers.Count; col++)
{
workSheet.SetCellValue(0, col, headers[col].InnerText.Trim());
// Aplicar formato a los encabezados
var headerCell = workSheet.GetCellAt(0, col);
headerCell.Style.Font.Bold = true;
headerCell.Style.BackgroundColor = "#4CAF50";
}
}
// Extraer y escribir filas de datos
var rows = table.SelectNodes(".//tbody/tr");
if (rows != null)
{
for (int row = 0; row < rows.Count; row++)
{
var cells = rows[row].SelectNodes("td");
if (cells != null)
{
for (int col = 0; col < cells.Count; col++)
{
string cellValue = cells[col].InnerText.Trim();
workSheet.SetCellValue(row + 1, col, cellValue);
}
}
}
}
// Ajuste automático de columnas para mejor legibilidad
for (int col = 0; col < headers?.Count; col++)
{
workSheet.AutoSizeColumn(col);
}
// Guardar el fichero Excel para auditoría AEAT
workBook.SaveAs("Registros_SII_AEAT_2024.xlsx");
' Crear un nuevo libro de Excel
Dim workBook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim workSheet As WorkSheet = workBook.CreateWorkSheet("Registros SII AEAT")
' Extraer y escribir encabezados
Dim headers = table.SelectNodes(".//thead/tr/th")
If headers IsNot Nothing Then
For col As Integer = 0 To headers.Count - 1
workSheet.SetCellValue(0, col, headers(col).InnerText.Trim())
' Aplicar formato a los encabezados
Dim headerCell = workSheet.GetCellAt(0, col)
headerCell.Style.Font.Bold = True
headerCell.Style.BackgroundColor = "#4CAF50"
Next
End If
' Extraer y escribir filas de datos
Dim rows = table.SelectNodes(".//tbody/tr")
If rows IsNot Nothing Then
For row As Integer = 0 To rows.Count - 1
Dim cells = rows(row).SelectNodes("td")
If cells IsNot Nothing Then
For col As Integer = 0 To cells.Count - 1
Dim cellValue As String = cells(col).InnerText.Trim()
workSheet.SetCellValue(row + 1, col, cellValue)
Next
End If
Next
End If
' Ajuste automático de columnas para mejor legibilidad
For col As Integer = 0 To If(headers?.Count, 0) - 1
workSheet.AutoSizeColumn(col)
Next
' Guardar el fichero Excel para auditoría AEAT
workBook.SaveAs("Registros_SII_AEAT_2024.xlsx")
Este código demuestra la API intuitiva para la manipulación de Excel en C# con IronXL. Crea un nuevo libro y una nueva hoja de cálculo, y luego recorre los encabezados de la tabla HTML analizada, colocándolos en la primera fila y aplicándoles formato en negrita y un fondo verde. Las filas de datos de la tabla HTML se procesan fila por fila, extrayéndose el contenido de texto de cada celda y colocándolo en la celda correspondiente de Excel. La función AutoSizeColumn garantiza que todo el contenido sea visible y que el libro se guarde como un archivo XLSX.

Aquí puede ver la tabla HTML original comparada con el resultado del código anterior:

¿Cómo se aplica el formato de celda a los datos exportados?
Más allá del formato básico en negrita y el color de fondo que se muestra arriba, IronXL te ofrece un control minucioso sobre el estilo de las celdas. Puede establecer el tamaño de fuente, la familia de fuentes, la alineación del texto, los bordes y los formatos numéricos para cualquier celda o rango. En los ficheros SII para AEAT, el formato correcto de las cifras en euros (punto de miles, coma decimal) es importante para la lectura por parte de los auditores:
// Aplicar formato numérico en euros a la columna de base imponible (índice 2)
var baseRange = workSheet[$"C2:C{rows.Count + 1}"];
baseRange.FormatString = "#,##0.00";
// Aplicar formato numérico en euros a la columna de cuota IVA (índice 3)
var cuotaRange = workSheet[$"D2:D{rows.Count + 1}"];
cuotaRange.FormatString = "#,##0.00";
// Establecer tamaño de fuente en las celdas de encabezado
var headerRange = workSheet[$"A1:{(char)('A' + headers.Count - 1)}1"];
headerRange.Style.Font.Height = 13; // en semipuntos, 13 = 6,5pt
// Aplicar formato numérico en euros a la columna de base imponible (índice 2)
var baseRange = workSheet[$"C2:C{rows.Count + 1}"];
baseRange.FormatString = "#,##0.00";
// Aplicar formato numérico en euros a la columna de cuota IVA (índice 3)
var cuotaRange = workSheet[$"D2:D{rows.Count + 1}"];
cuotaRange.FormatString = "#,##0.00";
// Establecer tamaño de fuente en las celdas de encabezado
var headerRange = workSheet[$"A1:{(char)('A' + headers.Count - 1)}1"];
headerRange.Style.Font.Height = 13; // en semipuntos, 13 = 6,5pt
' Aplicar formato numérico en euros a la columna de base imponible (índice 2)
Dim baseRange = workSheet($"C2:C{rows.Count + 1}")
baseRange.FormatString = "#,##0.00"
' Aplicar formato numérico en euros a la columna de cuota IVA (índice 3)
Dim cuotaRange = workSheet($"D2:D{rows.Count + 1}")
cuotaRange.FormatString = "#,##0.00"
' Establecer tamaño de fuente en las celdas de encabezado
Dim headerRange = workSheet($"A1:{ChrW(AscW("A"c) + headers.Count - 1)}1")
headerRange.Style.Font.Height = 13 ' en semipuntos, 13 = 6,5pt
En cuanto al ancho de las columnas, AutoSizeColumn se encarga de la mayoría de los casos, pero también puedes establecer anchos explícitos utilizando el método SetColumnWidth cuando necesites un diseño preciso. Estos controles de estilo forman parte de la misma API de IronXL que gestiona los estilos de fuente de las celdas en el resto del libro.
¿Cómo se gestionan las tablas múltiples y los casos de error?
Cuando trabaje con varias tablas en una misma página (por ejemplo, una tabla de facturas emitidas y otra de facturas recibidas para el SII), utilice SelectNodes("//table") para recuperar todas las tablas e iterar a través de ellas, creando una hoja de cálculo independiente para cada una. Este patrón es muy útil para generar un fichero XLSX con múltiples pestañas que correspondan a los distintos libros de registro del SII (facturas emitidas, recibidas, bienes de inversión):
var tables = doc.DocumentNode.SelectNodes("//table");
if (tables != null)
{
for (int t = 0; t < tables.Count; t++)
{
WorkSheet ws = workBook.CreateWorkSheet($"Table_{t + 1}");
var tblHeaders = tables[t].SelectNodes(".//thead/tr/th");
var tblRows = tables[t].SelectNodes(".//tbody/tr");
if (tblHeaders != null)
{
for (int col = 0; col < tblHeaders.Count; col++)
{
ws.SetCellValue(0, col, tblHeaders[col].InnerText.Trim());
ws.GetCellAt(0, col).Style.Font.Bold = true;
}
}
if (tblRows != null)
{
for (int row = 0; row < tblRows.Count; row++)
{
var cells = tblRows[row].SelectNodes("td");
if (cells != null)
{
for (int col = 0; col < cells.Count; col++)
{
ws.SetCellValue(row + 1, col, cells[col].InnerText.Trim());
}
}
}
}
}
}
workBook.SaveAs("SII_LibrosRegistro_AEAT.xlsx");
var tables = doc.DocumentNode.SelectNodes("//table");
if (tables != null)
{
for (int t = 0; t < tables.Count; t++)
{
WorkSheet ws = workBook.CreateWorkSheet($"Table_{t + 1}");
var tblHeaders = tables[t].SelectNodes(".//thead/tr/th");
var tblRows = tables[t].SelectNodes(".//tbody/tr");
if (tblHeaders != null)
{
for (int col = 0; col < tblHeaders.Count; col++)
{
ws.SetCellValue(0, col, tblHeaders[col].InnerText.Trim());
ws.GetCellAt(0, col).Style.Font.Bold = true;
}
}
if (tblRows != null)
{
for (int row = 0; row < tblRows.Count; row++)
{
var cells = tblRows[row].SelectNodes("td");
if (cells != null)
{
for (int col = 0; col < cells.Count; col++)
{
ws.SetCellValue(row + 1, col, cells[col].InnerText.Trim());
}
}
}
}
}
}
workBook.SaveAs("SII_LibrosRegistro_AEAT.xlsx");
Imports System
Dim tables = doc.DocumentNode.SelectNodes("//table")
If tables IsNot Nothing Then
For t As Integer = 0 To tables.Count - 1
Dim ws As WorkSheet = workBook.CreateWorkSheet($"Table_{t + 1}")
Dim tblHeaders = tables(t).SelectNodes(".//thead/tr/th")
Dim tblRows = tables(t).SelectNodes(".//tbody/tr")
If tblHeaders IsNot Nothing Then
For col As Integer = 0 To tblHeaders.Count - 1
ws.SetCellValue(0, col, tblHeaders(col).InnerText.Trim())
ws.GetCellAt(0, col).Style.Font.Bold = True
Next
End If
If tblRows IsNot Nothing Then
For row As Integer = 0 To tblRows.Count - 1
Dim cells = tblRows(row).SelectNodes("td")
If cells IsNot Nothing Then
For col As Integer = 0 To cells.Count - 1
ws.SetCellValue(row + 1, col, cells(col).InnerText.Trim())
Next
End If
Next
End If
Next
End If
workBook.SaveAs("SII_LibrosRegistro_AEAT.xlsx")
¿Qué debes hacer cuando el HTML está mal formado?
El HTML del mundo real no siempre es válido. Las páginas extraídas de fuentes externas pueden presentar etiquetas de cierre faltantes, estructuras tbody inconsistentes o elementos th y td mezclados en la fila del encabezado. HTML Agility Pack es tolerante por diseño y analizará la mayor parte del HTML malformado sin lanzar excepciones, pero es posible que tus selectores XPath no coincidan con lo que esperas.
Una forma segura de hacerlo es envolver la lógica de análisis en un bloque try-catch y añadir una alternativa que busque elementos tr directamente debajo de la tabla cuando no se encuentre ningún thead:
try
{
var headerNodes = table.SelectNodes(".//thead/tr/th")
?? table.SelectNodes(".//tr[1]/th")
?? table.SelectNodes(".//tr[1]/td");
var dataRows = table.SelectNodes(".//tbody/tr")
?? table.SelectNodes(".//tr[position()>1]");
// ... procesar normalmente
}
catch (Exception ex)
{
Console.WriteLine($"Error al analizar la tabla: {ex.Message}");
}
try
{
var headerNodes = table.SelectNodes(".//thead/tr/th")
?? table.SelectNodes(".//tr[1]/th")
?? table.SelectNodes(".//tr[1]/td");
var dataRows = table.SelectNodes(".//tbody/tr")
?? table.SelectNodes(".//tr[position()>1]");
// ... procesar normalmente
}
catch (Exception ex)
{
Console.WriteLine($"Error al analizar la tabla: {ex.Message}");
}
Imports System
Try
Dim headerNodes = table.SelectNodes(".//thead/tr/th") _
OrElse table.SelectNodes(".//tr[1]/th") _
OrElse table.SelectNodes(".//tr[1]/td")
Dim dataRows = table.SelectNodes(".//tbody/tr") _
OrElse table.SelectNodes(".//tr[position()>1]")
' ... procesar normalmente
Catch ex As Exception
Console.WriteLine($"Error al analizar la tabla: {ex.Message}")
End Try
IronXL maneja automáticamente la detección de tipos de datos, convirtiendo cadenas numéricas a números cuando es apropiado. Para escenarios más complejos que impliquen contenido renderizado con JavaScript, puede combinar este enfoque con herramientas como Selenium WebDriver o Playwright para renderizar primero la página y, a continuación, pasar el HTML resultante a HTML Agility Pack para su análisis.
¿Cómo se ahorra y exporta el archivo de Excel para cumplimiento fiscal?
IronXL admite múltiples formatos de salida además de XLSX. Puede ahorrar el archivo como XLS, CSV, TSV o JSON, dependiendo de los requisitos posteriores. Para los envíos al Banco de España o a la CNMV, que requieren XLSX sin dependencias de Office en servidores regulados, IronXL es la solución más adecuada. También puede enviar la salida directamente a una respuesta HTTP en .NET Core, lo que evita escribir un archivo en el disco:
// Guardar en disco como XLSX (para auditoría AEAT o Banco de España/CNMV)
workBook.SaveAs("InformesPrudenciales_CNMV.xlsx");
// Guardar como CSV (para importación en aplicaciones de terceros)
workBook.SaveAsCsv("RegistrosSII.csv");
// Streaming a respuesta HTTP (ASP.NET Core)
// Response.Headers["Content-Disposition"] = "attachment; filename=RegistrosSII.xlsx";
// workBook.SaveAs(Response.BodyWriter.AsStream());
// Guardar en disco como XLSX (para auditoría AEAT o Banco de España/CNMV)
workBook.SaveAs("InformesPrudenciales_CNMV.xlsx");
// Guardar como CSV (para importación en aplicaciones de terceros)
workBook.SaveAsCsv("RegistrosSII.csv");
// Streaming a respuesta HTTP (ASP.NET Core)
// Response.Headers["Content-Disposition"] = "attachment; filename=RegistrosSII.xlsx";
// workBook.SaveAs(Response.BodyWriter.AsStream());
' Guardar en disco como XLSX (para auditoría AEAT o Banco de España/CNMV)
workBook.SaveAs("InformesPrudenciales_CNMV.xlsx")
' Guardar como CSV (para importación en aplicaciones de terceros)
workBook.SaveAsCsv("RegistrosSII.csv")
' Streaming a respuesta HTTP (ASP.NET Core)
' Response.Headers("Content-Disposition") = "attachment; filename=RegistrosSII.xlsx"
' workBook.SaveAs(Response.BodyWriter.AsStream())
Al realizar streaming a una respuesta HTTP, asegúrese de que el encabezado Content-Disposition esté establecido en attachment para que el navegador trate la respuesta como una descarga de archivo. Este patrón funciona bien tanto en controladores MVC como en Razor Pages.
En los casos en los que sea necesario exportar datos a una plantilla de Excel existente, IronXL puede cargar un libro de trabajo existente y rellenar rangos con nombre o direcciones de celda específicas con los datos HTML analizados, conservando todo el formato de la plantilla. Esto resulta muy útil cuando la AEAT, el Banco de España o la CNMV proporcionan plantillas XLSX oficiales que hay que rellenar.
¿Cuáles son las mejores prácticas para el uso en producción en entornos regulados en España?
| Inquietud | Recomendación | Notas |
|---|---|---|
| Grandes conjuntos de datos SII | Procesar filas por lotes | IronXL gestiona miles de filas; útil para exportar registros anuales del modelo 390 |
| HTML malformado | Utilizar selectores XPath de reserva | HTML Agility Pack es tolerante; añade comprobaciones explícitas de valores nulos en todas las llamadas a SelectNodes |
| Contenido dinámico | Previsualización con Selenium o Playwright | Las páginas con gran cantidad de JavaScript requieren un navegador sin interfaz gráfica antes del análisis sintáctico de HTML |
| Formato de archivo | Prefiere XLSX a XLS | XLSX es el formato aceptado por AEAT, Banco de España y CNMV para informes regulatorios |
| Minimización de datos (LOPDGDD) | Exportar solo columnas requeridas por AEAT | Exportar únicamente NIF, base imponible y cuota IVA cumple el principio de minimización de la LOPDGDD |
| Licencias | Configurar la clave de licencia al iniciar el programa | Llame a IronXL.License.LicenseKey = "..."; antes de cualquier llamada a IronXL |
Al procesar contenido procedente de una URL o de una consulta de base de datos para su posterior análisis, se deben tener en cuenta detalles adicionales, como los valores de campos ocultos o requisitos especiales de formato. El comportamiento predeterminado funciona bien para tablas estándar, pero puedes personalizar el tamaño de la fuente, la familia tipográfica y otras propiedades de estilo para cada columna o cualquier fila específica de la tabla.
Para leer datos de archivos Excel tras la exportación, IronXL utiliza la misma API WorkBook.Load, lo que simplifica los flujos de trabajo de ida y vuelta. También puede convertir el archivo Excel resultante a otros formatos, como JSON o XML, para su posterior procesamiento.
TicketBAI y VeriFactu: exportar tablas HTML a XLSX en el País Vasco y más allá
Las empresas con actividad en el País Vasco también deben cumplir con TicketBAI (vigente en Bizkaia, Gipuzkoa y Araba). IronXL facilita la generación de exportaciones XLSX conformes a TicketBAI a partir de las tablas HTML de los sistemas de facturación, permitiendo su posterior 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 informáticos de facturación generen registros de facturas verificables. IronXL puede emplearse para incrustar los datos de los registros de facturas VeriFactu en ficheros XLSX, que se integran con facilidad en los flujos de envío a la AEAT.
¿Cómo gestionas las licencias y la implementación?
IronXL requiere una clave de licencia para su uso en producción. La versión de prueba gratuita incluye todas las funciones y es ideal para evaluar la biblioteca antes de comprarla. Explora las opciones de precios y licencias para encontrar el plan adecuado para tu equipo.
Para su implementación en entornos Docker, Azure Functions o Linux (habitual en las arquitecturas de los sistemas SII de las grandes empresas españolas), IronXL no depende de Microsoft Office ni de COM Interop, lo que facilita su gestión. Es compatible con .NET 10, .NET 9, .NET 8, .NET Framework 4.6.2+ y es totalmente compatible con los patrones de exportación actuales de ASP.NET Core.
La combinación de IronXL y HTML Agility Pack ofrece una solución flexible para exportar tablas HTML a Excel en C#. El enfoque que aquí se muestra ofrece más control que los rígidos métodos integrados, lo que le permite manejar estructuras HTML complejas al tiempo que aprovecha el conjunto completo de funciones de IronXL.
Tanto si está creando rastreadores web, migrando datos heredados de una base de datos, automatizando la generación de informes fiscales para la AEAT o realizando análisis de datos en grandes conjuntos de datos, esta solución se adapta para satisfacer las necesidades de Enterprise. Los ejemplos de código muestran cómo gestionar diversas fuentes de entrada, desde cadenas HTML estáticas hasta contenido dinámico recuperado a través de una URL. Los resultados se pueden exportar para su descarga o para su posterior procesamiento en su aplicación .NET, con la garantía de funcionar en entornos Linux/Docker propios de los sistemas SII de las empresas españolas.
¿Listo para transformar tus datos HTML en archivos Excel listos para declaraciones AEAT y SII? Empieza hoy mismo tu prueba gratuita de IronXL y descubre la flexibilidad de la manipulación programática de Excel sin depender de Office.
Preguntas Frecuentes
¿Cómo puedo exportar una tabla HTML de operaciones SII a XLSX para la AEAT sin instalar Office?
Con IronXL y HTML Agility Pack en C# puedes parsear la tabla HTML de transacciones SII, extraer las columnas necesarias (NIF, base imponible, cuota IVA) y guardarlas como XLSX con workBook.SaveAs(). IronXL se ejecuta en Linux y Docker sin necesidad de Microsoft Office, lo que lo hace ideal para los sistemas SII en la nube.
¿Puedo generar el modelo 303, 347 o 390 de la AEAT como XLSX desde una tabla HTML en C#?
Sí. El flujo habitual es: parsear la tabla HTML con HTML Agility Pack, crear un WorkBook con IronXL, escribir las filas de datos con los campos requeridos por cada modelo y guardar el fichero XLSX. Este fichero puede usarse directamente como soporte documental para la declaración trimestral de IVA (303), operaciones con terceros (347) o resumen anual (390).
¿IronXL cumple con la LOPDGDD al exportar tablas HTML a Excel para la AEAT?
IronXL permite exportar únicamente las columnas necesarias (principio de minimización de datos de la LOPDGDD). Al usar SelectNodes con XPath, puedes seleccionar solo los campos exigidos por la AEAT (NIF, importes) y excluir datos personales no requeridos, cumpliendo así la normativa española de protección de datos.
¿Es necesario Microsoft Office para utilizar IronXL para exportar tablas HTML a Excel?
No, Microsoft Office no es necesario. IronXL funciona en Windows, Linux, macOS y Docker sin dependencias de Office, lo que lo hace ideal para servidores de producción donde se ejecutan los sistemas SII de las empresas españolas.
¿Puede IronXL generar exportaciones XLSX conformes con TicketBAI para el País Vasco?
Sí. IronXL puede exportar los datos de facturas desde tablas HTML a XLSX en el formato requerido para TicketBAI (Bizkaia, Gipuzkoa, Araba). El fichero XLSX generado puede integrarse con los sistemas de firma y envío a las haciendas forales del País Vasco.
¿Cuáles son los casos de uso más comunes para exportar tablas HTML a Excel en empresas españolas?
Los casos de uso más frecuentes incluyen: preparación de datos SII para el envío a la AEAT, generación de ficheros para los modelos 303, 347 y 390, creación de informes prudenciales XLSX para el Banco de España y la CNMV, y exportación de registros de facturas para VeriFactu (Real Decreto-Ley 15/2025).



