IronXL para SII AEAT en VB.NET: Leer Excel en matrices sin Office | IronXL vs Interop
Para leer datos de Excel en matrices en VB .NET es necesario cargar un libro, seleccionar una hoja de cálculo, iterar filas y columnas y almacenar cada valor de celda en una matriz bidimensional. Con IronXL, puedes lograr esto en pocas líneas sin instalar Microsoft Office. Instala el paquete NuGet , llama a WorkBook.Load, obtén un Range y, luego, repite su colección Rows para rellenar la matriz.
En el contexto fiscal español, esta técnica resulta especialmente valiosa: los ficheros XLSX recibidos del SII (Suministro Inmediato de Información) de la AEAT o los informes de conciliación para el modelo 303 se pueden cargar en matrices VB .NET con IronXL, procesarse sin Office en servidores Linux/Docker y volver a exportarse como XLSX validado para la declaración trimestral de IVA. IronXL genera ficheros SII y procesa declaraciones AEAT directamente desde código, cumpliendo además con la LOPDGDD al permitir cargar sólo las columnas necesarias.
Comience su prueba gratuita para explorar cómo IronXL simplifica la automatización de Excel en sus proyectos de Visual Studio.
¿Cómo se comparan estas soluciones a simple vista?
| Función | IronXL | Interop de Microsoft Office |
|---|---|---|
| Se requiere instalación de oficina | No | Sí |
| instalación de NuGet | Sí, un paquete | No -- Referencia COM |
| Compatibilidad con entornos de servidor/CI | Sí | Limitado |
| Gestión del ciclo de vida de los objetos COM | No requerido | Requerido |
| Formatos compatibles | XLSX, XLS, CSV, TSV, JSON | XLSX, XLS (solo Excel) |
| API de tipo seguro | Sí | Parcial - COM de enlace tardío |
| Compatibilidad con Linux y macOS | Sí (.NET 6+) | No |
| Estilo de manejo de excepciones | Excepciones estándar de .NET | Excepciones COM + limpieza manual |
| Apto para flujos SII / AEAT | Sí (Linux/Docker sin Office) | No |
¿Cómo instalar IronXL para proyectos VB .NET ?
La forma más rápida de agregar IronXL a cualquier proyecto .NET es a través del Administrador de paquetes NuGet . Abra la consola del gestor de paquetes en Visual Studio y ejecute:
Install-Package IronXL.Excel
Install-Package IronXL.Excel
Alternativamente, utilice la CLI de .NET :
dotnet add package IronXL.Excel
dotnet add package IronXL.Excel
Después de la instalación, agregue Imports IronXL en la parte superior de su módulo VB .NET . No se necesita instalar Office: IronXL lee y escribe archivos Excel completamente a través de su propio motor de análisis.
Para proyectos que apuntan a marcos más antiguos o requieren una fijación de versión específica, la página NuGet de IronXL enumera todas las versiones publicadas. La documentación de IronXL proporciona guías de instalación para Visual Studio 2019, 2022 y la CLI de .NET .
¿Cómo pueden los desarrolladores leer datos de Excel en matrices utilizando IronXL?
IronXL proporciona una API limpia para abrir libros de trabajo, seleccionar rangos e iterar valores de celdas sin necesidad de una instalación local de Office. El método WorkBook.Load acepta una ruta de archivo y devuelve un objeto WorkBook que expone todas las hojas de trabajo.
Imports IronXL
Module ReadExcelToArray
Sub Main()
' Load the Excel workbook from a file path
Dim workbook As WorkBook = WorkBook.Load("SalesData.xlsx")
' Access the first worksheet in the workbook
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
' Define the cell range to extract
Dim dataRange As IronXL.Range = sheet.GetRange("A1:D5")
' Determine array dimensions from the range
Dim rowCount As Integer = dataRange.Rows.Count
Dim colCount As Integer = dataRange.Columns.Count
Dim salesArray(rowCount - 1, colCount - 1) As String
' Populate the two-dimensional array from cell values
Dim rowIndex As Integer = 0
For Each row As RangeRow In dataRange.Rows
Dim colIndex As Integer = 0
For Each cell As Cell In row
salesArray(rowIndex, colIndex) = cell.StringValue
colIndex += 1
Next
rowIndex += 1
Next
' Print each row to the console
Console.WriteLine("Data loaded into array:")
For i As Integer = 0 To rowCount - 1
For j As Integer = 0 To colCount - 1
Console.Write(salesArray(i, j) & vbTab)
Next
Console.WriteLine()
Next
End Sub
End Module
Imports IronXL
Module ReadExcelToArray
Sub Main()
' Load the Excel workbook from a file path
Dim workbook As WorkBook = WorkBook.Load("SalesData.xlsx")
' Access the first worksheet in the workbook
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
' Define the cell range to extract
Dim dataRange As IronXL.Range = sheet.GetRange("A1:D5")
' Determine array dimensions from the range
Dim rowCount As Integer = dataRange.Rows.Count
Dim colCount As Integer = dataRange.Columns.Count
Dim salesArray(rowCount - 1, colCount - 1) As String
' Populate the two-dimensional array from cell values
Dim rowIndex As Integer = 0
For Each row As RangeRow In dataRange.Rows
Dim colIndex As Integer = 0
For Each cell As Cell In row
salesArray(rowIndex, colIndex) = cell.StringValue
colIndex += 1
Next
rowIndex += 1
Next
' Print each row to the console
Console.WriteLine("Data loaded into array:")
For i As Integer = 0 To rowCount - 1
For j As Integer = 0 To colCount - 1
Console.Write(salesArray(i, j) & vbTab)
Next
Console.WriteLine()
Next
End Sub
End Module
Imports IronXL
Module ReadExcelToArray
Sub Main()
' Load the Excel workbook from a file path
Dim workbook As WorkBook = WorkBook.Load("SalesData.xlsx")
' Access the first worksheet in the workbook
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
' Define the cell range to extract
Dim dataRange As IronXL.Range = sheet.GetRange("A1:D5")
' Determine array dimensions from the range
Dim rowCount As Integer = dataRange.Rows.Count
Dim colCount As Integer = dataRange.Columns.Count
Dim salesArray(rowCount - 1, colCount - 1) As String
' Populate the two-dimensional array from cell values
Dim rowIndex As Integer = 0
For Each row As RangeRow In dataRange.Rows
Dim colIndex As Integer = 0
For Each cell As Cell In row
salesArray(rowIndex, colIndex) = cell.StringValue
colIndex += 1
Next
rowIndex += 1
Next
' Print each row to the console
Console.WriteLine("Data loaded into array:")
For i As Integer = 0 To rowCount - 1
For j As Integer = 0 To colCount - 1
Console.Write(salesArray(i, j) & vbTab)
Next
Console.WriteLine()
Next
End Sub
End Module
Comprensión de los objetos WorkBook y WorkSheet
WorkBook.Load admite archivos XLSX, XLS, CSV y TSV. Una vez cargado, workbook.DefaultWorkSheet devuelve la primera hoja. También puede acceder a las hojas por nombre con workbook.GetWorkSheet("Sheet1") o por índice con workbook.WorkSheets(0).
La llamada GetRange("A1:D5") devuelve un IronXL.Range que expone las colecciones Rows y Columns. Cada RangeRow itera objetos Cell y cell.StringValue devuelve la cadena de visualización independientemente del tipo de celda subyacente.
¿Cómo manejar los valores de celdas tipificados?
Las células IronXL exponen propiedades tipificadas junto con StringValue:
cell.IntValue-- analiza la celda como un enterocell.DoubleValue-- analiza la celda como doblecell.DateTimeValue-- analiza celdas con formato de fechacell.IsFormula-- indica si la celda contiene una fórmula
Para datos financieros, declare la matriz como Double y asigne cell.DoubleValue directamente. Esto evita conversiones de cadenas a números durante el procesamiento posterior.
Imports IronXL
Module ReadExcelToDoubleArray
Sub Main()
Dim workbook As WorkBook = WorkBook.Load("Revenue.xlsx")
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
Dim dataRange As IronXL.Range = sheet.GetRange("B2:E10")
Dim rowCount As Integer = dataRange.Rows.Count
Dim colCount As Integer = dataRange.Columns.Count
Dim revenueArray(rowCount - 1, colCount - 1) As Double
Dim rowIndex As Integer = 0
For Each row As RangeRow In dataRange.Rows
Dim colIndex As Integer = 0
For Each cell As Cell In row
revenueArray(rowIndex, colIndex) = cell.DoubleValue
colIndex += 1
Next
rowIndex += 1
Next
' Calculate column totals
For j As Integer = 0 To colCount - 1
Dim total As Double = 0
For i As Integer = 0 To rowCount - 1
total += revenueArray(i, j)
Next
Console.WriteLine($"Column {j + 1} total: {total:C}")
Next
End Sub
End Module
Imports IronXL
Module ReadExcelToDoubleArray
Sub Main()
Dim workbook As WorkBook = WorkBook.Load("Revenue.xlsx")
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
Dim dataRange As IronXL.Range = sheet.GetRange("B2:E10")
Dim rowCount As Integer = dataRange.Rows.Count
Dim colCount As Integer = dataRange.Columns.Count
Dim revenueArray(rowCount - 1, colCount - 1) As Double
Dim rowIndex As Integer = 0
For Each row As RangeRow In dataRange.Rows
Dim colIndex As Integer = 0
For Each cell As Cell In row
revenueArray(rowIndex, colIndex) = cell.DoubleValue
colIndex += 1
Next
rowIndex += 1
Next
' Calculate column totals
For j As Integer = 0 To colCount - 1
Dim total As Double = 0
For i As Integer = 0 To rowCount - 1
total += revenueArray(i, j)
Next
Console.WriteLine($"Column {j + 1} total: {total:C}")
Next
End Sub
End Module
IRON VB CONVERTER ERROR developers@ironsoftware.com
Resultado

