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

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

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

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

Install-Package IronXL
dotnet add package IronXL
Install-Package IronXL
dotnet add package IronXL
SHELL

インストールされると、WorkBook および WorkSheet 型は、ToDataTable および ToDataSet メソッドを公開し、これらは System.Data 構造体に直接マッピングされます。 また、DataRow の値をワークシートに書き戻し、ファイルを XLSX または XLS 形式で保存することで、このプロセスを逆に行うこともできます。

ワークシート全体をデータテーブルに変換するにはどうすればよいですか?

ToDataTable メソッドは、ワークシート全体または名前付き範囲を 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();
}
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
$vbLabelText   $csharpLabel

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

WorkBook.Load は、Office オートメーションを使用せずに XLSX ファイルを読み取ります。 worksheet.ToDataTable(true) はシート内の各セルを反復処理し、最初の行を DataColumn 名として使用して、それを DataRow にマッピングします。 結果として得られる DataTable は標準の System.Data オブジェクトです。これを DataGridView にバインドしたり、 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();
}
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
$vbLabelText   $csharpLabel

レンジ選択が重要な理由

角括弧構文 worksheet["A1:D20"]IronXl.Range オブジェクトを返します。 その範囲に対して ToDataTable を呼び出すと、処理がまさにそのセルに限定されるため、ソースファイルに数万行ある場合でも、実行速度が向上し、メモリ使用量が削減されます。

名前付き範囲を指定したり、実行時に範囲文字列を動的に構築したりすることもできます(例:$"A1:D{lastRow}")。これにより、可変長のデータエクスポートに対して柔軟なアプローチが可能になります。 RangeクラスのAPIリファレンスには、利用可能なすべての選択およびクエリメソッドが記載されています。

複数シートのワークブックをデータセットに変換するにはどうすればよいですか?

複数のシートを含むワークブックは、各シートが個別の DataTable となる System.Data.DataSet に自然にマッピングされます。 ToDataSet メソッドは、この変換を 1 つの呼び出しで実行します。

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

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

返された各 DataTable は、そのプロパティとして元のワークシート名を使用するため、コレクションを反復処理する代わりに、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.");
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.")
$vbLabelText   $csharpLabel

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

SetCellValue(rowIndex, columnIndex, value)object の値を受け入れるため、ヘッダー行には列名を、データ行には生のセル値を型変換なしで渡します。 row + 1 の行オフセットは、行 0 をヘッダー用に予約します。 生成されるXLSXファイルは、プレースホルダーや一時ファイルを含まない、完全に有効なスプレッドシートです。

大規模なデータテーブルの場合は、データの書き込み後に列の自動サイズ調整を適用することを検討してください。そうすることで、手動で書式設定しなくてもコンテンツがきれいに表示されます。

DataTableをDataGridViewにバインドするにはどうすればよいですか?

Excel シートを DataTable にエクスポートする最も一般的な理由の 1 つは、それを Windows Forms DataGridView に表示することです。 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;
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
$vbLabelText   $csharpLabel

製本時に何が起こるのか

DataSource を設定すると、DataGridView がトリガーされ、DataTable から列名と行データが読み取られます。 各 DataColumn はグリッドの列になり、各 DataRow は表示される行になります。 グリッドに組み込まれているコントロールを使用すれば、追加のコードを記述することなく、並べ替え、フィルタリング、選択といった動作を適用できます。

このパターンは、WPF DataGrid、 ASP.NET GridView、およびその他 for .NETデータバインディングインフラストラクチャでも同様に機能します。 手順の詳細については、 DataGridViewをExcelにエクスポートする方法(逆方向)を参照してください。

エクスポートしたデータテーブルでLINQクエリを使用するにはどうすればよいですか?

ワークシートを DataTable に変換した後、各 DataRow をクエリ可能な要素に変換する AsEnumerable() 拡張メソッドを使用して LINQ クエリを実行できます。

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}");
}
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}")
Next
$vbLabelText   $csharpLabel

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

LINQクエリを使用すると、変換されたワークシートからデータをフィルタリング、ソート、グループ化、および投影するための、読みやすく厳密に型指定された方法が得られます。 row.Field<t>(columnName) は型強制をきれいに処理し、値を変換できない場合はサイレント null を返すのではなく、InvalidCastException をスローします。 これにより、データ品質の問題を早期に発見しやすくなります。

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

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

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

IronXLがExcelセルの状態をDataTableの値にマッピングする方法
Excelのセル状態 データテーブルの値 注意事項
テキスト値 文字列 現状のまま返却
数値 2 倍または小数 セルの書式によって異なります
日付値 日時 シリアル番号から解析
ブール値 ブーリアン Excelでの真偽判定
空のセル DBNull.Value 標準.NET null
数式セル 計算結果 IronXLはまずその式を評価します

DataTable を Excel に書き戻すと、DBNull.Value フィールドは空のセルになり、往復の正確性が維持されます。 null フィールドのデフォルト文字列が必要な場合は、SetCellValue を呼び出す前に、DBNull.Value をプレースホルダーに置き換えてください。

データ準備に関する詳細なガイダンスについては、Microsoft のDataTable クラスのドキュメントで、null 値の処理、制約管理、行の状態について詳しく解説されています。

大きなワークシートをエクスポートする際に、メモリを節約するにはどうすればよいですか?

数千行もあるワークシートの場合、シート全体を一度にエクスポートすると、すべてのデータが同時にメモリに割り当てられます。 IronXLの2つのパターンが、ピーク時のメモリ使用量を削減します。

-範囲エクスポート: シート全体ではなく、境界領域を処理するには、worksheet["A1:D5000"].ToDataTable(true) を使用します。 -バッチ処理: worksheet.RowCount を使用して最後に使用された行を計算し、固定サイズの範囲 (たとえば一度に 1,000 行) をループして、次のバッチに進む前に各バッチを処理します。

