Przejdź do treści stopki
PORóWNAJ Z INNYMI KOMPONENTAMI

VB.NET – odczyt pliku Excel do tablicy: IronXL vs Microsoft Interop

Wczytanie danych z Excela do tablic w VB.NET wymaga załadowania skoroszytu, wybrania arkusza, iteracji wierszy i kolumn oraz zapisania wartości każdej komórki w tablicy dwuwymiarowej. Dzięki IronXL można to osiągnąć w kilku wierszach kodu bez instalowania pakietu Microsoft Office. Należy zainstalować pakiet NuGet, wywołać WorkBook.Load, uzyskać Range, a następnie przejrzeć jego kolekcję Rows w pętli, aby wypełnić tablicę.

Rozpocznij bezpłatny okres próbny, aby przekonać się, jak IronXL upraszcza automatyzację Excela w projektach Visual Studio.

Jak te rozwiązania wypadają w porównaniu na pierwszy rzut oka?

IronXL a Microsoft Office Interop — porównanie funkcji operacji na tablicach w VB.NET
Funkcja IronXL Microsoft Office Interop
Wymagana instalacja pakietu Office Nie Tak
Instalacja NuGet Tak — jeden pakiet Nie — odniesienie do COM
Obsługa środowiska serwerowego/CI Tak Ograniczone
Zarządzanie cyklem życia obiektów COM Nie jest wymagańe Wymagane
Obsługiwane formaty XLSX, XLS, CSV, TSV, JSON XLSX, XLS (tylko Excel)
API bezpieczne pod względem typów Tak Częściowe — późne wiązanie COM
Obsługa systemów Linux / macOS Tak (.NET 6+) Nie
Styl obsługi wyjątków Standardowe wyjątki .NET Standard Wyjątki COM + ręczne czyszczenie

Jak zainstalować IronXL dla projektów VB.NET?

Najszybszym sposobem dodania IronXL do dowolnego projektu .NET jest skorzystanie z menedżera pakietów NuGet. Otwórz konsolę menedżera pakietów w Visual Studio i uruchom:

Install-Package IronXl.Excel
Install-Package IronXl.Excel
SHELL

Alternatywnie można użyć interfejsu CLI platformy .NET:

dotnet add package IronXl.Excel
dotnet add package IronXl.Excel
SHELL

Po instalacji dodaj Imports IronXL na początku modułu VB.NET. Nie jest wymagańa instalacja pakietu Office — IronXL odczytuje i zapisuje pliki Excel wyłącznie za pomocą własnego silnika parsującego.

W przypadku projektów, które są przeznaczone dla starszych frameworków lub wymagają przypisania konkretnej wersji, strona IronXL NuGet zawiera listę wszystkich opublikowanych wydań. Dokumentacja IronXL zawiera instrukcje instalacji dla Visual Studio 2019, 2022 oraz .NET CLI.

W jaki sposób programiści mogą wczytywać dane z Excela do tablic przy użyciu IronXL?

IronXL zapewnia przejrzysty interfejs API do otwierania skoroszytów, zaznaczania zakresów i iteracji wartości komórek bez konieczności lokalnej instalacji pakietu Office. Metoda WorkBook.Load przyjmuje ścieżkę do pliku i zwraca obiekt WorkBook, który udostępnia wszystkie arkusze.

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

Zrozumienie obiektów WorkBook i WorkSheet

WorkBook.Load obsługuje pliki XLSX, XLS, CSV i TSV. Po załadowaniu workbook.DefaultWorkSheet zwraca pierwszy arkusz. Możesz również uzyskać dostęp do arkuszy według nazwy za pomocą workbook.GetWorkSheet("Sheet1") lub według indeksu za pomocą workbook.WorkSheets(0).

Wywołanie GetRange("A1:D5") zwraca IronXl.Range, które udostępnia kolekcje Rows i Columns. Każdy RangeRow iteruje obiekty Cell, a cell.StringValue zwraca ciąg wyświetlania niezależnie od typu komórki bazowej.

Jak radzisz sobie z wartościami komórek wpisanymi ręcznie?

Komórki IronXL udostępniają właściwości typowane obok StringValue:

  • cell.IntValue -- analizuje komórkę jako liczbę całkowitą
  • cell.DoubleValue -- analizuje komórkę jako liczbę typu double
  • cell.DateTimeValue -- analizuje komórki zawierające daty
  • cell.IsFormula -- wskazuje, czy komórka zawiera formułę

