フッターコンテンツにスキップ
他のコンポーネントと比較する

VB .NETで Excel ファイルを配列に読み込む: IronXLと Microsoft Interop

.NETでExcelデータを配列に読み込むには、ワークブックを読み込み、ワークシートを選択し、行と列を繰り返し処理して、各セル値を2次元配列に格納する必要があります。 IronXL を使用すると、Microsoft Office をインストールすることなく、数行でこれを実現できます。NuGet パッケージをインストールし、WorkBook.Load を呼び出し、Range を取得し、その Rows コレクションをループして配列にデータを入力します。

無料トライアルを開始して、 IronXLがVisual StudioプロジェクトにおけるExcelの自動化をどのように簡素化するかを体験してください。

これらのソリューションをひと目で比較するとどう違うのか?

IronXLとMicrosoft Officeの相互運用性の比較 - .NET配列操作の機能比較
特徴 IronXL Microsoft Office Interop
オフィスへのインストールが必要です なし はい
NuGetインストール はい、1つのパッケージです いいえ -- COM参照
サーバー/CI環境のサポート はい 制限あり
COMオブジェクトのライフサイクル管理 不要 必須
対応フォーマット XLSX、XLS、CSV、TSV、JSON XLSX、XLS(Excelのみ)
型安全なAPI はい 一部 - 遅れて到着するCOM
Linux / macOS のサポート はい(.NET 6以降) なし
例外処理スタイル 標準 for .NET例外 COM例外処理と手動クリーンアップ

VB .NETプロジェクトにIronXLをインストールするにはどうすればよいですか?

IronXLを任意 for .NETプロジェクトに追加する最も簡単な方法は、 NuGetパッケージマネージャーを使用することです。 Visual StudioでPackage Manager Consoleを開き、実行してください:

Install-Package IronXL.Excel
Install-Package IronXL.Excel
SHELL

または、 .NET CLI を使用してください。

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

インストール後、VB .NETモジュールの先頭に Imports IronXL を追加してください。 Officeのインストールは不要です。IronXLは独自の解析エンジンを通してExcelファイルの読み書きをすべて行います。

古いフレームワークを対象とするプロジェクトや、特定のバージョンへの固定が必要なプロジェクトの場合、 IronXLのNuGetページには公開されているすべてのリリースが掲載されています。 IronXLのドキュメントには、Visual Studio 2019、2022、および.NET CLIのインストールガイドが記載されています。

IronXLを使用してExcelデータを配列に読み込むには、開発者はどのようにすればよいですか?

IronXLは、ローカルにOfficeをインストールすることなく、ワークブックを開いたり、範囲を選択したり、セル値を反復処理したりするための、使いやすいAPIを提供します。 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
$vbLabelText   $csharpLabel

ワークブックオブジェクトとワークシートオブジェクトの理解

WorkBook.Load は、XLSX、XLS、CSV、およびTSVファイルをサポートしています。 ロードが完了すると、workbook.DefaultWorkSheet は最初のシートを返します。 シートには、workbook.GetWorkSheet("Sheet1") を使用して名前でアクセスすることも、workbook.WorkSheets(0) を使用してインデックスでアクセスすることもできます。

GetRange("A1:D5") 呼び出しは、Rows および Columns コレクションを公開する IronXL.Range を返します。 各 RangeRowCell オブジェクトを反復処理し、基となるセルタイプに関係なく表示文字列を返します。

セルに入力された値はどのように処理しますか?

IronXLセルは、StringValue と共に型付きプロパティを公開します。

  • cell.IntValue -- セルを整数として解析します
  • cell.DoubleValue -- セルをdouble型として解析します
  • 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
$vbLabelText   $csharpLabel

出力

VB .NETで Excel ファイルを配列に読み込む: IronXLと Microsoft Interop の比較: 画像 1 - VB .NETで Excel ファイルを配列に読み込むためのIronXLと Office Excel の比較

このコード例は、IronXLの直感的なAPIを示しています。 WorkBook.Load メソッドは、指定したフォルダーから Excel ファイルを直接開きます。一方、Range オブジェクトは、Excel スプレッドシート内の特定のセル領域へのアクセスを提供します。 従来のVBAマクロとは異なり、この方法は完全に型安全であり、 .NETエコシステムに統合されています。

今IronXLを始めましょう。
green arrow pointer

従来の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 = Nothing
        Dim sheet As Worksheet = Nothing

        Try
            ' Suppress screen updates during processing
            excelApp.ScreenUpdating = False

            ' Open the workbook by full file path
            workbook = workbooks.Open("C:\Data\SalesData.xlsx")

            ' Reference the first worksheet
            sheet = CType(workbook.Sheets(1), Worksheet)

            ' Define a range and pull values into an object array
            Dim dataRange As Range = sheet.Range("A1", "D5")
            Dim values(,) As Object = CType(dataRange.Value, Object(,))

            ' COM arrays are 1-based, so enumerate from index 1
            Dim rows As Integer = values.GetUpperBound(0)
            Dim columns As Integer = values.GetUpperBound(1)

            For i As Integer = 1 To rows
                Dim line As String = ""
                For j As Integer = 1 To columns
                    line &= values(i, j).ToString() & vbTab
                Next
                Console.WriteLine(line)
            Next

        Catch ex As Exception
            Console.WriteLine("Error: " & ex.Message)

        Finally
            ' Release COM objects to prevent orphaned Excel processes
            If sheet IsNot Nothing Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet)
            End If
            If workbook IsNot Nothing Then
                workbook.Close(False)
                System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook)
            End If
            excelApp.Quit()
            System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp)
        End Try
    End Sub
End Module
Imports Microsoft.Office.Interop.Excel

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

        Try
            ' Suppress screen updates during processing
            excelApp.ScreenUpdating = False

            ' Open the workbook by full file path
            workbook = workbooks.Open("C:\Data\SalesData.xlsx")

            ' Reference the first worksheet
            sheet = CType(workbook.Sheets(1), Worksheet)

            ' Define a range and pull values into an object array
            Dim dataRange As Range = sheet.Range("A1", "D5")
            Dim values(,) As Object = CType(dataRange.Value, Object(,))

            ' COM arrays are 1-based, so enumerate from index 1
            Dim rows As Integer = values.GetUpperBound(0)
            Dim columns As Integer = values.GetUpperBound(1)

            For i As Integer = 1 To rows
                Dim line As String = ""
                For j As Integer = 1 To columns
                    line &= values(i, j).ToString() & vbTab
                Next
                Console.WriteLine(line)
            Next

        Catch ex As Exception
            Console.WriteLine("Error: " & ex.Message)

        Finally
            ' Release COM objects to prevent orphaned Excel processes
            If sheet IsNot Nothing Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet)
            End If
            If workbook IsNot Nothing Then
                workbook.Close(False)
                System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook)
            End If
            excelApp.Quit()
            System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp)
        End Try
    End Sub
End Module
Imports Microsoft.Office.Interop.Excel

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

        Try
            ' Suppress screen updates during processing
            excelApp.ScreenUpdating = False

            ' Open the workbook by full file path
            workbook = workbooks.Open("C:\Data\SalesData.xlsx")

            ' Reference the first worksheet
            sheet = CType(workbook.Sheets(1), Worksheet)

            ' Define a range and pull values into an object array
            Dim dataRange As Range = sheet.Range("A1", "D5")
            Dim values(,) As Object = CType(dataRange.Value, Object(,))

            ' COM arrays are 1-based, so enumerate from index 1
            Dim rows As Integer = values.GetUpperBound(0)
            Dim columns As Integer = values.GetUpperBound(1)

            For i As Integer = 1 To rows
                Dim line As String = ""
                For j As Integer = 1 To columns
                    line &= values(i, j).ToString() & vbTab
                Next
                Console.WriteLine(line)
            Next

        Catch ex As Exception
            Console.WriteLine("Error: " & ex.Message)

        Finally
            ' Release COM objects to prevent orphaned Excel processes
            If sheet IsNot Nothing Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet)
            End If
            If workbook IsNot Nothing Then
                workbook.Close(False)
                System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook)
            End If
            excelApp.Quit()
            System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp)
        End Try
    End Sub
End Module
$vbLabelText   $csharpLabel

COMオブジェクト管理が重要な理由とは?

相互運用アプローチでは、COMオブジェクトのライフサイクル管理に細心の注意を払う必要がある。 Excelアプリケーションが返すすべてのオブジェクト(ワークブック、ワークシート、範囲、セルなど)には、参照カウント付きのCOMポインターが含まれています。 これらの各オブジェクトに対して Marshal.ReleaseComObject を呼び出さなかった場合、EXCEL.EXE プロセスがバックグラウンドで静かに実行されたままになります。

サーバー上では、放置されたプロセスが時間とともに蓄積され、最終的には利用可能なメモリやファイルハンドルを使い果たしてしまう。 上記の Try...Finally パターンは最小限の安全なアプローチですが、多くのEnterpriseコードベースでは、ネストされたオブジェクト グラフを処理するために専用の COM クリーンアップ ユーティリティを追加しています。

Interop配列のインデックス付け規則は、標準のVB .NET配列とは異なります。COMベースの配列はインデックス0ではなく1から始まります。つまり、行または列のループでは、この1のずれを考慮する必要があり、これは実行時エラーやデータ切り捨てバグの一般的な原因となります。

どちらのソリューションがより優れた開発者体験を提供するか?

これらの手法を実運用で評価する際、 IronXLが最適なソリューションとなる要因はいくつかあります。

導入の簡便性: IronXLは単一のNuGetパッケージでインストールできますが、Interopは複雑な環境設定が必要です。 これは、ユーザーセッションが存在しないビルドサーバーまたはクラウド関数上で、プログラムがXLSXファイルを処理する必要がある場合に重要になります。

コードの保守性: IronXLを通してデータテーブルを読み込むことで、コードを短く読みやすく保つことができます。 行数と列数は、第一級プロパティとして利用可能です。 Interop を使用すると、1 から始まる COM 配列の上限を計算し、遅延境界の Object 値を手動でキャストします。

フォーマットの柔軟性: IronXLは、XLSXなどの標準的なExcelワークブック形式に加えて、CSV解析をネイティブにサポートしており、テストデータが複数の形式で届く場合に便利です。 このライブラリは、新しいワークブックファイルを作成したり、セルに値を書き込んだりすることも同様に簡単に行えます。 完全なリストについては、 IronXLフォーマットガイドを参照してください。

エラー処理: IronXLには標準的な.NET例外パターンが適用されるため、エラー回復が容易です。 COMベースの例外処理には追加の処理ロジックが必要であり、適切に管理されないとExcelインスタンスが実行状態のままになる可能性がある。

クロスプラットフォーム対応: IronXLは、 .NET 6以降を介してLinuxおよびmacOS上で動作します。 相互運用機能はWin32 COMサブシステムに依存するため、Windows専用です。

.NETにおける配列読み取りのパフォーマンスとメンテナンスのトレードオフ
基準 IronXL Microsoft Interop
基本的な配列読み取りのためのコード行数 約20 40歳以上
手動のCOMクリーンアップが必要 なし はい
Excelがインストールされていなくても動作します はい なし
Docker / CIパイプラインで実行されます はい なし
配列のインデックス付け規則 0ベース(.NET Standard) 1ベース(COM規格)

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

配列データを読み込んだ後、どのようにフィルタリングおよび検証しますか?

配列にデータが格納された後、一般的な後処理手順には以下が含まれます。

-ヘッダー行をスキップする:列ヘッダーを省略するために、表示ループをインデックス0ではなく1から開始します。 -空白文字の削除: スプレッドシートからコピーされた先頭と末尾の空白文字を削除するには、cell.StringValue に対して .Trim() を呼び出します。

  • null セルの処理: IronXL は空白セルに対して空の文字列を返すため、ほとんどの場合、null チェックは不要です。 -数値範囲の検証: double 型の値を読み込んだ後、保存する前に範囲チェックを適用して、-1 や 9999 などのプレースホルダー値を含むセルを検出します。

より大きなデータセットの場合は、生の2次元配列の代わりに、List(Of T) または厳密に型指定されたクラスを使用することを検討してください。 データを型付きオブジェクトに読み込むことで、後続のコードの可読性とテスト性が向上します。IronXL IronXLモデルリファレンスには、利用可能なすべてのセルプロパティとワークシートメソッドが記載されています。

.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"},
            {"North", "12500", "14200", "15800"},
            {"South", "9800", "10500", "11300"},
            {"East", "8200", "9100", "9900"}
        }

        ' Write the array contents to the worksheet cell by cell
        For i As Integer = 0 To outputArray.GetUpperBound(0)
            For j As Integer = 0 To outputArray.GetUpperBound(1)
                Dim cellAddress As String = IronXL.ExcelAddress.ToAddress(i, j)
                sheet(cellAddress).Value = outputArray(i, j)
            Next
        Next

        workbook.SaveAs("Output.xlsx")
        Console.WriteLine("Workbook saved as Output.xlsx")
    End Sub
End Module
Imports IronXL

Module WriteArrayToExcel
    Sub Main()
        ' Create a new workbook and worksheet
        Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
        Dim sheet As WorkSheet = workbook.CreateWorkSheet("Results")

        Dim outputArray(,) As String = {
            {"Region", "Q1", "Q2", "Q3"},
            {"North", "12500", "14200", "15800"},
            {"South", "9800", "10500", "11300"},
            {"East", "8200", "9100", "9900"}
        }

        ' Write the array contents to the worksheet cell by cell
        For i As Integer = 0 To outputArray.GetUpperBound(0)
            For j As Integer = 0 To outputArray.GetUpperBound(1)
                Dim cellAddress As String = IronXL.ExcelAddress.ToAddress(i, j)
                sheet(cellAddress).Value = outputArray(i, j)
            Next
        Next

        workbook.SaveAs("Output.xlsx")
        Console.WriteLine("Workbook saved as Output.xlsx")
    End Sub
End Module
Imports IronXL

Module WriteArrayToExcel
    Sub Main()
        ' Create a new workbook and worksheet
        Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
        Dim sheet As WorkSheet = workbook.CreateWorkSheet("Results")

        Dim outputArray(,) As String = {
            {"Region", "Q1", "Q2", "Q3"},
            {"North", "12500", "14200", "15800"},
            {"South", "9800", "10500", "11300"},
            {"East", "8200", "9100", "9900"}
        }

        ' Write the array contents to the worksheet cell by cell
        For i As Integer = 0 To outputArray.GetUpperBound(0)
            For j As Integer = 0 To outputArray.GetUpperBound(1)
                Dim cellAddress As String = IronXL.ExcelAddress.ToAddress(i, j)
                sheet(cellAddress).Value = outputArray(i, j)
            Next
        Next

        workbook.SaveAs("Output.xlsx")
        Console.WriteLine("Workbook saved as Output.xlsx")
    End Sub
End Module
$vbLabelText   $csharpLabel

ExcelAddress.ToAddress(row, column) ヘルパーは、0 ベースの整数座標を A1 表記の文字列に変換します。 これにより、書き込みループがクリーンに保たれ、セルアドレスを手動で計算する必要がなくなります。 数式の挿入やスタイルの適用など、その他のパタ​​ーンについては、 IronXLのライティングチュートリアルを参照してください。

複数のワークシートを別々の配列に読み込むにはどうすればよいですか?

ワークブックによっては、複数のシートにデータが保存されるものもあります。例えば、月ごと、地域ごとに1つのシートが保存されるといった具合です。 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
$vbLabelText   $csharpLabel

シートナビゲーションの理解

workbook.WorkSheets コレクションはゼロインデックスであり、For Each とインデックスアクセスの両方をサポートしています。 sheet.Name を使用して、プログラムでシートを識別し、既知のシート名に基づいてロジックを分岐させます。 IronXLのワークシートガイドでは、範囲選択、名前付き範囲、および動的範囲検出について詳しく解説しています。

数十枚のシートを含むワークブックの場合は、読み込む前にシート名でフィルタリングして、無関係なシートの処理やメモリの無駄遣いを回避してください。

開発者は相互運用配列フォーマットについて何を知っておくべきか?

Interop アプローチでは、COM の 1 ベースのインデックスを使用して、セル データを Object(,) 配列として返します。 最初の行の最初の要素は values(1, 1) にあり、values(0, 0) ではありません。 これは、オフバイワンエラーの頻繁な原因となる。

もう一つの懸念事項は null の処理です。Interop は空のセルに対して Nothing を返します。 null 参照に対して .ToString() を呼び出すと、実行時に NullReferenceException がスローされます。すべてのセルアクセスに対して null ガードを追加する必要があります。

If values(i, j) IsNot Nothing Then
    line &= values(i, j).ToString() & vbTab
End If
If values(i, j) IsNot Nothing Then
    line &= values(i, j).ToString() & vbTab
End If
If values(i, j) IsNot Nothing Then
    line &= values(i, j).ToString() & vbTab
End If
$vbLabelText   $csharpLabel

IronXLは、空白セルに対して空の文字列を返すことでこの問題を解決します。つまり、ループコードは追加のガードなしで動作します。

Interopで使用されるExcelオブジェクトモデルに関する信頼できる情報については、 Microsoft Excel VBAリファレンスおよびMSDN Office Interopドキュメントを参照してください。

次のステップは何ですか?

Excelデータを配列に読み込むことは、 .NETスプレッドシートで最も一般的なタスクの1つであり、 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の全機能を詳しく知ることができます。 Enterpriseアプリケーションの場合、 IronXLのライセンスオプションは、あらゆるプロジェクト規模に対応できる柔軟な条件を提供します。

よくある質問

VB .NETを使用して Excel ファイルを配列に読み込む最適な方法は何ですか?

VB .NETでExcelファイルを配列に読み込むには、 IronXLまたはMicrosoft Office Interopを使用すると効果的です。IronXLはシンプルで効率的なアプローチを提供し、Microsoft Excelのインストールを必要とせず、コードの複雑さを軽減します。

Excel ファイルの読み取りに関して、 IronXLと Microsoft Office Interop を比較するとどうなりますか?

IronXLは、Microsoft Office Interopと比較して、Excelファイルを配列に読み込むためのより効率的で高速な方法を提供します。サーバーにExcelをインストールする必要がなく、オーバーヘッドを抑えながらExcelファイルの操作を行えます。

Microsoft Excel をインストールせずに Excel データを操作できますか?

はい、 IronXLを使用すると、Microsoft ExcelをインストールしなくてもExcelデータを操作できます。そのため、Excelのインストールが難しいサーバー環境に最適です。

VB .NETでの Excel 操作にIronXL の使用を検討する必要があるのはなぜですか?

IronXLは、様々なExcelファイル形式を扱う直感的なAPIを提供することで、Excel操作を簡素化します。特にMicrosoft Excelをインストールできない環境において、パフォーマンスの向上と導入の容易化を実現します。

IronXL は、VB .NETで大規模な Excel データ セットを処理するのに適していますか?

はい、 IronXLはパフォーマンスが最適化されており、大規模な Excel データ セットを効率的に処理して、迅速なデータ抽出と操作を実現します。

VB .NETを使用して Excel ファイルを配列に読み込むためのコード例は何ですか?

このガイドでは、 IronXLと Microsoft Office Interop の両方の実用的なコード例を提供し、VB .NETで Excel ファイルを配列に効率的に読み込む方法を示します。

IronXLは異なるExcelファイル形式をサポートしていますか?

IronXL は、XLSX、XLS、CSV など、幅広い Excel ファイル形式をサポートしており、さまざまなデータ処理ニーズに柔軟に対応できます。

Microsoft Office Interop ではなくIronXLを使用する利点は何ですか?

IronXLは使いやすく、Excelのインストールが不要で、パフォーマンスも向上します。コードを簡素化し、Microsoft Office InteropにおけるCOMの相互作用に関連する潜在的なエラーを削減します。

IronXL は、Microsoft Interop とはどのように異なる方法で 2 次元配列を処理しますか?

IronXL は、Excel データを 2 次元配列に変換する直接的な方法を提供し、Microsoft Interop で必要なより複雑なセットアップに比べて、より効率的で簡単なアプローチを保証します。

Excel ファイルを配列に読み込む場合、どのようなベスト プラクティスが推奨されますか?

ベスト プラクティスには、使いやすさとパフォーマンスに優れたIronXLなどの環境に適したツールを選択することや、メモリと処理能力を効果的に管理するための効率的なコード構造を確保することが含まれます。

カーティス・チャウ
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね