Saltar al pie de página
COMPARAR CON OTROS COMPONENTES

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?

IronXL vs Interop de Microsoft Office: Comparación de características para operaciones de matriz en VB .NET
Función IronXL Interop de Microsoft Office
Se requiere instalación de oficina No
instalación de NuGet Sí, un paquete No -- Referencia COM
Compatibilidad con entornos de servidor/CI 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 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
SHELL

Alternativamente, utilice la CLI de .NET :

dotnet add package IronXL.Excel
dotnet add package IronXL.Excel
SHELL

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
$vbLabelText   $csharpLabel

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 entero
  • cell.DoubleValue -- analiza la celda como doble
  • cell.DateTimeValue -- analiza celdas con formato de fecha
  • cell.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
$vbLabelText   $csharpLabel

Resultado

VB .NET Leer archivo de Excel en una matriz: Comparación de interoperabilidad de IronXL frente a Microsoft: Imagen 1: IronXL frente a Office Excel para realizar la lectura de un archivo de Excel en una matriz de VB .NET

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.

Empiece con IronXL ahora.
green arrow pointer

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

¿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.

Compensaciones de rendimiento y mantenimiento para la lectura de matrices en VB .NET
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
Funciona sin Excel instalado No
Se ejecuta en pipelines de Docker/CI 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 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
$vbLabelText   $csharpLabel

¿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() en cell.StringValue para 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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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.

VB .NET Leer archivo de Excel en una matriz: Comparación de interoperabilidad de IronXL vs Microsoft: Imagen 2 - Salida de IronXL

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.

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