Este ejemplo de código demuestra la API intuitiva de IronXL. El método WorkBook.Load abre el archivo Excel directamente desde la carpeta designada, mientras que el objeto Range proporciona acceso a regiones de celdas específicas dentro de la hoja de cálculo de Excel. A diferencia de las macros VBA heredadas, este enfoque es totalmente seguro y está integrado en el ecosistema .NET.
Leer datos XLSX del SII en matrices VB .NET para declaraciones AEAT
Un caso de uso habitual en empresas españolas es la lectura del fichero XLSX de conciliación SII para preparar el modelo 303 (declaración trimestral de IVA). El siguiente ejemplo carga el XLSX del SII, lo lee en una matriz bidimensional y calcula la base imponible total y la cuota de IVA acumulada, respetando la LOPDGDD al operar sólo sobre las columnas necesarias:
Imports IronXL
Module LeerSIIParaModelo303
Sub Main()
' Cargar el XLSX de conciliación del SII exportado por el ERP
' IronXL funciona en Linux/Docker sin Microsoft Office
Dim workbook As WorkBook = WorkBook.Load("conciliacion_sii_t1_2026.xlsx")
Dim hoja As WorkSheet = workbook.DefaultWorkSheet
' LOPDGDD: leer sólo columnas necesarias para el modelo 303
' Col B: Base Imponible, Col C: Cuota IVA (21%), Col D: Tipo Operación SII
Dim rango As IronXL.Range = hoja.GetRange("B2:D200")
Dim filas As Integer = rango.Rows.Count
Dim cols As Integer = rango.Columns.Count
Dim datosModelo303(filas - 1, cols - 1) As String
Dim fi As Integer = 0
For Each fila As RangeRow In rango.Rows
Dim ci As Integer = 0
For Each celda As Cell In fila
datosModelo303(fi, ci) = celda.StringValue
ci += 1
Next
fi += 1
Next
' Calcular totales para la casilla 10 (base IVA repercutido 21%) del modelo 303
Dim totalBase As Decimal = 0
Dim totalCuota As Decimal = 0
For i As Integer = 0 To filas - 1
Dim baseVal As Decimal
Dim cuotaVal As Decimal
If Decimal.TryParse(datosModelo303(i, 0), baseVal) Then totalBase += baseVal
If Decimal.TryParse(datosModelo303(i, 1), cuotaVal) Then totalCuota += cuotaVal
Next
Console.WriteLine($"Modelo 303 T1 2026 — Base imponible: {totalBase:C2} / Cuota IVA: {totalCuota:C2}")
' Exportar resultado resumido para entrega AEAT
Dim resumen As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim wsRes As WorkSheet = resumen.CreateWorkSheet("Resumen_303")
wsRes["A1"].Value = "Casilla 10 - Base IVA 21%"
wsRes["B1"].Value = totalBase
wsRes["A2"].Value = "Casilla 11 - Cuota IVA 21%"
wsRes["B2"].Value = totalCuota
resumen.SaveAs("AEAT_Modelo303_T1_2026_Resumen.xlsx")
Console.WriteLine("Resumen modelo 303 exportado correctamente.")
End Sub
End Module
Imports IronXL
Module LeerSIIParaModelo303
Sub Main()
' Cargar el XLSX de conciliación del SII exportado por el ERP
' IronXL funciona en Linux/Docker sin Microsoft Office
Dim workbook As WorkBook = WorkBook.Load("conciliacion_sii_t1_2026.xlsx")
Dim hoja As WorkSheet = workbook.DefaultWorkSheet
' LOPDGDD: leer sólo columnas necesarias para el modelo 303
' Col B: Base Imponible, Col C: Cuota IVA (21%), Col D: Tipo Operación SII
Dim rango As IronXL.Range = hoja.GetRange("B2:D200")
Dim filas As Integer = rango.Rows.Count
Dim cols As Integer = rango.Columns.Count
Dim datosModelo303(filas - 1, cols - 1) As String
Dim fi As Integer = 0
For Each fila As RangeRow In rango.Rows
Dim ci As Integer = 0
For Each celda As Cell In fila
datosModelo303(fi, ci) = celda.StringValue
ci += 1
Next
fi += 1
Next
' Calcular totales para la casilla 10 (base IVA repercutido 21%) del modelo 303
Dim totalBase As Decimal = 0
Dim totalCuota As Decimal = 0
For i As Integer = 0 To filas - 1
Dim baseVal As Decimal
Dim cuotaVal As Decimal
If Decimal.TryParse(datosModelo303(i, 0), baseVal) Then totalBase += baseVal
If Decimal.TryParse(datosModelo303(i, 1), cuotaVal) Then totalCuota += cuotaVal
Next
Console.WriteLine($"Modelo 303 T1 2026 — Base imponible: {totalBase:C2} / Cuota IVA: {totalCuota:C2}")
' Exportar resultado resumido para entrega AEAT
Dim resumen As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim wsRes As WorkSheet = resumen.CreateWorkSheet("Resumen_303")
wsRes["A1"].Value = "Casilla 10 - Base IVA 21%"
wsRes["B1"].Value = totalBase
wsRes["A2"].Value = "Casilla 11 - Cuota IVA 21%"
wsRes["B2"].Value = totalCuota
resumen.SaveAs("AEAT_Modelo303_T1_2026_Resumen.xlsx")
Console.WriteLine("Resumen modelo 303 exportado correctamente.")
End Sub
End Module
Imports IronXL
Module LeerSIIParaModelo303
Sub Main()
' Cargar el XLSX de conciliación del SII exportado por el ERP
' IronXL funciona en Linux/Docker sin Microsoft Office
Dim workbook As WorkBook = WorkBook.Load("conciliacion_sii_t1_2026.xlsx")
Dim hoja As WorkSheet = workbook.DefaultWorkSheet
' LOPDGDD: leer sólo columnas necesarias para el modelo 303
' Col B: Base Imponible, Col C: Cuota IVA (21%), Col D: Tipo Operación SII
Dim rango As IronXL.Range = hoja.GetRange("B2:D200")
Dim filas As Integer = rango.Rows.Count
Dim cols As Integer = rango.Columns.Count
Dim datosModelo303(filas - 1, cols - 1) As String
Dim fi As Integer = 0
For Each fila As RangeRow In rango.Rows
Dim ci As Integer = 0
For Each celda As Cell In fila
datosModelo303(fi, ci) = celda.StringValue
ci += 1
Next
fi += 1
Next
' Calcular totales para la casilla 10 (base IVA repercutido 21%) del modelo 303
Dim totalBase As Decimal = 0
Dim totalCuota As Decimal = 0
For i As Integer = 0 To filas - 1
Dim baseVal As Decimal
Dim cuotaVal As Decimal
If Decimal.TryParse(datosModelo303(i, 0), baseVal) Then totalBase += baseVal
If Decimal.TryParse(datosModelo303(i, 1), cuotaVal) Then totalCuota += cuotaVal
Next
Console.WriteLine($"Modelo 303 T1 2026 — Base imponible: {totalBase:C2} / Cuota IVA: {totalCuota:C2}")
' Exportar resultado resumido para entrega AEAT
Dim resumen As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim wsRes As WorkSheet = resumen.CreateWorkSheet("Resumen_303")
wsRes("A1").Value = "Casilla 10 - Base IVA 21%"
wsRes("B1").Value = totalBase
wsRes("A2").Value = "Casilla 11 - Cuota IVA 21%"
wsRes("B2").Value = totalCuota
resumen.SaveAs("AEAT_Modelo303_T1_2026_Resumen.xlsx")
Console.WriteLine("Resumen modelo 303 exportado correctamente.")
End Sub
End Module
Este flujo se ejecuta íntegramente en Linux/Docker sin instalar Office, lo que lo hace apto para entidades como pymes y autónomos sujetos al modelo 130 (pago fraccionado IRPF), o para empresas con obligaciones de TicketBAI en Bizkaia, Gipuzkoa y Araba que necesitan conciliar sus registros XLSX de facturación.
¿Cuál es el enfoque tradicional de interoperabilidad de Microsoft Office?
Interop de Microsoft Office se basa en la automatización COM para conectarse con una instancia de aplicación Excel. Para configurar esto en Visual Studio, vaya al menú Proyecto, seleccione "Agregar referencia" y busque la Biblioteca de objetos de Microsoft Excel en la pestaña COM. Debe existir una instalación local de Excel en cada máquina que ejecute el código.
Imports Microsoft.Office.Interop.Excel
Module InteropExcelArray
Sub Main()
Dim excelApp As New Application()
Dim workbooks As Workbooks = excelApp.Workbooks
Dim workbook As Workbook = Nothing
Dim sheet As Worksheet = Nothing
Try
' Suppress screen updates during processing
excelApp.ScreenUpdating = False
' Open the workbook by full file path
workbook = workbooks.Open("C:\Data\SalesData.xlsx")
' Reference the first worksheet
sheet = CType(workbook.Sheets(1), Worksheet)
' Define a range and pull values into an object array
Dim dataRange As Range = sheet.Range("A1", "D5")
Dim values(,) As Object = CType(dataRange.Value, Object(,))
' COM arrays are 1-based, so enumerate from index 1
Dim rows As Integer = values.GetUpperBound(0)
Dim columns As Integer = values.GetUpperBound(1)
For i As Integer = 1 To rows
Dim line As String = ""
For j As Integer = 1 To columns
line &= values(i, j).ToString() & vbTab
Next
Console.WriteLine(line)
Next
Catch ex As Exception
Console.WriteLine("Error: " & ex.Message)
Finally
' Release COM objects to prevent orphaned Excel processes
If sheet IsNot Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet)
End If
If workbook IsNot Nothing Then
workbook.Close(False)
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook)
End If
excelApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp)
End Try
End Sub
End Module
Imports Microsoft.Office.Interop.Excel
Module InteropExcelArray
Sub Main()
Dim excelApp As New Application()
Dim workbooks As Workbooks = excelApp.Workbooks
Dim workbook As Workbook = Nothing
Dim sheet As Worksheet = Nothing
Try
' Suppress screen updates during processing
excelApp.ScreenUpdating = False
' Open the workbook by full file path
workbook = workbooks.Open("C:\Data\SalesData.xlsx")
' Reference the first worksheet
sheet = CType(workbook.Sheets(1), Worksheet)
' Define a range and pull values into an object array
Dim dataRange As Range = sheet.Range("A1", "D5")
Dim values(,) As Object = CType(dataRange.Value, Object(,))
' COM arrays are 1-based, so enumerate from index 1
Dim rows As Integer = values.GetUpperBound(0)
Dim columns As Integer = values.GetUpperBound(1)
For i As Integer = 1 To rows
Dim line As String = ""
For j As Integer = 1 To columns
line &= values(i, j).ToString() & vbTab
Next
Console.WriteLine(line)
Next
Catch ex As Exception
Console.WriteLine("Error: " & ex.Message)
Finally
' Release COM objects to prevent orphaned Excel processes
If sheet IsNot Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet)
End If
If workbook IsNot Nothing Then
workbook.Close(False)
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook)
End If
excelApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp)
End Try
End Sub
End Module
Imports Microsoft.Office.Interop.Excel
Module InteropExcelArray
Sub Main()
Dim excelApp As New Application()
Dim workbooks As Workbooks = excelApp.Workbooks
Dim workbook As Workbook = Nothing
Dim sheet As Worksheet = Nothing
Try
' Suppress screen updates during processing
excelApp.ScreenUpdating = False
' Open the workbook by full file path
workbook = workbooks.Open("C:\Data\SalesData.xlsx")
' Reference the first worksheet
sheet = CType(workbook.Sheets(1), Worksheet)
' Define a range and pull values into an object array
Dim dataRange As Range = sheet.Range("A1", "D5")
Dim values(,) As Object = CType(dataRange.Value, Object(,))
' COM arrays are 1-based, so enumerate from index 1
Dim rows As Integer = values.GetUpperBound(0)
Dim columns As Integer = values.GetUpperBound(1)
For i As Integer = 1 To rows
Dim line As String = ""
For j As Integer = 1 To columns
line &= values(i, j).ToString() & vbTab
Next
Console.WriteLine(line)
Next
Catch ex As Exception
Console.WriteLine("Error: " & ex.Message)
Finally
' Release COM objects to prevent orphaned Excel processes
If sheet IsNot Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet)
End If
If workbook IsNot Nothing Then
workbook.Close(False)
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook)
End If
excelApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp)
End Try
End Sub
End Module
¿Por qué es importante la gestión de objetos COM?
El enfoque de interoperabilidad requiere una atención cuidadosa a la gestión del ciclo de vida de los objetos COM. Cada objeto devuelto por la aplicación Excel (libros, hojas de cálculo, rangos y celdas) contiene un puntero COM contado por referencia. Si no se llama a Marshal.ReleaseComObject en cada uno de estos objetos, queda un proceso EXCEL.EXE ejecutándose silenciosamente en segundo plano.
En los servidores, los procesos huérfanos se acumulan con el tiempo y eventualmente agotan la memoria o los controladores de archivos disponibles. El patrón Try...Finally mencionado anteriormente es el enfoque mínimo seguro, pero muchas bases de código empresariales agregan una utilidad de limpieza COM dedicada para manejar gráficos de objetos anidados.
La convención de indexación de matrices de interoperabilidad también difiere de las matrices VB .NET estándar: las matrices basadas en COM comienzan en el índice 1, no 0. Esto significa que cualquier bucle de fila o columna debe tener en cuenta la diferencia de un valor, que es una fuente común de errores de tiempo de ejecución y errores de truncamiento de datos.
¿Qué solución ofrece una mejor experiencia para los desarrolladores?
Al evaluar estos enfoques para su uso en producción, varios factores favorecen a IronXL como la solución preferida:
Simplicidad de implementación: IronXL se instala a través de un único paquete NuGet , mientras que Interop requiere configuraciones de entorno complejas. Esto es importante cuando su programa necesita procesar un archivo XLSX en un servidor de compilación o una función en la nube donde no existe ninguna sesión de usuario.
Mantenibilidad del código: leer una tabla de datos a través de IronXL mantiene el código breve y legible. Los recuentos de filas y columnas están disponibles como propiedades de primera clase. Con Interop, usted calcula límites superiores en matrices COM indexadas en 1 y convierte valores Object de límite tardío manualmente.
Flexibilidad de formato : más allá de los formatos de libros de Excel estándar como XLSX, IronXL admite de forma nativa el análisis de CSV, lo que resulta útil cuando los datos de prueba llegan en múltiples formatos. La biblioteca también puede crear nuevos archivos de libros de trabajo y escribir valores en las celdas con la misma simplicidad. Consulte la guía de formato IronXL para obtener una lista completa.
Manejo de errores : los patrones de excepción estándar de .NET se aplican a IronXL, lo que hace que la recuperación de errores sea sencilla. Las excepciones basadas en COM requieren una lógica de manejo adicional y pueden dejar las instancias de Excel en ejecución si no se administran adecuadamente.
Compatibilidad multiplataforma : IronXL se ejecuta en Linux y macOS a través de .NET 6 y versiones posteriores. La interoperabilidad es exclusiva de Windows porque depende del subsistema COM Win32. Para sistemas de cumplimiento SII o declaraciones AEAT que corren en contenedores Docker/Kubernetes, IronXL es la única opción viable.
| Criterio | IronXL | Microsoft Interop |
|---|---|---|
| Líneas de código para la lectura básica de una matriz | ~20 | ~40+ |
| Se requiere limpieza manual de COM | No | Sí |
| Funciona sin Excel instalado | Sí | No |
| Se ejecuta en pipelines de Docker/CI | Sí | No |
| Convención de indexación de matrices | Basado en 0 (.NET Standard) | Basado en 1 (estándar COM) |
| Apto para SII/AEAT en Linux | Sí | No |
¿Cómo trabajar con rangos dinámicos de Excel en VB .NET?
Las hojas de cálculo de producción rara vez tienen un número fijo de filas. IronXL proporciona la propiedad UsedRange en cada hoja de cálculo, que devuelve el rectángulo delimitador de todas las celdas no vacías. Puede utilizar esto en lugar de una cadena de rango codificada.
Imports IronXL
Module DynamicRangeExample
Sub Main()
Dim workbook As WorkBook = WorkBook.Load("DynamicData.xlsx")
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
' Get the bounding range of all populated cells
Dim usedRange As IronXL.Range = sheet.UsedRange
Dim rowCount As Integer = usedRange.Rows.Count
Dim colCount As Integer = usedRange.Columns.Count
Dim dynamicArray(rowCount - 1, colCount - 1) As String
Dim rowIndex As Integer = 0
For Each row As RangeRow In usedRange.Rows
Dim colIndex As Integer = 0
For Each cell As Cell In row
dynamicArray(rowIndex, colIndex) = cell.StringValue
colIndex += 1
Next
rowIndex += 1
Next
Console.WriteLine($"Loaded {rowCount} rows x {colCount} columns from UsedRange.")
End Sub
End Module
Imports IronXL
Module DynamicRangeExample
Sub Main()
Dim workbook As WorkBook = WorkBook.Load("DynamicData.xlsx")
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
' Get the bounding range of all populated cells
Dim usedRange As IronXL.Range = sheet.UsedRange
Dim rowCount As Integer = usedRange.Rows.Count
Dim colCount As Integer = usedRange.Columns.Count
Dim dynamicArray(rowCount - 1, colCount - 1) As String
Dim rowIndex As Integer = 0
For Each row As RangeRow In usedRange.Rows
Dim colIndex As Integer = 0
For Each cell As Cell In row
dynamicArray(rowIndex, colIndex) = cell.StringValue
colIndex += 1
Next
rowIndex += 1
Next
Console.WriteLine($"Loaded {rowCount} rows x {colCount} columns from UsedRange.")
End Sub
End Module
IRON VB CONVERTER ERROR developers@ironsoftware.com
¿Cómo filtrar y validar datos de una matriz después de cargarlos?
Después de completar la matriz, los pasos comunes de posprocesamiento incluyen:
- Omitir filas de encabezado : inicia el bucle de visualización en el índice 1 en lugar de 0 para omitir los encabezados de columna.
- Recortar espacios en blanco : llame a
.Trim()encell.StringValuepara eliminar los espacios iniciales y finales copiados de la hoja de cálculo. - Manejar celdas nulas : IronXL devuelve una cadena vacía para las celdas en blanco, por lo que las comprobaciones de celdas nulas son innecesarias en la mayoría de los casos.
- Validar rangos numéricos : después de cargar valores dobles, aplique una verificación de rango antes de almacenar para detectar celdas que contengan valores de marcador de posición como -1 o 9999.
- Conformidad LOPDGDD : en declaraciones AEAT, cargue sólo las columnas estrictamente necesarias para minimizar el tratamiento de datos personales.
Para conjuntos de datos más grandes, considere usar List(Of T) o una clase fuertemente tipada en lugar de una matriz bidimensional sin formato. Cargar datos en objetos tipificados facilita la lectura y la prueba del código posterior. La referencia del modelo de objetos IronXL documenta todas las propiedades de celda y los métodos de hoja de cálculo disponibles.
¿Cómo exportar una matriz VB .NET a Excel?
IronXL admite la escritura de datos de una matriz en una hoja de cálculo con la misma API utilizada para la lectura. Esto es útil para escenarios en los que transforma los datos en la memoria y necesita guardar el resultado como un nuevo archivo de Excel.
Imports IronXL
Module WriteArrayToExcel
Sub Main()
' Create a new workbook and worksheet
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim sheet As WorkSheet = workbook.CreateWorkSheet("Results")
Dim outputArray(,) As String = {
{"Region", "Q1", "Q2", "Q3"},
{"North", "12500", "14200", "15800"},
{"South", "9800", "10500", "11300"},
{"East", "8200", "9100", "9900"}
}
' Write the array contents to the worksheet cell by cell
For i As Integer = 0 To outputArray.GetUpperBound(0)
For j As Integer = 0 To outputArray.GetUpperBound(1)
Dim cellAddress As String = IronXL.ExcelAddress.ToAddress(i, j)
sheet(cellAddress).Value = outputArray(i, j)
Next
Next
workbook.SaveAs("Output.xlsx")
Console.WriteLine("Workbook saved as Output.xlsx")
End Sub
End Module
Imports IronXL
Module WriteArrayToExcel
Sub Main()
' Create a new workbook and worksheet
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim sheet As WorkSheet = workbook.CreateWorkSheet("Results")
Dim outputArray(,) As String = {
{"Region", "Q1", "Q2", "Q3"},
{"North", "12500", "14200", "15800"},
{"South", "9800", "10500", "11300"},
{"East", "8200", "9100", "9900"}
}
' Write the array contents to the worksheet cell by cell
For i As Integer = 0 To outputArray.GetUpperBound(0)
For j As Integer = 0 To outputArray.GetUpperBound(1)
Dim cellAddress As String = IronXL.ExcelAddress.ToAddress(i, j)
sheet(cellAddress).Value = outputArray(i, j)
Next
Next
workbook.SaveAs("Output.xlsx")
Console.WriteLine("Workbook saved as Output.xlsx")
End Sub
End Module
Imports IronXL
Module WriteArrayToExcel
Sub Main()
' Create a new workbook and worksheet
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim sheet As WorkSheet = workbook.CreateWorkSheet("Results")
Dim outputArray(,) As String = {
{"Region", "Q1", "Q2", "Q3"},
{"North", "12500", "14200", "15800"},
{"South", "9800", "10500", "11300"},
{"East", "8200", "9100", "9900"}
}
' Write the array contents to the worksheet cell by cell
For i As Integer = 0 To outputArray.GetUpperBound(0)
For j As Integer = 0 To outputArray.GetUpperBound(1)
Dim cellAddress As String = IronXL.ExcelAddress.ToAddress(i, j)
sheet(cellAddress).Value = outputArray(i, j)
Next
Next
workbook.SaveAs("Output.xlsx")
Console.WriteLine("Workbook saved as Output.xlsx")
End Sub
End Module
El asistente ExcelAddress.ToAddress(row, column) convierte coordenadas enteras basadas en cero en cadenas de notación A1. Esto mantiene limpio el bucle de escritura y evita calcular manualmente las direcciones de celda. Revise el tutorial de escritura de IronXL para obtener más patrones, incluida la inyección de fórmulas y la aplicación de estilos.
¿Cómo leer varias hojas de cálculo en matrices independientes?
Algunos libros de trabajo almacenan datos en varias hojas: por ejemplo, una hoja por mes o por región. IronXL expone todas las hojas a través de workbook.WorkSheets, que puede iterar para cargar cada hoja en su propia matriz.
Imports IronXL
Module MultiSheetArrayLoader
Sub Main()
Dim workbook As WorkBook = WorkBook.Load("AnnualReport.xlsx")
For Each sheet As WorkSheet In workbook.WorkSheets
Console.WriteLine($"Loading sheet: {sheet.Name}")
Dim dataRange As IronXL.Range = sheet.UsedRange
Dim rowCount As Integer = dataRange.Rows.Count
Dim colCount As Integer = dataRange.Columns.Count
Dim sheetArray(rowCount - 1, colCount - 1) As String
Dim rowIndex As Integer = 0
For Each row As RangeRow In dataRange.Rows
Dim colIndex As Integer = 0
For Each cell As Cell In row
sheetArray(rowIndex, colIndex) = cell.StringValue
colIndex += 1
Next
rowIndex += 1
Next
Console.WriteLine($" Loaded {rowCount} rows x {colCount} columns.")
Next
End Sub
End Module
Imports IronXL
Module MultiSheetArrayLoader
Sub Main()
Dim workbook As WorkBook = WorkBook.Load("AnnualReport.xlsx")
For Each sheet As WorkSheet In workbook.WorkSheets
Console.WriteLine($"Loading sheet: {sheet.Name}")
Dim dataRange As IronXL.Range = sheet.UsedRange
Dim rowCount As Integer = dataRange.Rows.Count
Dim colCount As Integer = dataRange.Columns.Count
Dim sheetArray(rowCount - 1, colCount - 1) As String
Dim rowIndex As Integer = 0
For Each row As RangeRow In dataRange.Rows
Dim colIndex As Integer = 0
For Each cell As Cell In row
sheetArray(rowIndex, colIndex) = cell.StringValue
colIndex += 1
Next
rowIndex += 1
Next
Console.WriteLine($" Loaded {rowCount} rows x {colCount} columns.")
Next
End Sub
End Module
Imports IronXL
Module MultiSheetArrayLoader
Sub Main()
Dim workbook As WorkBook = WorkBook.Load("AnnualReport.xlsx")
For Each sheet As WorkSheet In workbook.WorkSheets
Console.WriteLine($"Loading sheet: {sheet.Name}")
Dim dataRange As IronXL.Range = sheet.UsedRange
Dim rowCount As Integer = dataRange.Rows.Count
Dim colCount As Integer = dataRange.Columns.Count
Dim sheetArray(rowCount - 1, colCount - 1) As String
Dim rowIndex As Integer = 0
For Each row As RangeRow In dataRange.Rows
Dim colIndex As Integer = 0
For Each cell As Cell In row
sheetArray(rowIndex, colIndex) = cell.StringValue
colIndex += 1
Next
rowIndex += 1
Next
Console.WriteLine($" Loaded {rowCount} rows x {colCount} columns.")
Next
End Sub
End Module
Comprender la navegación en hojas
La colección workbook.WorkSheets tiene índice cero y admite tanto el acceso For Each como el acceso indexado. Utilice sheet.Name para identificar hojas mediante programación y bifurcar la lógica en función de los nombres de hojas conocidos. La guía de la hoja de trabajo IronXL cubre la selección de rango, los rangos nombrados y la detección de rango dinámico en detalle.
Para libros de trabajo con docenas de hojas, filtre por nombre antes de cargar para evitar procesar hojas irrelevantes y desperdiciar memoria. En informes del Banco de España o la CNMV con múltiples pestañas por entidad, este patrón permite procesar sólo las hojas de cada declaración prudencial.
¿Qué deben saber los desarrolladores sobre el formato de matriz de interoperabilidad?
El enfoque Interop devuelve datos de celda como una matriz Object(,) utilizando la indexación basada en 1 de COM. El primer elemento de la primera fila está en values(1, 1), no en values(0, 0). Esta es una fuente frecuente de errores de un dígito.
Una preocupación adicional es el manejo de valores nulos: Interop devuelve Nothing para celdas vacías. Llamar a .ToString() en una referencia nula genera un NullReferenceException en tiempo de ejecución. Debe agregar una protección nula en cada acceso a la celda:
If values(i, j) IsNot Nothing Then
line &= values(i, j).ToString() & vbTab
End If
If values(i, j) IsNot Nothing Then
line &= values(i, j).ToString() & vbTab
End If
If values(i, j) IsNot Nothing Then
line &= values(i, j).ToString() & vbTab
End If
IronXL elimina este problema al devolver una cadena vacía para las celdas en blanco, lo que significa que el código de bucle funciona sin ninguna protección adicional.
Para obtener información autorizada sobre el modelo de objetos de Excel utilizado por Interop, consulte la referencia de VBA de Microsoft Excel y la documentación de interoperabilidad de MSDN Office .
¿Cuales son tus próximos pasos?
Leer datos de Excel en matrices es una de las tareas más comunes de las hojas de cálculo .NET , y IronXL hace que la implementación sea sencilla. Para dar el siguiente paso:
- Descargue IronXL : instálelo mediante NuGet (
Install-Package IronXL.Excel) y siga la guía de inicio . - Explore el soporte de formatos : IronXL lee y escribe XLSX, XLS, CSV, TSV y JSON. Consulte la página de formatos admitidos para obtener más detalles.
- Pruebe funciones avanzadas : ordene rangos, aplique fórmulas, establezca estilos de celda y genere gráficos, todo sin tener Excel instalado. Revise la descripción general de las características de IronXL para obtener la lista completa de capacidades.
- Explorar ejemplos de código : la biblioteca de ejemplos de código IronXL proporciona fragmentos de copiar y pegar para docenas de tareas comunes de hojas de cálculo.
- Revisar licencias : para implementaciones de producción, las licencias de IronXL ofrecen niveles de desarrollador, equipo y OEM.

