フッターコンテンツにスキップ
IRONXLの使用

IronXL を使用したVB .NET 2010でのDataGridViewからExcelへのデータエクスポート

VB.NETのWindowsフォームアプリケーションでDataGridViewからExcelへデータをエクスポートする

DataGridViewからExcelファイルにデータをエクスポートすることは、VB.NET Windows Formsアプリケーションでは一般的な要件です。 レポーティングツール、データ管理システム、またはデータベースからデータを取得するビジネスアプリケーションのいずれを構築する場合でも、開発者はグリッドデータをスプレッドシートに転送する信頼性の高い方法を必要としています。 この記事では、Microsoft Officeのインストールを不要にする最新の.NETライブラリであるIronXLを使用して、DataGridViewをExcelにエクスポートする方法を示します。

Windowsフォーム入門

Windows Forms は Microsoft の .NET Framework に含まれるグラフィカルユーザーインターフェース (GUI) ライブラリで、リッチでインタラクティブなユーザーエクスペリエンスを備えた堅牢なデスクトップアプリケーションを構築するために設計されています。 .NETエコシステムの中核として、Windows Formsは開発者に包括的なコントロールセットを提供しており、その中には多目的なDataGridViewコントロールも含まれています。

Windows Formsアプリケーションで最も一般的な要件の1つは、DataGridViewコントロールからExcelファイル(xlsx)やCSVファイルなどの外部ファイル形式にデータをエクスポートする機能です。 この機能は、レポート作成、データ分析、他のシステムやユーザーとの情報共有などのシナリオに不可欠です。 小さなデータセットで作業している場合でも、データベースから取得した大きなテーブルで作業している場合でも、データをエクスポートする信頼できる方法があれば、アプリケーションの使いやすさと価値を大幅に向上させることができます。

Windows FormsでDataGridViewのデータをエクスポートするには、いくつかのアプローチがあります。 従来の方法では、開発者がExcelアプリケーション・オブジェクトを使用して新しいワークブックを作成し、ワークシートを追加し、DataGridViewから各行と列をプログラムによってExcelファイルに書き込みます。この方法は、ヘッダ行、列ヘッダ、セル書式をカスタマイズできるように、出力に対するきめ細かい制御を提供します。 ただし、ターゲットマシンにMicrosoft Officeがインストールされている必要があるため、配備によっては制約となる可能性があります。

あるいは、ClosedXML、Syncfusion、IronXL(この記事で紹介したもの)などの最新のサードパーティライブラリは、Microsoft Officeを使わずにデータをExcelファイルにエクスポートするための合理化されたAPIを提供しています。これらのライブラリはプロセスを単純化し、開発者がカスタムフォーマット、スタイル付きヘッダー行、適切な型付けの列を持つXLSXファイルを素早く生成できるようにします。 また、Officeが利用できないサーバーやクラウド環境では特に、パフォーマンスが向上し、導入が容易になる傾向があります。

開発者はどのようにプロジェクトをセットアップし、ライブラリをインストールできますか?

エクスポートコードを書く前に、Visual StudioでVB.NET Windows Formsプロジェクトをセットアップしてください。 このチュートリアルは.NET 8を対象としていますが、IronXLは.NET Framework 4.6.2およびすべての最新の.NETバージョンをサポートしています。 このアプローチは、もともとVB.NET 2010以降で作成されたアプリケーションに有効であることに注意してください。

前提条件:

  • Visual Studio 2022以降
  • .NET 8 SDKがインストールされていること
  • DataGridViewコントロールのあるWindowsフォームアプリプロジェクト

NuGetパッケージマネージャ経由でIronXLをインストールする:

Visual StudioでPackage Manager Consoleを開き、実行してください:

Install-Package IronXL.Excel

または、ソリューション・エクスプローラーでプロジェクトを右クリックし、"Manage NuGet Packages "を選択し、IronXL.Excelを検索し、インストールをクリックします。 このライブラリは、Microsoft Office Interopリファレンスの必要性を代替します。

インストールしたら、Excel機能が必要なVB.NETファイルの先頭にIronXL名前空間をインポートしてください:

Imports IronXL
Imports System.Data
Imports IronXL
Imports System.Data
VB .NET

開発者はどのようにDataGridViewにサンプルデータを入力できますか?

この例では、DataGridViewコントロールとButtonを持つ単純なWindowsフォームを作成します。 DataGridViewは、ExcelファイルにエクスポートされるDataTableオブジェクトに格納された従業員レコードを表示します。

以下のコードをフォームの Load イベントに追加して、テーブル構造からサンプルデータをグリッドに入力します:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim dt As New DataTable()
    ' Define columns with appropriate data type
    dt.Columns.Add("EmployeeID", GetType(Integer))
    dt.Columns.Add("Name", GetType(String))
    dt.Columns.Add("Department", GetType(String))
    dt.Columns.Add("Salary", GetType(Decimal))
    ' Add sample rows of data
    dt.Rows.Add(101, "Sarah Johnson", "Engineering", 85000)
    dt.Rows.Add(102, "Michael Chen", "Marketing", 72000)
    dt.Rows.Add(103, "Emily Davis", "Finance", 91000)
    dt.Rows.Add(104, "James Wilson", "Engineering", 78000)
    ' Set DataGridView data source
    DataGridView1.DataSource = dt
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim dt As New DataTable()
    ' Define columns with appropriate data type
    dt.Columns.Add("EmployeeID", GetType(Integer))
    dt.Columns.Add("Name", GetType(String))
    dt.Columns.Add("Department", GetType(String))
    dt.Columns.Add("Salary", GetType(Decimal))
    ' Add sample rows of data
    dt.Rows.Add(101, "Sarah Johnson", "Engineering", 85000)
    dt.Rows.Add(102, "Michael Chen", "Marketing", 72000)
    dt.Rows.Add(103, "Emily Davis", "Finance", 91000)
    dt.Rows.Add(104, "James Wilson", "Engineering", 78000)
    ' Set DataGridView data source
    DataGridView1.DataSource = dt
End Sub
VB .NET

このコードは、典型的な従業員情報を表す4つの列を持つDataTableを作成します。 各列は、IntegerStringDecimalの値に対して、GetType()を使用してデータ型が定義されています。 DataSource プロパティは、このデータを DataGridView コントロールに直接バインドし、ユーザーがフォームを開いたときに自動的にグリッドにデータを入力します。 本番アプリケーションでは、このデータは代わりにデータベースや配列から読み込まれるかもしれません。

出力

Export DataGridView to Excel in VB .NET 2010 Using IronXL: Image 2 - DataGridView Output.

開発者はどのようにDataGridViewのデータをヘッダー付きのExcelファイルにエクスポートできますか?

エクスポート関数は、ボタンのクリックイベントハンドラに属します。 以下のコードは、ループを使ってDataGridViewの列と行を繰り返し、各セルの値を対応するエクセルのワークシートのセルに書き込みます。

Private Sub btnExport_Click(sender As Object, e As EventArgs)
    ' Create a new Excel workbook object and worksheet
    Dim workbook As WorkBook = WorkBook.Create()
    Dim sheet As WorkSheet = workbook.DefaultWorkSheet
    ' Write column headers to the header row (row index 0), integer dim
    Dim colIndex As Integer
    For colIndex = 0 To DataGridView1.Columns.Count - 1
        sheet.SetCellValue(0, colIndex, DataGridView1.Columns(colIndex).HeaderText)
    Next
    ' Write data rows starting from the second row
    Dim rowIndex As Integer
    For rowIndex = 0 To DataGridView1.Rows.Count - 1
        For colIndex = 0 To DataGridView1.Columns.Count - 1
            Dim cellValue = DataGridView1.Rows(rowIndex).Cells(colIndex).Value
            If cellValue IsNot Nothing Then
                sheet.SetCellValue(rowIndex + 1, colIndex, cellValue.ToString())
            End If
        Next
    Next
    ' Save the workbook as an XLSX file with specified filename
    Dim outputPath As String = "EmployeeData.xlsx"
    workbook.SaveAs(outputPath)
    MessageBox.Show("Export solved! File created successfully.", "Success")
End Sub
Private Sub btnExport_Click(sender As Object, e As EventArgs)
    ' Create a new Excel workbook object and worksheet
    Dim workbook As WorkBook = WorkBook.Create()
    Dim sheet As WorkSheet = workbook.DefaultWorkSheet
    ' Write column headers to the header row (row index 0), integer dim
    Dim colIndex As Integer
    For colIndex = 0 To DataGridView1.Columns.Count - 1
        sheet.SetCellValue(0, colIndex, DataGridView1.Columns(colIndex).HeaderText)
    Next
    ' Write data rows starting from the second row
    Dim rowIndex As Integer
    For rowIndex = 0 To DataGridView1.Rows.Count - 1
        For colIndex = 0 To DataGridView1.Columns.Count - 1
            Dim cellValue = DataGridView1.Rows(rowIndex).Cells(colIndex).Value
            If cellValue IsNot Nothing Then
                sheet.SetCellValue(rowIndex + 1, colIndex, cellValue.ToString())
            End If
        Next
    Next
    ' Save the workbook as an XLSX file with specified filename
    Dim outputPath As String = "EmployeeData.xlsx"
    workbook.SaveAs(outputPath)
    MessageBox.Show("Export solved! File created successfully.", "Success")