W przypadku danych finansowych należy zadeklarować tablicę jako Double i przypisać cell.DoubleValue bezpośrednio. Pozwala to uniknąć konwersji ciągów znaków na liczby podczas dalszego przetwarzania.

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

Wynik

VB .NET – wczytywanie pliku Excel do tablicy: Porównanie IronXL i Microsoft Interop: Obraz 1 – IronXL a Office Excel w kontekście wczytywania pliku Excel do tablicy w VB .NET

Ten przykład kodu ilustruje intuicyjny interfejs API IronXL. Metoda WorkBook.Load otwiera plik Excel bezpośrednio z wyznaczonego folderu, natomiast obiekt Range zapewnia dostęp do określonych obszarów komórek w arkuszu kalkulacyjnym Excel. W przeciwieństwie do starszych makr VBA, to podejście jest w pełni bezpieczne pod względem typów i zintegrowane z ekosystemem .NET.

Zacznij z IronXL teraz.
green arrow pointer

Czym jest tradycyjne podejście do interoperacyjności w pakiecie Microsoft Office?

Microsoft Office Interop wykorzystuje automatyzację COM do łączenia się z instancją aplikacji Excel. Aby skonfigurować to w Visual Studio, przejdź do menu Projekt, wybierz "Dodaj odwołanie" i wyszukaj bibliotekę obiektów Microsoft Excel w zakładce COM. Na każdym komputerze, na którym uruchamiany jest kod, musi być zainstalowany program Excel.

Imports Microsoft.Office.Interop.Excel

Module InteropExcelArray
    Sub Main()
        Dim excelApp As New Application()
        Dim workbooks As Workbooks = excelApp.Workbooks
        Dim workbook As Workbook = Niething
        Dim sheet As Worksheet = Niething

        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 IsNiet Niething Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet)
            End If
            If workbook IsNiet Niething 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 = Niething
        Dim sheet As Worksheet = Niething

        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 IsNiet Niething Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet)
            End If
            If workbook IsNiet Niething 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

Dłączego zarządzanie obiektami COM ma znaczenie?

Podejście Interop wymaga szczególnej uwagi w zakresie zarządzania cyklem życia obiektów COM. Każdy obiekt zwracany przez aplikację Excel — skoroszyty, arkusze, zakresy i komórki — zawiera wskaźnik COM z liczeniem odwołań. Brak wywołania Marshal.ReleaseComObject dla każdego z tych obiektów powoduje, że proces EXCEL.EXE działa w tle w trybie cichym.

Na serwerach z czasem gromadzą się osierocone procesy, które ostatecznie wyczerpują dostępną pamięć lub uchwyty plików. Powyższy wzorzec Try...Finally stanowi minimalne bezpieczne podejście, jednak wiele korporacyjnych baz kodu zawiera dedykowane narzędzie do czyszczenia COM, służące do obsługi zagnieżdżonych grafów obiektów.

Konwencja indeksowania tablic Interop różni się również od standardowych tablic VB.NET: tablice oparte na COM zaczynają się od indeksu 1, a nie 0. Oznacza to, że każda pętla wierszowa lub kolumnowa musi uwzględniać różnicę "off-by-one", która jest częstym źródłem błędów wykonania i błędów związanych z obcięciem danych.

Które rozwiązanie zapewnia lepsze wrażenia programisty?

Przy ocenie tych podejść pod kątem zastosowania produkcyjnego kilka czynników przemawia za IronXL jako preferowanym rozwiązaniem:

Prostota wdrożenia: IronXL instaluje się za pomocą jednego pakietu NuGet, podczas gdy Interop wymaga skomplikówanej konfiguracji środowiska. Ma to znaczenie, gdy program musi przetwarzać plik XLSX na serwerze kompilacji lub w funkcji chmurowej, gdzie nie istnieje sesja użytkownika.

Łatwość utrzymania kodu: Odczytywanie tabeli danych za pomocą IronXL pozwala zachować zwięzłość i czytelność kodu. Liczba wierszy i kolumn jest dostępna jako właściwości pierwszej klasy. Dzięki Interop można obliczać górne granice tablic COM indeksowanych od 1 oraz ręcznie rzutować wartości Object wiązane w czasie wykonywania.