Tanto IronXL como Interop de Microsoft Office pueden leer datos de Excel en matrices, pero IronXL ofrece una experiencia de desarrollo superior a través de su arquitectura independiente de Office, una API más limpia y opciones de implementación flexibles. La biblioteca elimina problemas comunes como la gestión de objetos COM y las dependencias del sistema al tiempo que proporciona acceso a funciones avanzadas para la automatización de hojas de cálculo. Para equipos en España que trabajan con flujos de datos del SII, declaraciones AEAT, informes del Banco de España / CNMV o exportaciones TicketBAI, IronXL es la única opción que funciona en Linux/Docker sin Office.
Explore todas las capacidades de IronXL con proyectos de muestra, recursos y documentación en el centro de documentación de IronXL . Para aplicaciones empresariales, las opciones de licencia de IronXL ofrecen términos flexibles que se adaptan a cualquier alcance de proyecto.
Preguntas Frecuentes
¿Cómo leo el fichero XLSX del SII en una matriz VB.NET para preparar el modelo 303 de la AEAT?
Con IronXL, carga el XLSX del SII con WorkBook.Load, define el rango de las columnas necesarias (base imponible, cuota IVA, tipo de operación) y lee cada celda en una matriz bidimensional. Suma los valores para obtener los totales de las casillas 10 y 11 del modelo 303. Todo funciona en Linux/Docker sin Microsoft Office, cumpliendo con la LOPDGDD al procesar sólo los datos imprescindibles.
¿Cuál es la mejor manera de leer archivos de Excel en matrices usando VB.NET para cumplimiento fiscal español?
IronXL es la opción recomendada: no requiere Office, funciona en Linux/Docker, gestiona ficheros XLSX del SII y declaraciones AEAT, y respeta la LOPDGDD al permitir cargar sólo las columnas necesarias. Microsoft Interop no puede usarse en servidores Linux ni en entornos sin Excel instalado, lo que lo descarta para flujos de cumplimiento SII.
¿Puedo procesar los ficheros XLSX del SII en un servidor Linux con VB.NET?
Sí. IronXL funciona en .NET 6+ sobre Linux y macOS, por lo que puede leer y procesar los XLSX del SII directamente en servidores cloud o contenedores Docker sin necesidad de licencias de Microsoft Office.
¿Cómo se compara IronXL con Microsoft Office Interop para leer archivos Excel del SII?
IronXL elimina la dependencia de Office, funciona en Linux, no requiere gestión de objetos COM y devuelve strings vacíos para celdas en blanco. Interop sólo funciona en Windows con Excel instalado, lo que lo hace inviable para sistemas de cumplimiento SII en servidores cloud.
¿Puedo manipular datos de Excel sin instalar Microsoft Excel?
Sí, IronXL permite manipular datos de Excel sin necesidad de tener instalado Microsoft Excel. Esto lo convierte en una excelente opción para entornos de servidor donde no es posible instalar Excel, como los pipelines de procesamiento SII y generación de declaraciones AEAT.
¿IronXL es adecuado para manejar grandes conjuntos de datos de Excel en VB.NET?
Sí, IronXL está optimizado para el rendimiento y puede manejar de manera eficiente grandes conjuntos de datos de Excel, como los ficheros XLSX de conciliación SII con miles de registros de facturas.
¿IronXL soporta diferentes formatos de archivo Excel?
IronXL admite una amplia gama de formatos de archivos de Excel, incluidos XLSX, XLS, CSV y más, lo que lo hace versátil para diversas necesidades de procesamiento de datos fiscales.
¿Cuáles son las mejores prácticas para leer ficheros XLSX del SII en matrices VB.NET?
Use IronXL.WorkBook.Load para cargar el XLSX, defina el rango con GetRange limitándolo a las columnas necesarias (LOPDGDD), itere con For Each sobre las RangeRows, y acumule los valores en una matriz Double para calcular totales de casillas del modelo 303 o 347.
¿Cuáles son los beneficios de utilizar IronXL en lugar de Microsoft Office Interop?
IronXL es más fácil de usar, no requiere la instalación de Excel, funciona en Linux/Docker y ofrece un mejor rendimiento. Es la única opción para procesar ficheros XLSX del SII y declaraciones AEAT en entornos cloud o de contenedores.
¿En qué sentido IronXL gestiona las matrices bidimensionales de forma diferente a Microsoft Interop?
IronXL usa indexación basada en 0 (.NET Standard) y devuelve string vacío para celdas en blanco. Interop usa indexación basada en 1 (COM) y devuelve Nothing para celdas vacías, lo que requiere comprobaciones nulas en cada acceso y es una fuente frecuente de errores off-by-one.



