VB.NET 將 Excel 檔案讀取到陣列:IronXL 與 Microsoft Interop 的比較
在 VB.NET 中將 Excel 資料讀入數組需要載入工作簿、選擇工作表、遍歷行和列,並將每個單元格的值儲存在二維數組中。 使用 IronXL,只需幾行程式碼即可完成此操作,無需安裝 Microsoft Office。安裝 NuGet 套件,呼叫 WorkBook.Load,取得 Range,然後循環遍歷其 Rows 集合以填入陣列。
立即開始免費試用,探索 IronXL 如何簡化 Visual Studio 專案中的 Excel 自動化。
這些解決方案乍看之下有何異同?
| 特點 | IronXL | Microsoft Office Interop |
|---|---|---|
| 需安裝辦公室軟體 | 無 | 是 |
| NuGet 安裝 | 是的——一個包裹 | 否 -- COM 參考 |
| 伺服器/CI 環境支援 | 是 | 限額 |
| COM物件生命週期管理 | 無需 | 必填 |
| 支援的格式 | XLSX、XLS、CSV、TSV、JSON | XLSX、XLS(限 Excel) |
| 類型安全的 API | 是 | 部分 -- 後期 COM |
| Linux/macOS 支持 | 是的(.NET 6+) | 無 |
| 例外處理風格 | 標準 .NET 異常 | COM 異常 + 手動清理 |
如何為VB.NET專案安裝IronXL?
將 IronXL 新增至任何 .NET 專案的最快方法是透過 NuGet 套件管理器。 在 Visual Studio 中開啟套件管理員控制台並執行:
Install-Package IronXL.Excel
Install-Package IronXL.Excel
或者,使用 .NET CLI:
dotnet add package IronXL.Excel
dotnet add package IronXL.Excel
安裝完成後,在 VB.NET 模組的頂部新增 Imports IronXL。 無需安裝 Office——IronXL 完全透過其自身的解析引擎讀取和寫入 Excel 檔案。
對於面向舊框架或需要特定版本鎖定的項目, IronXL NuGet 頁面列出了所有已發布的版本。 IronXL 文件提供了 Visual Studio 2019、2022 和 .NET CLI 的安裝指南。
開發人員如何使用 IronXL 將 Excel 資料讀入陣列?
IronXL 提供了一個簡潔的 API,用於開啟工作簿、選擇範圍和遍歷儲存格值,而無需本機安裝 Office。 WorkBook.Load 方法接受一個檔案路徑,並傳回一個 WorkBook 對象,該對象公開所有工作表。
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
了解工作簿和工作表對象
WorkBook.Load 支援 XLSX、XLS、CSV 和 TSV 檔案。 載入完成後,workbook.DefaultWorkSheet 傳回第一個工作表。 您也可以透過名稱存取工作表(workbook.GetWorkSheet("Sheet1"))或透過索引存取工作表(workbook.WorkSheets(0))。
GetRange("A1:D5") 呼叫傳回一個 IronXL.Range,該 Rows 和 Columns 集合。 每個 RangeRow 都會迭代 Cell 對象,而 cell.StringValue 則會返回顯示字串,而不管底層單元格類型如何。
如何處理輸入的儲存格值?
IronXL 儲存格除了 StringValue 之外,也公開類型化屬性:
cell.IntValue-- 將單元格解析為整數cell.DoubleValue-- 將單元格解析為雙精度浮點數cell.DateTimeValue-- 解析日期格式儲存格cell.IsFormula-- 表示儲存格是否包含公式
對於財務數據,將數組聲明為 Double,並直接賦值給 cell.DoubleValue。 這樣可以避免在下游處理過程中進行字串到數字的轉換。
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
輸出
此程式碼範例示範了 IronXL 直覺的 API。 WorkBook.Load 方法直接從您指定的資料夾開啟 Excel 文件,而 Range 物件提供對 Excel 電子表格中特定儲存格區域的存取。 與傳統的 VBA 巨集不同,這種方法是完全類型安全的,並且整合到 .NET 生態系統中。
!{--01001100010010010100001001010010010000010101001001011001010111110100011101000101010101 01000101111101010011010101000100000101010010010101000100010101000100010111110101011101001000110 1010101000100100001011111010100000101001001001111010001000101010101010000110101010100101010101011 10101010001010010010010010010000010100110001011111010000100100110001001111101000011010010111111010000110100101110--
什麼是傳統的 Microsoft Office 互通方法?
Microsoft Office Interop 依賴 COM 自動化與 Excel 應用程式實例連線。 若要在 Visual Studio 中進行此設置,請導航至"專案"選單,選擇"新增參考",然後在 COM 標籤下搜尋 Microsoft Excel 物件庫。 運行該程式碼的每台電腦上都必須安裝本機 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 = 無thing
Dim sheet As Worksheet = 無thing
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 Is無t 無thing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet)
End If
If workbook Is無t 無thing 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 = 無thing
Dim sheet As Worksheet = 無thing
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 Is無t 無thing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet)
End If
If workbook Is無t 無thing 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
為什麼 COM 物件管理如此重要?
互通方法需要格外注意 COM 物件生命週期管理。 Excel 應用程式傳回的每個物件(工作簿、工作表、區域和儲存格)都包含一個參考計數的 COM 指標。 如果未能對每個物件呼叫 Marshal.ReleaseComObject,則 EXCEL.EXE 程序會在背景靜默運作。
在伺服器上,孤立進程會隨著時間的推移而不斷積累,最終耗盡可用記憶體或檔案句柄。 上面的 Try...Finally 模式是最低限度的安全方法,但許多企業程式碼庫會新增一個專門的 COM 清理實用程式來處理巢狀物件圖。
Interop 陣列索引約定也與標準 VB.NET 陣列不同:基於 COM 的陣列從索引 1 開始,而不是 0。這意味著任何行或列循環都必須考慮差一的差異,這是運行時錯誤和資料截斷錯誤的常見來源。
哪種解決方案能提供更好的開發者體驗?
在評估這些方法在生產應用中的可行性時,有幾個因素顯示 IronXL 是更優的選擇:
部署簡單性: IronXL 透過單一 NuGet 套件進行安裝,而 Interop 需要複雜的環境配置。 當您的程式需要在建置伺服器或雲端函數上處理 XLSX 文件,而該伺服器上不存在使用者會話時,這一點就非常重要了。
程式碼可維護性:透過 IronXL 讀取資料表可以保持程式碼簡潔易讀。 行數和列數是一等屬性。 使用 Interop,您可以計算索引為 1 的 COM 陣列的上限,並手動轉換後期邊界 Object 值。
格式彈性:除了 XLSX 等標準 Excel 工作簿格式外,IronXL 還原生支援 CSV 解析,這在測試資料以多種格式到達時非常有用。 該庫還可以建立新的工作簿文件,並以同樣簡單的方式將值寫回儲存格。 請參閱IronXL 格式指南以取得完整清單。
錯誤處理:IronXL 適用標準的 .NET 例外模式,讓錯誤復原變得簡單。 基於 COM 的例外狀況需要額外的處理邏輯,如果管理不當,可能會導致 Excel 執行個體持續運作。
跨平台支援:IronXL 可透過 .NET 6 及更高版本在 Linux 和 macOS 上運作。 Interop 僅適用於 Windows 系統,因為它依賴 Win32 COM 子系統。
| 標準 | IronXL | Microsoft Interop |
|---|---|---|
| 基本數組讀取的程式碼行數 | 約20 | 40歲以上 |
| 需要手動清理 COM 對象 | 無 | 是 |
| 無需安裝 Excel 即可運行 | 是 | 無 |
| 可在 Docker/CI 管線中運行 | 是 | 無 |
| 數組索引約定 | 基於 0 的(.NET 標準) | 基於 1 的(COM 標準) |
如何在VB.NET處理動態Excel區域?
生產電子表格的行數通常不是固定的。 IronXL 在每個工作表上提供 UsedRange 屬性,該屬性傳回所有非空白單元格的邊界矩形。 你可以使用這個來代替硬編碼的範圍字串。
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
載入後如何過濾和驗證數組資料?
數組填滿完成後,常見的後處理步驟包括:
-跳過標題行:從索引 1 而不是 0 開始顯示循環,以省略列標題。
-刪除空格:呼叫 .Trim() on cell.StringValue 刪除從電子表格複製的前導和尾隨空格。
-處理空白儲存格:IronXL 對空白儲存格傳回空字串,因此在大多數情況下不需要進行空值檢查。
-驗證數值範圍:載入雙精確度浮點數後,在儲存之前套用範圍檢查,以擷取包含佔位符值(如 -1 或 9999)的儲存格。
對於較大的資料集,請考慮使用 List(Of T) 或強型別類,而不是原始的二維數組。 將資料載入到類型化物件中,可以簡化下游程式碼的閱讀和測試。 IronXL物件模型參考文件記錄了所有可用的儲存格屬性和工作表方法。
如何將VB.NET陣列匯出回Excel?
IronXL 支援使用與讀取相同的 API 將陣列資料寫回工作表。 這適用於在記憶體中轉換資料並將結果儲存為新的 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"},
{"無rth", "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"},
{"無rth", "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
ExcelAddress.ToAddress(row, column) 輔助程式將基於零的整數座標轉換為 A1 表示字串。 這樣可以保持寫入迴圈的簡潔,避免手動計算單元位址。 請查看IronXL 寫作教程,以了解更多模式,包括公式註入和樣式應用。
如何將多個工作表中的資料分別讀取到不同的陣列中?
有些工作簿會將資料儲存在多個工作表中-例如,每個月一個工作表或每個地區一個工作表。 IronXL 透過 workbook.WorkSheets 公開所有工作表,您可以遍歷該工作表,將其載入到自己的陣列中。
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
了解表格導航
workbook.WorkSheets 集合從零開始索引,並且支援 For Each 和索引存取。 使用 sheet.Name 以程式設計方式識別工作表,並根據已知的工作表名稱進行分支邏輯。 IronXL 工作表指南詳細介紹了範圍選擇、命名範圍和動態範圍偵測。
對於包含數十個工作表的文檔,在載入之前按名稱進行篩選,以避免處理無關的工作表並浪費記憶體。
開發者應該了解哪些關於互通數組格式的知識?
Interop 方法使用 COM 的 1 索引將儲存格資料作為 Object(,) 陣列傳回。 第一行的第一個元素位於 values(1, 1),而非 values(0, 0)。 這是導致差一錯誤的常見原因。
另一個需要關注的問題是空值處理:Interop 會為空白儲存格傳回 無thing。 對空引用呼叫 .ToString() 會在執行時拋出 NullReferenceException 例外。您必須在每個單元格訪問周圍添加空值保護:
If values(i, j) Is無t 無thing Then
line &= values(i, j).ToString() & vbTab
End If
If values(i, j) Is無t 無thing 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 透過為空白儲存格傳回空字串來消除此問題,這表示循環程式碼無需任何額外的保護即可運作。
有關 Interop 使用的 Excel 物件模型的權威性信息,請參閱Microsoft Excel VBA 參考和MSDN Office 互通文件。
下一步計劃是什麼?
將 Excel 資料讀入陣列是 .NET 電子表格中最常見的任務之一,而 IronXL 使實現該任務變得非常簡單。 採取下一步行動:
-下載 IronXL :透過 NuGet 安裝 (Install-Package IronXL.Excel) 並依照入門指南進行操作。
-探索格式支援:IronXL 可讀取和寫入 XLSX、XLS、CSV、TSV 和 JSON。 詳情請參閱支援的格式頁面。
-嘗試進階功能:對範圍進行排序、應用公式、設定儲存格樣式和產生圖表——所有這些都無需安裝 Excel。 請查看IronXL 功能概述以取得完整的功能清單。
-瀏覽程式碼範例: IronXL 程式碼範例庫提供了數十種常見電子表格任務的複製貼上程式碼片段。
-查看許可:對於生產部署, IronXL 許可證提供開發人員、團隊和 OEM 等級。
! VB .NET 將 Excel 檔案讀取到陣列:IronXL 與 Microsoft Interop 比較:圖 2 - IronXL 輸出
IronXL 和 Microsoft Office Interop 都可以將 Excel 資料讀取到陣列中,但 IronXL 透過其獨立於 Office 的架構、更簡潔的 API 和靈活的部署選項,提供了更卓越的開發體驗。 該庫消除了 COM 物件管理和系統依賴等常見痛點,同時提供了對電子表格自動化高級功能的存取。
在IronXL 文件中心,您可以查看範例項目、資源和文檔,探索 IronXL 的全部功能。 對於企業應用, IronXL 的授權選項提供靈活的條款,以適應任何專案範圍。
常見問題解答
使用VB.NET將Excel文件讀取到陣列的最佳方法是什麼?
在VB.NET中讀取Excel文件到陣列可以使用IronXL或Microsoft Office Interop來有效實現。IronXL提供了一種簡化而高效的方法,消除了對Microsoft Excel安裝的需求,並降低了代碼的複雜性。
IronXL在讀取Excel文件時如何與Microsoft Office Interop比較?
IronXL為讀取Excel文件到陣列提供了一種更簡化和快速的方法,與Microsoft Office Interop相比,不需要在伺服器上安裝Excel,並且以更少的開銷處理Excel文件操作。
能否不安裝Microsoft Excel操作Excel數據?
是的,使用IronXL可以不需要安裝Microsoft Excel操作Excel數據。這使其成為在不適合安裝Excel的伺服器環境中的一個很好的選擇。
為什麼要考慮在VB.NET中使用IronXL進行Excel操作?
IronXL通過提供簡潔的API來處理各種Excel文件格式簡化了Excel操作。它在性能上更快,部署更容易,特別是在不能安裝Microsoft Excel的環境中。
IronXL適合在VB.NET中處理大型Excel資料集嗎?
是的,IronXL經過優化以提高性能,可高效處理大型Excel資料集,提供快速數據抽取和操作。
哪些代碼範例可用於在VB.NET中將Excel文件讀取到陣列?
本指南提供了IronXL和Microsoft Office Interop的工作代碼範例,展示如何在VB.NET中有效地將Excel文件讀取到陣列。
IronXL 是否支持不同的 Excel 文件格式?
IronXL支持廣泛的Excel文件格式,包括XLSX、XLS、CSV等,這使其在各種數據處理需求中具有多樣化。
與Microsoft Office Interop相比,使用IronXL的好處是什麼?
IronXL更容易使用,無需安裝Excel,並提供更佳的性能。它簡化了代碼,並減少與Microsoft Office Interop中COM交互相關的潛在錯誤。
IronXL 如何處理与 Microsoft Interop 不同的二維陣列?
IronXL提供將Excel數據直接轉換為二維陣列的方法,確保比需要Microsoft Interop複雜設置的更高效和直接的方法。
有什麼推薦的最佳實踐可以用來將Excel文件讀取到陣列?
最佳實踐包括選擇合適的工具如IronXL以用於易用性和性能,並確保有效率的代碼結構來有效管理內存和處理能力。


