IRONSOFTWAREHOME
IRONXLの使用

C#でExcelデータテーブルをエクスポート | Excelデータを変換

Curtis Chau
Curtis Chau
Updated: 2026年6月28日

ExcelデータをDataTableにエクスポートすると、データベース、UIコントロール、およびLINQクエリと自然に連携する構造化されたインメモリアクセスが得られます。 逆方向 - ExcelファイルにDataTableを書き戻すことも、レポート生成やデータ保存のワークフローにとって同様に重要です。 IronXLは、Microsoft Officeへの依存やCOM相互運用設定を必要とせず、純粋な.NETで双方向の処理を行います。

以下の例を実行する前に、 IronXLをインストールしてください。

PM > Install-Package IronXL.Excel

インストール後、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();
}

このコードが何をするのか

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();
}

レンジ選択が重要な理由

ブラケット構文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();
}

名前でシートにアクセスする

返された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.");

細胞書き込みループの仕組み

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;

製本時に何が起こるのか

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}");
}

DataTableに対するLINQが役立つ理由

LINQクエリを使用すると、変換されたワークシートからデータをフィルタリング、ソート、グループ化、および投影するための、読みやすく厳密に型指定された方法が得られます。 InvalidCastExceptionをスローします。 これにより、データ品質の問題を早期に発見しやすくなります。

この方法を、前のセクションで説明した範囲ベースのエクスポートと組み合わせることで、ワークシート全体ではなく特定のシート領域をクエリし、大きなファイルでもメモリ使用量を低く抑えることができます。

エクスポート時に、null値や空のセルはどのように処理しますか?

Excelのスプレッドシートには、空白セル、結合された領域、プレースホルダーテキストなど、しばしば欠落部分が存在する。 IronXLは、空のセルをエクスポートされたDBNull.Valueにマッピングし、標準のADO.NET動作と一致するので、既存のnull処理コードが修正なしで動作します。

IronXLがExcelセルの状態をDataTableの値にマッピングする方法
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}");
}

このパターンは、メモリ制約のある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.");
C#

列マッピングに関する考慮事項

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のスキルをさらに深めるには、以下の関連トピックをご覧ください。

まずはIronXLの無料トライアルライセンスを取得して、これらのサンプルを自分のプロジェクトで実行してみましょう。 デプロイの準備が整ったら、本番環境ライセンスを購入するか、ライセンスに関するガイダンスについてチームにご相談ください

最初のステップ:
arrow pointer
Curtis Chau
テクニカルライター

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

...
詳しく読む

関連する記事

Key in blue circle

無料の30日間トライアルキーをすぐに入手してください。

Your trial license will be sent to your email address

制限なし。100% ロック解除済み。クレジットカード不要。

bullet_checkedクレジットカードやアカウントの作成は不要です。制限なし。100% ロック解除済み。クレジットカード不要。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
無料のライブデモを予約する
Booking Badge

世界中の数百万人のエンジニアから信頼されています。

ライセンスはより安く
義務のない相談を受ける
下記のフォームを記入するか、sales@ironsoftware.comにメールしてください。
あなたの詳細は常に守秘されます。
世界中の数百万人のエンジニアから信頼されています。
ライセンスはより安く
あなたの無料30日間の試用キーをすぐに入手。
クレジットカードやアカウントの作成は不要です。