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?
| 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
Alternatywnie można użyć interfejsu CLI platformy .NET:
dotnet add package IronXl.Excel
dotnet add package IronXl.Excel
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
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 doublecell.DateTimeValue-- analizuje komórki zawierające datycell.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
Wynik

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.
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
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.
| 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
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()nacell.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
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
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
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.

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



