
C#でExcelデータテーブルをエクスポート | Excelデータを変換
ExcelデータをDataTableにエクスポートすると、データベース、UIコントロール、およびLINQクエリと自然に連携する構造化されたインメモリアクセスが得られます。 逆方向 - ExcelファイルにDataTableを書き戻すことも、レポート生成やデータ保存のワークフローにとって同様に重要です。 IronXLは、Microsoft Officeへの依存やCOM相互運用設定を必要とせず、純粋な.NETで双方向の処理を行います。
以下の例を実行する前に、 IronXLをインストールしてください。
インストール後、System.Data構造に直接マップします。 またDataRow値をワークシートに書き戻し、ファイルをXLSXまたはXLS形式で保存することでプロセスを逆にすることもできます。
ワークシート全体をデータテーブルに変換するにはどうすればよいですか?
System.Data.DataTableに変換します。 trueを渡して最初の行を列ヘッダーとして扱うと、結果のテーブルの列名がスプレッドシートの見出しと正確に一致します。
using IronXL;
using System.Data;
// Load the workbook from disk
WorkBook workbook = WorkBook.Load("customers.xlsx");
// Grab the default (first) worksheet
WorkSheet worksheet = workbook.DefaultWorkSheet;
// Convert the entire sheet; first row becomes column headers
DataTable dataTable = worksheet.ToDataTable(true);
// Iterate every row and print each cell value
foreach (DataRow row in dataTable.Rows)
{
for (int i = 0; i < dataTable.Columns.Count; i++)
{
Console.Write(row[i] + "\t");
}
Console.WriteLine();
}Imports IronXL
Imports System.Data
' Load the workbook from disk
Dim workbook As WorkBook = WorkBook.Load("customers.xlsx")
' Grab the default (first) worksheet
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
' Convert the entire sheet; first row becomes column headers
Dim dataTable As DataTable = worksheet.ToDataTable(True)
' Iterate every row and print each cell value
For Each row As DataRow In dataTable.Rows
For i As Integer = 0 To dataTable.Columns.Count - 1
Console.Write(row(i) & vbTab)
Next
Console.WriteLine()
Nextこのコードが何をするのか
WorkBook.LoadはOfficeの自動化なしでXLSXファイルを読み取ります。 DataRowにマッピングします。 結果のSqlBulkCopyに渡したり、すぐにLINQクエリを実行したりできます。
ToDataTable呼び出しはXLSおよびXLSX形式の両方をサポートするので、レガシースプレッドシートに対してもコードを変更せずに同じスクリプトが機能します。 完全なAPIリファレンスについては、 IronXL DataTableおよびDataSetのドキュメントを参照してください。
特定のセル範囲をデータテーブルにエクスポートするにはどうすればよいですか?
ワークシートに複数のデータ領域が含まれている場合、または行と列のサブセットのみが必要な場合は、シート全体ではなく特定のセル範囲をエクスポートできます。 IronXLは選択されたセルのみを処理するため、この方法は大きなファイルに対してより効率的です。
using IronXL;
using System.Data;
WorkBook workbook = WorkBook.Load("financial_report.xlsx");
// Access a named worksheet
WorkSheet worksheet = workbook.GetWorkSheet("Summary");
// Select only the region A1:D20 and convert it
DataTable dt = worksheet["A1:D20"].ToDataTable(true);
Console.WriteLine($"Rows: {dt.Rows.Count}, Columns: {dt.Columns.Count}");
foreach (DataRow row in dt.Rows)
{
foreach (var item in row.ItemArray)
{
Console.Write(item + "\t");
}
Console.WriteLine();
}Imports IronXL
Imports System.Data
Dim workbook As WorkBook = WorkBook.Load("financial_report.xlsx")
' Access a named worksheet
Dim worksheet As WorkSheet = workbook.GetWorkSheet("Summary")
' Select only the region A1:D20 and convert it
Dim dt As DataTable = worksheet("A1:D20").ToDataTable(True)
Console.WriteLine($"Rows: {dt.Rows.Count}, Columns: {dt.Columns.Count}")
For Each row As DataRow In dt.Rows
For Each item In row.ItemArray
Console.Write(item & vbTab)
Next
Console.WriteLine()
Nextレンジ選択が重要な理由
ブラケット構文IronXL.Rangeオブジェクトを返します。 その範囲にToDataTableを呼び出すことで、まさにそのセルだけの処理に限定されるため、ソースファイルに数万行がある場合でもより迅速に実行され、メモリフットプリントも小さくなります。
また、名前付き範囲を指定するか、実行時に範囲文字列を動的に構築することができ、たとえば$"A1:D{lastRow}"のように、データエクスポートの可変長さに柔軟性を持たせます。 RangeクラスのAPIリファレンスには、利用可能なすべての選択およびクエリメソッドが記載されています。
複数シートのワークブックをデータセットに変換するにはどうすればよいですか?
複数のシートを持つワークブックはDataTableになります。 ToDataSetメソッドはこの変換を単一の呼び出しで実行します。
using IronXL;
using System.Data;
WorkBook workbook = WorkBook.Load("multi_sheet.xlsx");
// Each worksheet becomes a DataTable inside the DataSet
DataSet dataSet = workbook.ToDataSet();
foreach (DataTable table in dataSet.Tables)
{
Console.WriteLine($"Sheet: {table.TableName}");
Console.WriteLine($"Rows: {table.Rows.Count}");
Console.WriteLine();
}Imports IronXL
Imports System.Data
Dim workbook As WorkBook = WorkBook.Load("multi_sheet.xlsx")
' Each worksheet becomes a DataTable inside the DataSet
Dim dataSet As DataSet = workbook.ToDataSet()
For Each table As DataTable In dataSet.Tables
Console.WriteLine($"Sheet: {table.TableName}")
Console.WriteLine($"Rows: {table.Rows.Count}")
Console.WriteLine()
Next名前でシートにアクセスする
返されたdataSet.Tables["Summary"]で特定のシートを取得できます。 これにより、複数のシートを使ったレポート作成ロジックを簡単に構築したり、複数のワークシートのデータを結合してから結果をデータベースに書き込んだりすることが可能になります。
複数のシートを操作したり、ワークブックの構造をナビゲートしたりするその他の方法については、 "Excel ワークシートを開いて管理する方法"を参照してください。
データテーブルをExcelファイルにエクスポートするにはどうすればよいですか?
データテーブルへのインポート方向は、話の半分に過ぎません。 構造化されたデータをスプレッドシートとして書き出す必要がある場合 - レポート、ダウンロード、またはアーカイブのために - 新しいワークブックを作成し、DataTableからセルを充填して保存します。
using IronXL;
using System.Data;
// Build a sample DataTable
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("ProductID", typeof(int)));
dt.Columns.Add(new DataColumn("ProductName", typeof(string)));
dt.Columns.Add(new DataColumn("UnitPrice", typeof(decimal)));
dt.Rows.Add(1, "Widget Pro", 29.99m);
dt.Rows.Add(2, "Gadget Max", 49.99m);
dt.Rows.Add(3, "Sensor Kit", 14.50m);
// Create a new workbook and worksheet
WorkBook workbook = WorkBook.Create();
WorkSheet worksheet = workbook.CreateWorkSheet("Products");
// Write column headers from DataTable.Columns
for (int col = 0; col < dt.Columns.Count; col++)
{
worksheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
}
// Write data rows
for (int row = 0; row < dt.Rows.Count; row++)
{
for (int col = 0; col < dt.Columns.Count; col++)
{
worksheet.SetCellValue(row + 1, col, dt.Rows[row][col]);
}
}
// Save as XLSX
workbook.SaveAs("products_export.xlsx");
Console.WriteLine("Export complete.");Imports IronXL
Imports System.Data
' Build a sample DataTable
Dim dt As New DataTable()
dt.Columns.Add(New DataColumn("ProductID", GetType(Integer)))
dt.Columns.Add(New DataColumn("ProductName", GetType(String)))
dt.Columns.Add(New DataColumn("UnitPrice", GetType(Decimal)))
dt.Rows.Add(1, "Widget Pro", 29.99D)
dt.Rows.Add(2, "Gadget Max", 49.99D)
dt.Rows.Add(3, "Sensor Kit", 14.50D)
' Create a new workbook and worksheet
Dim workbook As WorkBook = WorkBook.Create()
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Products")
' Write column headers from DataTable.Columns
For col As Integer = 0 To dt.Columns.Count - 1
worksheet.SetCellValue(0, col, dt.Columns(col).ColumnName)
Next
' Write data rows
For row As Integer = 0 To dt.Rows.Count - 1
For col As Integer = 0 To dt.Columns.Count - 1
worksheet.SetCellValue(row + 1, col, dt.Rows(row)(col))
Next
Next
' Save as XLSX
workbook.SaveAs("products_export.xlsx")
Console.WriteLine("Export complete.")細胞書き込みループの仕組み
object値を受け入れるため、ヘッダー行には列名を、データ行には生のセル値を型変換なしで渡します。 row + 1の行オフセットは行0をヘッダー用に予約します。 生成されるXLSXファイルは、プレースホルダーや一時ファイルを含まない、完全に有効なスプレッドシートです。
大規模なデータテーブルの場合は、データの書き込み後に列の自動サイズ調整を適用することを検討してください。そうすることで、手動で書式設定しなくてもコンテンツがきれいに表示されます。
DataTableをDataGridViewにバインドするにはどうすればよいですか?
ExcelシートをDataTableにエクスポートする最も一般的な理由の1つは、それをWindows FormsDataGridViewに表示することです。 DataTableがあれば、バインディングは1行のコードで済みます。
using IronXL;
using System.Data;
using System.Windows.Forms;
WorkBook workbook = WorkBook.Load("inventory.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
DataTable dataTable = worksheet.ToDataTable(true);
// Bind directly to a DataGridView
dataGridViewInventory.DataSource = dataTable;Imports IronXL
Imports System.Data
Imports System.Windows.Forms
Dim workbook As WorkBook = WorkBook.Load("inventory.xlsx")
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
Dim dataTable As DataTable = worksheet.ToDataTable(True)
' Bind directly to a DataGridView
dataGridViewInventory.DataSource = dataTable製本時に何が起こるのか
DataTableから列名と行データを読み取ります。 各DataRowは表示可能な行になります。 グリッドに組み込まれているコントロールを使用すれば、追加のコードを記述することなく、並べ替え、フィルタリング、選択といった動作を適用できます。
このパターンはWPFDataGridやASP.NET GridView、他 for .NETデータバインディング基盤と同様に効果があります。 手順の詳細については、 DataGridViewをExcelにエクスポートする方法(逆方向)を参照してください。
エクスポートしたデータテーブルでLINQクエリを使用するにはどうすればよいですか?
ワークシートをDataRowをクエリ可能な要素に変換します。
using IronXL;
using System.Data;
using System.Linq;
WorkBook workbook = WorkBook.Load("sales.xlsx");
DataTable dt = workbook.DefaultWorkSheet.ToDataTable(true);
// Filter rows where the "Revenue" column exceeds 10000
var highRevenue = dt.AsEnumerable()
.Where(row => row.Field<double>("Revenue") > 10000)
.OrderByDescending(row => row.Field<double>("Revenue"))
.ToList();
Console.WriteLine($"High-revenue records: {highRevenue.Count}");
foreach (var row in highRevenue)
{
Console.WriteLine($"{row["Product"]}: {row["Revenue"]:C}");
}Imports IronXL
Imports System.Data
Imports System.Linq
Dim workbook As WorkBook = WorkBook.Load("sales.xlsx")
Dim dt As DataTable = workbook.DefaultWorkSheet.ToDataTable(True)
' Filter rows where the "Revenue" column exceeds 10000
Dim highRevenue = dt.AsEnumerable() _
.Where(Function(row) row.Field(Of Double)("Revenue") > 10000) _
.OrderByDescending(Function(row) row.Field(Of Double)("Revenue")) _
.ToList()
Console.WriteLine($"High-revenue records: {highRevenue.Count}")
For Each row In highRevenue
Console.WriteLine($"{row("Product")}: {row("Revenue"):C}")
NextDataTableに対するLINQが役立つ理由
LINQクエリを使用すると、変換されたワークシートからデータをフィルタリング、ソート、グループ化、および投影するための、読みやすく厳密に型指定された方法が得られます。 InvalidCastExceptionをスローします。 これにより、データ品質の問題を早期に発見しやすくなります。
この方法を、前のセクションで説明した範囲ベースのエクスポートと組み合わせることで、ワークシート全体ではなく特定のシート領域をクエリし、大きなファイルでもメモリ使用量を低く抑えることができます。
エクスポート時に、null値や空のセルはどのように処理しますか?
Excelのスプレッドシートには、空白セル、結合された領域、プレースホルダーテキストなど、しばしば欠落部分が存在する。 IronXLは、空のセルをエクスポートされたDBNull.Valueにマッピングし、標準のADO.NET動作と一致するので、既存のnull処理コードが修正なしで動作します。
| Excelのセル状態 | データテーブルの値 | 注意事項 |
|---|---|---|
| テキスト値 | 文字列 | 現状のまま返却 |
| 数値 | 2 倍または小数 | セルの書式によって異なります |
| 日付値 | 日時 | シリアル番号から解析 |
| ブール値 | ブーリアン | Excelでの真偽判定 |
| 空のセル | DBNull.Value | 標準.NET null |
| 数式セル | 計算結果 | IronXLはまずその式を評価します |
ExcelにDBNull.Valueフィールドは空のセルを生成し、ラウンドトリップの忠実度を維持します。 nullフィールドにデフォルトの文字列が必要な場合は、DBNull.Valueを置き換えます。
データ準備に関する詳細なガイダンスについては、Microsoft のDataTable クラスのドキュメントで、null 値の処理、制約管理、行の状態について詳しく解説されています。
大きなワークシートをエクスポートする際に、メモリを節約するにはどうすればよいですか?
数千行もあるワークシートの場合、シート全体を一度にエクスポートすると、すべてのデータが同時にメモリに割り当てられます。 IronXLの2つのパターンが、ピーク時のメモリ使用量を削減します。
- 範囲エクスポート:
worksheet["A1:D5000"].ToDataTable(true)を使用してシート全体ではなく制限された領域を処理します。 - バッチ処理:
worksheet.RowCountで最後に使用された行を計算し、その後固定サイズの範囲、例えば1,000行ごとにループして、各バッチを処理してから次に進みます。
worksheet.ColumnCountプロパティは、サイズをハードコードすることなく動的な範囲文字列を構築することを可能にします:
using IronXL;
using System.Data;
WorkBook workbook = WorkBook.Load("large_dataset.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
int batchSize = 1000;
int totalRows = worksheet.RowCount;
for (int startRow = 1; startRow <= totalRows; startRow += batchSize)
{
int endRow = Math.Min(startRow + batchSize - 1, totalRows);
string rangeAddress = $"A{startRow}:Z{endRow}";
DataTable batch = worksheet[rangeAddress].ToDataTable(false);
// Process each batch -- write to database, transform, etc.
Console.WriteLine($"Processed rows {startRow} to {endRow}");
}Imports IronXL
Imports System.Data
Dim workbook As WorkBook = WorkBook.Load("large_dataset.xlsx")
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
Dim batchSize As Integer = 1000
Dim totalRows As Integer = worksheet.RowCount
For startRow As Integer = 1 To totalRows Step batchSize
Dim endRow As Integer = Math.Min(startRow + batchSize - 1, totalRows)
Dim rangeAddress As String = $"A{startRow}:Z{endRow}"
Dim batch As DataTable = worksheet(rangeAddress).ToDataTable(False)
' Process each batch -- write to database, transform, etc.
Console.WriteLine($"Processed rows {startRow} to {endRow}")
Nextこのパターンは、メモリ制約のあるC#で大きなExcelファイルを読み込む場合に特に有効です。
データテーブルをデータベースに書き込むにはどうすればよいですか?
SqlBulkCopyを介してSQL Serverに挿入することが大規模データセットに対して最速のパスです。 INSERTステートメントを構築することなく、バッチで行をストリーミングします。
using IronXL;
using System.Data;
using Microsoft.Data.SqlClient;
WorkBook workbook = WorkBook.Load("orders.xlsx");
DataTable dataTable = workbook.DefaultWorkSheet.ToDataTable(true);
string connection文字列 = "Server=.;Database=OrdersDB;Trusted_Connection=True;";
using SqlConnection connection = new(connection文字列);
connection.Open();
using SqlBulkCopy bulkCopy = new(connection);
bulkCopy.DestinationTableName = "dbo.Orders";
bulkCopy.BatchSize = 500;
bulkCopy.BulkCopyTimeout = 60;
// Map DataTable columns to database columns
bulkCopy.ColumnMappings.Add("OrderID", "OrderID");
bulkCopy.ColumnMappings.Add("CustomerName", "CustomerName");
bulkCopy.ColumnMappings.Add("TotalAmount", "TotalAmount");
bulkCopy.WriteToServer(dataTable);
Console.WriteLine("Bulk insert complete.");
列マッピングに関する考慮事項
DataTable列名をデータベースの列名に一致させます。 両方の名前が同一の場合は、個別のマッピングを省略でき、SqlBulkCopyが自動的に名前で一致させます。 スプレッドシートの列の順序がデータベースのスキーマと異なる場合は、明示的なマッピングの方が安全です。
IronXLとデータベースワークフローを組み合わせる方法の詳細については、 C# Excelインポートガイドを参照してください。このガイドでは、挿入前の検証など、追加のインポートシナリオについて説明しています。
Entity Frameworkベースのプロジェクトに対しては、まずDataTable行を型付きモデルオブジェクトに変換し、EFCore.BulkExtensionsのようなライブラリからDbContext.BulkInsertを使用して、ORM対応のバッチ挿入を行います。 MicrosoftのSqlBulkCopyのドキュメントでは、バッチ処理オプションとトランザクションサポートについて詳しく説明されています。
次のステップは何ですか?
ExcelとDataTable間でデータを両方向に移動するための完全なツールキットをIronXLで手に入れました:
- ヘッダー対応エクスポートに
worksheet.ToDataTable(true)を使用してワークシート全体を変換します worksheet["A1:D20"].ToDataTable(true)構文を使って特定のセル範囲をエクスポートします- フル
workbook.ToDataSet()を使ってマルチシートのワークブックを変換します DataTable内容をXLSXに書き戻します- 1つの
DataGridViewのようなUIコントロールにバインドします SqlBulkCopyを直接フィードし、高スループットのデータベース挿入を行います
IronXLのスキルをさらに深めるには、以下の関連トピックをご覧ください。
- DataSet と DataTable のエクスポート -- 完全な API リファレンス
- OleDbを使用せずにC#でExcelをDataTableに変換する
- C# DataTable から Excel へのエクスポートチュートリアル
- ASP.NETからデータテーブルをExcelにエクスポートする
- データテーブルをExcelにエクスポートする最速の方法
- C#でExcelファイルを読み込む
- 書式設定済みのExcelファイルをエクスポートする
- C#でExcelファイルを読み込む - ベストプラクティス
- C# Excel の範囲選択と操作
- ExcelデータをC#アプリケーションにインポートする
まずはIronXLの無料トライアルライセンスを取得して、これらのサンプルを自分のプロジェクトで実行してみましょう。 デプロイの準備が整ったら、本番環境ライセンスを購入するか、ライセンスに関するガイダンスについてチームにご相談ください。

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