Elastyczność formatów: Oprócz standardowych formatów skoroszytów Excel, takich jak XLSX, IronXL natywnie obsługuje parsowanie plików CSV, co jest przydatne, gdy dane testowe są dostarczane w wielu formatach. Biblioteka może również tworzyć nowe pliki skoroszytów i zapisywać wartości z powrotem do komórek z równą łatwością. Pełną listę można znaleźć w przewodniku po formatach IronXL.

Obsługa błędów: W IronXL obowiązują standardowe wzorce wyjątków .NET, co sprawia, że naprawa błędów jest prosta. Wyjątki oparte na COM wymagają dodatkowej logiki obsługi i mogą pozostawić uruchomione instancje programu Excel, jeśli nie są odpowiednio zarządzane.

Obsługa wielu platform: IronXL działa na systemach Linux i macOS za pośrednictwem .NET 6 i nowszych wersji. Interop działa wyłącznie w systemie Windows, ponieważ opiera się na podsystemie Win32 COM.

Kompromisy między wydajnością a konserwacją przy odczytywaniu tablic w VB.NET
Kryteria IronXL Microsoft Interop
Linie kodu do podstawowego odczytu tablicy ~20 ~40+
Wymagane ręczne czyszczenie COM Nie Tak
Działa bez zainstalowanego programu Excel Tak Nie
Działa w Dockerze / potokach CI Tak Nie
Konwencja indeksowania tablic 0-based (.NET Standard) Oparty na 1 (standard COM)

Jak pracować z dynamicznymi zakresami w Excelu w VB.NET?

Arkusze kalkulacyjne w środowisku produkcyjnym rzadko mają stałą liczbę wierszy. IronXL udostępnia w każdym arkuszu właściwość UsedRange, która zwraca prostokąt ograniczający wszystkie niepuste komórki. Można to wykorzystać zamiast sztywno zakodowanego ciągu znaków określającego zakres.

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

Jak filtrować i weryfikować dane tablicowe po załadowaniu?

Po wypełnieniu tablicy typowe etapy przetwarzania końcowego obejmują:

  • Pomiń wiersze nagłówków: Rozpocznij pętlę wyświetlania od indeksu 1 zamiast 0, aby pominąć nagłówki kolumn.
  • Usuń spacje: Wywołaj .Trim() na cell.StringValue, aby usunąć spacje na początku i na końcu, skopiowane z arkusza kalkulacyjnego.
  • Obsługa komórek null: IronXL zwraca pusty ciąg znaków dla pustych komórek, więc w większości przypadków sprawdzanie wartości null nie jest konieczne.
  • Sprawdzanie zakresów liczbowych: Po załadowaniu wartości typu double należy przed zapisaniem zastosować kontrolę zakresu, aby wychwycić komórki zawierające wartości zastępcze, takie jak -1 lub 9999.

W przypadku większych zbiorów danych warto rozważyć użycie List(Of T) lub klasy silnie typowanej zamiast surowej tablicy dwuwymiarowej. Wczytanie danych do obiektów typu typu ułatwia czytanie i testowanie kodu w dalszej części. Dokumentacja modelu obiektowego IronXL zawiera wszystkie dostępne właściwości komórek i metody arkusza.

Jak wyeksportować tablicę VB.NET z powrotem do programu Excel?