worksheet.RowCount および 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}");
}
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
$vbLabelText   $csharpLabel

このパターンは、メモリ制約のあるC#で大きなExcelファイルを読み込む場合に特に有効です。

データテーブルをデータベースに書き込むにはどうすればよいですか?

DataTable を取得したら、SqlBulkCopy を介して SQL Server に挿入するのが、大規模なデータセットの場合の最速の方法です。 SqlBulkCopyDataTable を直接受け入れ、個々の INSERT ステートメントを構築せずに行をバッチでストリーミングします。

using IronXL;
using System.Data;
using Microsoft.Data.SqlClient;

WorkBook workbook = WorkBook.Load("orders.xlsx");
DataTable dataTable = workbook.DefaultWorkSheet.ToDataTable(true);

string connectionString = "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.");
using IronXL;
using System.Data;
using Microsoft.Data.SqlClient;

WorkBook workbook = WorkBook.Load("orders.xlsx");
DataTable dataTable = workbook.DefaultWorkSheet.ToDataTable(true);

string connectionString = "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.");
Imports IronXL
Imports System.Data
Imports Microsoft.Data.SqlClient

Dim workbook As WorkBook = WorkBook.Load("orders.xlsx")
Dim dataTable As DataTable = workbook.DefaultWorkSheet.ToDataTable(True)

Dim connectionString As String = "Server=.;Database=OrdersDB;Trusted_Connection=True;"

Using connection As New SqlConnection(connectionString)
    connection.Open()

    Using bulkCopy As New SqlBulkCopy(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)
    End Using
End Using

Console.WriteLine("Bulk insert complete.")
$vbLabelText   $csharpLabel

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

ColumnMappings コレクションは、DataTable 列名をデータベースの列名に一致させます。 両方の名前が同じ場合は、個別のマッピングを省略でき、SqlBulkCopy が名前で自動的に一致します。 スプレッドシートの列の順序がデータベースのスキーマと異なる場合は、明示的なマッピングの方が安全です。

IronXLとデータベースワークフローを組み合わせる方法の詳細については、 C# Excelインポートガイドを参照してください。このガイドでは、挿入前の検証など、追加のインポートシナリオについて説明しています。

Entity Framework ベースのプロジェクトでは、まず DataTable 行を型付きモデル オブジェクトに変換し、次にEFCore.BulkExtensionsなどのライブラリから DbContext.BulkInsert を使用して ORM 対応のバッチ挿入を行います。 MicrosoftのSqlBulkCopyのドキュメントでは、バッチ処理オプションとトランザクションサポートについて詳しく説明されています。

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

これで、 IronXLを使用して Excel と DataTable 間でデータを双方向に移動するための完全なツールキットが揃いました。

  • ヘッダーを考慮したエクスポートのために、worksheet.ToDataTable(true) を使用してワークシート全体を変換します
  • worksheet["A1:D20"].ToDataTable(true)構文を使用して特定のセル範囲をエクスポートします。
  • workbook.ToDataSet() を使用して複数シートのワークブックを変換して、DataSet に完全にアクセスできるようにします
  • DataTable の内容を DataRow の値と SetCellValue を繰り返して XLSX に書き戻します。
  • DataTableDataGridView のような UI コントロールに単一の DataSource 割り当てでバインドします。
  • 高スループットのデータベース挿入のために、DataTable から直接 SqlBulkCopy をフィードします

IronXLのスキルをさらに深めるには、以下の関連トピックをご覧ください。

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

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

よくある質問

IronXLを使用して C# で Excel データを DataTable にエクスポートするにはどうすればよいですか?

Excel ファイルをIronXLに読み込み、ワークシートまたは範囲を選択し、ExportToDataTable メソッドを使用してデータを DataTable オブジェクトに変換することで、 IronXLを使用して C# で Excel データを DataTable にエクスポートできます。

Excel データを DataTable に変換する利点は何ですか?

ExcelデータをDataTableに変換すると、データベース操作、UIコントロールへのデータバインディング、そしてシームレスな.NET統合に最適な構造化されたデータが得られます。また、C#アプリケーション内でのデータ操作や処理も容易になります。

IronXL はExcel と DataTable 間のデータのインポートとエクスポートの両方を処理できますか?

はい、 IronXL はExcel から DataTable へのデータのインポートと DataTable から Excel へのデータのエクスポートの両方を効率的に処理するため、C# アプリケーションでのデータ交換を管理するための多目的ツールになります。

IronXLを使用して Excel シート内の特定の範囲を DataTable に変換することは可能ですか?

はい、 IronXL を使用すると、Excel シート内の特定の範囲を選択して DataTable に変換できるため、データの操作と抽出が柔軟になります。

Excel データ変換にIronXLを使用するには、Microsoft Office をインストールする必要がありますか?

いいえ、 IronXLを使用して Excel データを DataTable に変換したり、その逆を行ったりするために、お使いのマシンに Microsoft Office がインストールされている必要はありません。IronXLはMicrosoft Office とは独立して動作します。

IronXLを使用して Excel から DataTable に変換できるデータの種類は何ですか?

IronXL は、データの整合性と構造を維持しながら、数値、テキスト、日付、数式など、Excel のさまざまな種類のデータを DataTable 形式に変換できます。

IronXL はDataTable を Excel ファイルにエクスポートできますか?

はい、 IronXL はDataTable を Excel ファイルにエクスポートできるため、C# アプリケーションから直接レポートを生成したり、データ ストレージ ソリューションを作成したりできます。

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

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

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

アイアンサポートチーム

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