End Sub
VB .NET

コードは、Excelファイル全体を表す新しいWorkBookオブジェクトを作成することから始まります。DefaultWorkSheetプロパティは、データを書き込むデフォルトシートへのアクセスを提供します。

出力

最初のループは、DataGridViewから列ヘッダを抽出し、Excelシートのヘッダ行(インデックスゼロ)に配置します。 HeaderTextプロパティには、各列の表示名が含まれます。 Dim colIndex As Integer<//code> を使用して、ループ・カウンタとして使用される変数を宣言します。

ネストされたループが実際のデータ転送を処理します。 DataGridViewの各行について、コードはCountプロパティを使用してすべての列を繰り返し処理します。 このメソッドはセルの値を取得し、ワークシートに書き込む前にToString()を使ってStringに変換します。 rowIndex+1オフセットは、データがヘッダ行の下から始まることを保証します。 ヌルチェックは、セルに値がない場合のエラーを防ぎます。

最後に、SaveAsメソッドは、ワークブックを指定されたパスにXLSX形式でディスクに書き込みます。 IronXLはOpen XMLフォーマットが要求する複雑なXMLパッケージングをすべて処理します。 End Sub<//code> 行は、イベントハンドラ関数を閉じます。

開発者はエクスポートされたファイルのセル書式をどのように保持できますか?

基本的なエクスポートはデータを転送しますが、Professionalなアプリケーションでは出力されたExcelファイルをフォーマットする必要があります。IronXLのスタイリングAPIはDataGridViewの外観にマッチするようにセルをフォーマットしたり、外観を向上させることができます。

Private Sub ExportWithFormatting()
    Dim workbook As WorkBook = WorkBook.Create()
    Dim sheet As WorkSheet = workbook.DefaultWorkSheet
    ' Write and style column headers on the first line
    Dim colIndex As Integer
    For colIndex = 0 To DataGridView1.Columns.Count - 1
        sheet.SetCellValue(0, colIndex, DataGridView1.Columns(colIndex).HeaderText)
    Next
    ' Find Salary column index (case-insensitive)
    Dim salaryColIndex As Integer = -1
    For i As Integer = 0 To DataGridView1.Columns.Count - 1
        If String.Equals(DataGridView1.Columns(i).HeaderText, "Salary", StringComparison.OrdinalIgnoreCase) Then
            salaryColIndex = i
            Exit For
        End If
    Next
    ' Apply header row styling with format options
    Dim headerRange = sheet.GetRange("A1:D1")
    headerRange.Style.Font.Bold = True
    headerRange.Style.SetBackgroundColor("#4472C4")
    headerRange.Style.Font.SetColor("#FFFFFF")
    ' Write data rows and ensure Salary cells are numeric
    For rowIndex As Integer = 0 To DataGridView1.Rows.Count - 1
        If Not DataGridView1.Rows(rowIndex).IsNewRow Then
            For colIndex = 0 To DataGridView1.Columns.Count - 1
                Dim cellValue = DataGridView1.Rows(rowIndex).Cells(colIndex).Value
                Dim targetRow = rowIndex + 1
                If cellValue Is Nothing Then
                    Continue For
                End If
                If colIndex = salaryColIndex Then
                    ' Ensure numeric value for salary column
                    Dim decValue As Decimal
                    If TypeOf cellValue Is Decimal OrElse TypeOf cellValue Is Double OrElse TypeOf cellValue Is Integer OrElse TypeOf cellValue Is Single Then
                        decValue = Convert.ToDecimal(cellValue)
                        sheet.SetCellValue(targetRow, colIndex, decValue)
                    Else
                        ' Try parse using current culture, then invariant
                        If Decimal.TryParse(cellValue.ToString(), Globalization.NumberStyles.Number, Globalization.CultureInfo.CurrentCulture, decValue) _
                       OrElse Decimal.TryParse(cellValue.ToString(), Globalization.NumberStyles.Number, Globalization.CultureInfo.InvariantCulture, decValue) Then
                            sheet.SetCellValue(targetRow, colIndex, decValue)
                        Else
                            ' fallback to text if parsing fails
                            sheet.SetCellValue(targetRow, colIndex, cellValue.ToString())
                        End If
                    End If
                Else
                    ' Non-salary: preserve numeric types, otherwise write as text
                    If TypeOf cellValue Is Decimal OrElse Type Of cellValue Is Double Or Else Type Of cellValue Is Integer Or Else Type Of cellValue Is Single Then
                        sheet.SetCellValue(targetRow, colIndex, cellValue)
                    Else
                        sheet.SetCellValue(targetRow, colIndex, cellValue.ToString())
                    End If
                End If
            Next
        End If
    Next
    ' Format salary column as currency
    Dim salaryColumn = sheet.GetRange("D2:D5")
    salaryColumn.FormatString = "$#,##0"
    Dim filename As String = "FormattedEmployeeData.xlsx"
    workbook.SaveAs(filename)
End Sub
Private Sub ExportWithFormatting()
    Dim workbook As WorkBook = WorkBook.Create()
    Dim sheet As WorkSheet = workbook.DefaultWorkSheet
    ' Write and style column headers on the first line
    Dim colIndex As Integer
    For colIndex = 0 To DataGridView1.Columns.Count - 1
        sheet.SetCellValue(0, colIndex, DataGridView1.Columns(colIndex).HeaderText)
    Next
    ' Find Salary column index (case-insensitive)
    Dim salaryColIndex As Integer = -1
    For i As Integer = 0 To DataGridView1.Columns.Count - 1
        If String.Equals(DataGridView1.Columns(i).HeaderText, "Salary", StringComparison.OrdinalIgnoreCase) Then
            salaryColIndex = i
            Exit For
        End If
    Next
    ' Apply header row styling with format options
    Dim headerRange = sheet.GetRange("A1:D1")
    headerRange.Style.Font.Bold = True
    headerRange.Style.SetBackgroundColor("#4472C4")
    headerRange.Style.Font.SetColor("#FFFFFF")
    ' Write data rows and ensure Salary cells are numeric
    For rowIndex As Integer = 0 To DataGridView1.Rows.Count - 1
        If Not DataGridView1.Rows(rowIndex).IsNewRow Then
            For colIndex = 0 To DataGridView1.Columns.Count - 1
                Dim cellValue = DataGridView1.Rows(rowIndex).Cells(colIndex).Value
                Dim targetRow = rowIndex + 1
                If cellValue Is Nothing Then
                    Continue For
                End If
                If colIndex = salaryColIndex Then
                    ' Ensure numeric value for salary column
                    Dim decValue As Decimal
                    If TypeOf cellValue Is Decimal OrElse TypeOf cellValue Is Double OrElse TypeOf cellValue Is Integer OrElse TypeOf cellValue Is Single Then
                        decValue = Convert.ToDecimal(cellValue)
                        sheet.SetCellValue(targetRow, colIndex, decValue)
                    Else
                        ' Try parse using current culture, then invariant
                        If Decimal.TryParse(cellValue.ToString(), Globalization.NumberStyles.Number, Globalization.CultureInfo.CurrentCulture, decValue) _
                       OrElse Decimal.TryParse(cellValue.ToString(), Globalization.NumberStyles.Number, Globalization.CultureInfo.InvariantCulture, decValue) Then
                            sheet.SetCellValue(targetRow, colIndex, decValue)
                        Else
                            ' fallback to text if parsing fails
                            sheet.SetCellValue(targetRow, colIndex, cellValue.ToString())
                        End If
                    End If
                Else
                    ' Non-salary: preserve numeric types, otherwise write as text
                    If TypeOf cellValue Is Decimal OrElse Type Of cellValue Is Double Or Else Type Of cellValue Is Integer Or Else Type Of cellValue Is Single Then
                        sheet.SetCellValue(targetRow, colIndex, cellValue)
                    Else
                        sheet.SetCellValue(targetRow, colIndex, cellValue.ToString())
                    End If
                End If
            Next
        End If
    Next
    ' Format salary column as currency
    Dim salaryColumn = sheet.GetRange("D2:D5")
    salaryColumn.FormatString = "$#,##0"
    Dim filename As String = "FormattedEmployeeData.xlsx"
    workbook.SaveAs(filename)
End Sub
VB .NET

この拡張バージョンでは、エクスポートされた Excel ファイルに Professional フォーマットが適用されます。GetRange<//code> メソッドは、標準の Excel 表記 (ヘッダー行は A1:D1) を使用してセルを選択します。 Styleプロパティは、16進数値で指定されたフォントの太さ、背景色、テキスト色などの書式オプションを公開します。

出力

Export DataGridView to Excel in VB .NET 2010 Using IronXL: Image 4 - フォーマットされたExcel出力.

給与列は、Formatプロパティを通して通貨フォーマットを受け取ります。 ユーザーがMS Excelで出力ファイルを開くと、D列の値がドル記号と千区切りで表示されます。 このページは、利用可能なフォーマット機能のほんの一例を示しています。

なぜ Office Interop よりもモダン ライブラリを選ぶのか

Microsoft.Office.Interop.Excelに依存するExcelエクスポートのための従来のVB.NETソリューションは、アプリケーションを実行するすべてのシステムにMicrosoft Officeをインストールする必要があります。 Dim xlApp<//code> パターンを使用したコードでは、特に MS Excel をインストールできないサーバー環境やクラウドアプリケーションでは、デプロイに課題が生じます。

IronXLは独立して動作するため、Officeのインストールは不要です。 アプリケーションは、外部依存のない自己完結型のユニットとして展開されます。 さらに、IronXLはInteropベースのソリューションにつきもののメモリリークやCOMオブジェクトのクリーンアップの問題を回避し、より安定したアプリケーションを実現します。 このライブラリは、XLSXの代わりにCSV形式でのエクスポートもサポートしています。

この記事で、DataGridViewのデータをエクスポートする方法についての疑問が解決されたことを願っています。 その他のヘルプについては、トラブルシューティング・ドキュメントにリンクするか、実装中にエラーが発生した場合はサポートに連絡してください。

結論

VB.NETでDataGridViewのデータをExcelにエクスポートするには、適切なツールがあれば簡単です。 IronXLはMicrosoft Officeをインストールすることなく、ワークブックの作成、セルへのデータ書き込み、書式設定を行うクリーンでモダンなAPIを提供します。 単純なデータテーブルを書く必要がある場合でも、複雑な書式のワークブックを書く必要がある場合でも、このライブラリは必要な機能を提供します。

IronXLをダウンロードして、VB.NET Windows FormsアプリケーションにExcelエクスポート機能を組み込んでください。 ライセンスオプションは、無料トライアルで始めることができ、あらゆる規模のチームで利用可能です。

よくある質問

VB.NETでDataGridViewのデータをExcelにエクスポートする最も簡単な方法は何ですか?

IronXLを使えば、VB.NETでDataGridViewのデータを最小限のコードで簡単にExcelにエクスポートできます。IronXLはExcelをサーバーにインストールすることなく、Excelファイルを直接操作することを可能にし、プロセスを簡素化します。

IronXLを使ってVB.NETアプリケーションでExcelファイルを扱うにはどうすればいいですか?

IronXLはExcelファイルを扱うためのわかりやすいAPIを提供し、VB.NETアプリケーションでExcelドキュメントの読み込み、編集、エクスポートをシームレスに行えるようにします。さまざまなExcelファイル形式をサポートし、堅牢な機能を提供します。

IronXLは大きなDataGridViewデータセットのExcelへのエクスポートをサポートしていますか?

IronXLは大規模なデータセットを効率的に処理するように設計されており、DataGridViewの膨大なデータをパフォーマンスのボトルネックなしにExcelにエクスポートするのに理想的です。

IronXL はVB.NET 2010と互換性がありますか?

IronXLはVB.NET 2010と完全に互換性があり、開発者は開発環境をアップグレードすることなく、高度なExcel機能をアプリケーションに統合することができます。

VB.NETでのExcelエクスポートにIronXLを使用する利点は何ですか?

IronXLは、使いやすさ、複数のExcel形式のサポート、Excelをサーバーにインストールする必要がないこと、強力なデータ操作機能など、多くの利点を提供します。

IronXLはDataGridViewのデータを異なるExcel形式にエクスポートできますか?

はい、IronXLはDataGridViewのデータをXLSX、XLS、CSVなどさまざまなExcel形式にエクスポートすることをサポートしています。

IronXLが他のVB.NET用Excelライブラリと比較して優れている理由は何ですか?

IronXLは、そのシンプルさ、パフォーマンス効率、包括的な機能セットにより、VB.NETでのExcel操作において他のライブラリよりも優れた選択肢となっています。

VB.NETプロジェクトでIronXLを使い始めるには?

VB.NETプロジェクトでIronXLを使い始めるには、NuGetパッケージ・マネージャ経由でインストールし、公式ドキュメントを参照して統合と使用に関する詳細なガイダンスを参照することができます。

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

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

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