IronXL obsługuje zapisywanie danych tablicowych z powrotem do arkusza kalkulacyjnego przy użyciu tego samego interfejsu API, co do odczytu. Jest to przydatne w sytuacjach, gdy przekształcasz dane w pamięci i musisz zapisać wynik jako nowy plik 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"},
            {"Nierth", "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"},
            {"Nierth", "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"},
            {"Nierth", "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

Funkcja pomocnicza ExcelAddress.ToAddress(row, column) konwertuje współrzędne całkowitoliczbowe zaczynające się od zera na ciągi znaków w notacji A1. Dzięki temu pętla zapisu pozostaje przejrzysta i pozwala uniknąć ręcznego obliczania adresów komórek. Zapoznaj się z samouczkiem pisania w IronXL, aby poznać więcej wzorców, w tym wstawianie formuł i stosowanie stylów.

Jak wczytać wiele arkuszy do oddzielnych tablic?

Niektóre skoroszyty przechowują dane w wielu arkuszach — na przykład jeden arkusz na miesiąc lub na region. IronXL udostępnia wszystkie arkusze poprzez workbook.WorkSheets, które można iterować, aby załadować każdy arkusz do własnej tablicy.

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

Zrozumienie nawigacji w arkuszu

Kolekcja workbook.WorkSheets jest indeksowana od zera i obsługuje zarówno dostęp For Each, jak i indeksowany. Użyj sheet.Name do identyfikacji arkuszy programowo i logiki rozgałęzień w oparciu o znane nazwy arkuszy. Przewodnik po arkuszach IronXL szczegółowo omawia wybór zakresów, zakresy nazwane oraz dynamiczne wykrywanie zakresów.

W przypadku skoroszytów zawierających dziesiątki arkuszy przed załadowaniem należy zastosować filtrowanie według nazwy, aby uniknąć przetwarzania nieistotnych arkuszy i marnowania pamięci.

Co programiści powinni wiedzieć o formacie tablicy Interop?

Podejście Interop zwraca dane komórki jako tablicę Object(,) przy użyciu indeksowania COM opartego na 1. Pierwszy element w pierwszym wierszu znajduje się pod numerem values(1, 1), a nie values(0, 0). Jest to częste źródło błędów typu "off-by-one".

Dodatkową kwestią jest obsługa wartości null: Interop zwraca Niething dla pustych komórek. Wywołanie .ToString() na odwołaniu null powoduje wygenerowanie błędu NullReferenceException w czasie wykonywania. Należy dodać zabezpieczenie przed wartością null wokół każdego dostępu do komórki:

If values(i, j) IsNiet Niething Then
    line &= values(i, j).ToString() & vbTab
End If
If values(i, j) IsNiet Niething 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 eliminuje ten problem, zwracając pusty ciąg znaków dla pustych komórek, co oznacza, że kod pętli działa bez żadnych dodatkowych zabezpieczeń.

Aby uzyskać wiarygodne informacje na temat modelu obiektowego programu Excel używanego przez Interop, zapoznaj się z dokumentacją Microsoft Excel VBA oraz dokumentacją MSDN dotyczącą integracji z pakietem Office.

Jakie są Twoje kolejne kroki?

Wczytywanie danych z Excela do tablic jest jednym z najczęstszych zadań związanych z arkuszami kalkulacyjnymi w .NET, a IronXL sprawia, że implementacja jest prosta. Aby przejść do następnego etapu:

  • Pobierz IronXL: Zainstaluj za pomocą NuGet (Install-Package IronXl.Excel) i postępuj zgodnie z instrukcją rozpoczęcia pracy.
  • Obsługa formatów: IronXL odczytuje i zapisuje pliki XLSX, XLS, CSV, TSV oraz JSON. Szczegółowe informacje można znaleźć na stronie poświęconej obsługiwanym formatom.
  • Wypróbuj zaawansowane funkcje: sortuj zakresy, stosuj formuły, ustaw style komórek i generuj wykresy — wszystko to bez zainstalowanego programu Excel. Zapoznaj się z przeglądem funkcji IronXL, aby uzyskać pełną listę możliwości.
  • Przeglądaj przykłady kodu: Biblioteka przykładów kodu IronXL zawiera fragmenty kodu do skopiowania i wklejenia, przeznaczone do dziesiątek typowych zadań związanych z arkuszami kalkulacyjnymi.
  • Przegląd licencji: W przypadku wdrożeń produkcyjnych licencjonowanie IronXL oferuje poziomy deweloperski, zespołowy i OEM.

VB .NET – wczytywanie pliku Excel do tablicy: Porównanie IronXL i Microsoft Interop: Obraz 2 – Wynik działania IronXL

Zarówno IronXL, jak i Microsoft Office Interop mogą odczytywać dane z Excela do tablic, ale IronXL zapewnia lepsze wrażenia programisty dzięki architekturze niezależnej od pakietu Office, przejrzystszemu API i elastycznym opcjom wdrażania. Biblioteka eliminuje typowe problemy, takie jak zarządzanie obiektami COM i zależności systemówe, zapewniając jednocześnie dostęp do zaawansowanych funkcji automatyzacji arkuszy kalkulacyjnych.

Poznaj pełne możliwości IronXL dzięki przykładowym projektom, zasobom i dokumentacji dostępnym w centrum dokumentacji IronXL. W przypadku aplikacji korporacyjnych opcje licencyjne IronXL zapewniają elastyczne warunki dostosowane do każdego zakresu projektu.

Często Zadawane Pytania

Jaki jest najlepszy sposób na wczytanie plików Excel do tablic przy użyciu VB.NET?

Wczytywanie plików Excel do tablic w VB.NET można skutecznie osiągnąć za pomocą IronXL lub Microsoft Office Interop. IronXL zapewnia uproszczone i wydajne podejście, eliminując potrzebę instalacji programu Microsoft Excel i zmniejszając złożoność kodu.

Jak IronXL wypada w porównaniu z Microsoft Office Interop pod względem odczytu plików Excel?

IronXL oferuje bardziej usprawnioną i szybszą metodę wczytywania plików Excel do tablic w porównaniu z Microsoft Office Interop. Nie wymaga instalacji programu Excel na serwerze i obsługuje operacje na plikach Excel przy mniejszym obciążeniu.

Czy mogę przetwarzać dane z Excela bez instalowania programu Microsoft Excel?

Tak, korzystanie z IronXL pozwala na manipulowanie danymi Excel bez konieczności instalowania programu Microsoft Excel. To sprawia, że jest to świetna opcja dla środowisk serwerowych, w których instalacja Excela nie jest możliwa.

Dlaczego warto rozważyć użycie IronXl.Excel do operacji w Excelu w VB.NET?

IronXL upraszcza operacje w programie Excel, zapewniając intuicyjny interfejs API obsługujący różne formaty plików Excel. Zapewnia to większą wydajność i łatwiejsze wdrożenie, zwłaszcza w środowiskach, w których nie można zainstalować programu Microsoft Excel.

Czy IronXL nadaje się do obsługi dużych zbiorów danych Excel w VB.NET?

Tak, IronXL jest zoptymalizowany pod kątem wydajności i może efektywnie obsługiwać duże zbiory danych Excel, zapewniając szybkie wyodrębnianie i przetwarzanie danych.

Jakie są dostępne przykłady kodu do wczytywania plików Excel do tablic przy użyciu VB.NET?

Przewodnik zawiera działające przykłady kodu zarówno dla IronXL, jak i Microsoft Office Interop, pokazujące, jak efektywnie wczytywać pliki Excel do tablic w VB.NET.

Czy IronXL obsługuje różne formaty plików Excel?

IronXL obsługuje szeroki zakres formatów plików Excel, w tym XLSX, XLS, CSV i inne, dzięki czemu jest wszechstronnym narzędziem dostosowanym do różnych potrzeb związanych z przetwarzaniem danych.

Jakie są zalety korzystania z IronXL w porównaniu z Microsoft Office Interop?

IronXL jest łatwiejszy w użyciu, nie wymaga instalacji programu Excel i oferuje lepszą wydajność. Upraszcza kod i zmniejsza liczbę potencjalnych błędów związanych z interakcjami COM w Microsoft Office Interop.

Czym różni się sposób obsługi tablic dwuwymiarowych w IronXL od podejścia Microsoft Interop?

IronXL udostępnia bezpośrednie metody konwersji danych z Excela na tablice dwuwymiarowe, zapewniając bardziej wydajne i proste podejście w porównaniu z bardziej złożoną konfiguracją wymaganą w przypadku Microsoft Interop.

Jakie najlepsze praktyki są zalecane przy wczytywaniu plików Excel do tablic?

Najlepsze praktyki obejmują wybór odpowiedniego narzędzia dla danego środowiska, takiego jak IronXL ze względu na łatwość obsługi i wydajność, oraz zapewnienie efektywnej struktury kodu w celu skutecznego zarządzania pamięcią i mocą obliczeniową.

Jordi Bardia
Inżynier oprogramowania
Jordi jest najbardziej biegły w Pythonie, C# i C++. Kiedy nie wykorzystuje swoich umiejętności w Iron Software, programuje gry. Dzieląc odpowiedzialność za testowanie produktów, rozwój produktów i badania, Jordi wnosi ogromną wartość do ciągłej poprawy produktów. Różnorodne doświadczenia ...
Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie