C#에서 Excel DataTable 내보내기 | Excel 데이터 변환
Excel 데이터를 DataTable로 내보내면 데이터베이스, UI 컨트롤, LINQ 쿼리와 자연스럽게 동작하는 구조화된 메모리 내 액세스를 제공합니다. 반대로, DataTable를 다시 Excel 파일로 쓰는 것은 보고서 생성 및 데이터 저장 워크플로우에 매우 중요합니다. IronXL은 순수 .NET으로 Microsoft Office 의존성 및 COM 상호 운용 설정 없이 두 방향을 모두 처리합니다.
아래의 예제를 실행하기 전에 IronXL을 설치하세요:
Install-Package IronXL.Excel
설치 후, WorkBook 및 WorkSheet 유형이 System.Data 구조에 직접 매핑되는 ToDataTable 및 ToDataSet 메서드를 노출합니다. 프로세스를 역으로 처리하여 DataRow 값을 워크시트에 다시 작성하고 XLSX 또는 XLS 형식으로 파일을 저장할 수도 있습니다.
전체 워크시트를 DataTable로 변환하는 방법은?
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
코드의 역할
WorkBook.Load은 오피스 자동화 없이 XLSX 파일을 읽습니다. worksheet.ToDataTable(true)는 시트의 각 셀을 반복하여 처음 행을 DataColumn 이름으로 사용하여 이를 DataRow에 매핑합니다. 결과 DataTable는 표준 System.Data 객체로, 이를 DataGridView에 바인딩하거나, SqlBulkCopy에 전달하거나, 곧바로 LINQ 쿼리를 실행할 수 있습니다.
ToDataTable 호출은 XLS와 XLSX 형식을 모두 지원하므로 동일한 코드가 레거시 스프레드시트에 대해 수정 없이 작동합니다. 전체 API 참고는 IronXL DataTable 및 DataSet 문서를 참조하십시오.
특정 셀 범위를 DataTable로 내보내려면 어떻게 해야 합니까?
워크시트에 여러 데이터 영역이 있거나 특정 행과 열의 하위 집합만 필요한 경우 전체 시트 대신 특정 셀 범위를 내보낼 수 있습니다. 이 접근법은 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
범위 선택이 중요한 이유
브래킷 구문 worksheet["A1:D20"]은 IronXL.Range 객체를 반환합니다. 해당 범위에서 ToDataTable을 호출하면 정확히 해당 셀에 대한 처리로 제한되므로, 소스 파일에 수만 개의 행이 있는 경우에도 빠른 실행과 작은 메모리 사용량을 의미합니다.
지정된 이름 범위를 지정하거나 실행 시 동적으로 범위 문자열을 — 예를 들어, $"A1:D{lastRow}" — 생성하여, 길이가 가변적인 데이터 내보내기에 대해 유연한 접근이 가능합니다. Range 클래스 API 참조에는 모든 사용 가능한 선택 및 쿼리 방법이 문서화되어 있습니다.
다중 시트 워크북을 DataSet으로 변환하려면 어떻게 해야 합니까?
여러 시트를 가진 워크북은 자연스럽게 각각의 시트가 별도의 DataTable가 되는 System.Data.DataSet에 매핑됩니다. 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();
}
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의 각 DataTable는 원래 워크시트 이름을 TableName 속성으로 사용하므로, 컬렉션을 반복하지 않고 dataSet.Tables["Summary"]으로 특정 시트를 검색할 수 있습니다. 이것은 다중 시트 보고 로직을 구축하거나 여러 워크시트의 데이터를 결합한 후 결과를 데이터베이스에 기록하기 쉽습니다.
다중 시트와 작업하거나 워크북 구조를 탐색하는 더 많은 방법은 엑셀 워크시트를 열고 관리하는 방법을 참조하세요.
DataTable을 Excel 파일로 다시 내보내려면 어떻게 해야 합니까?
DataTable로의 가져오기는 이야기의 절반일 뿐입니다. 보고서, 다운로드 또는 아카이브를 위해 구조화된 데이터를 다시 스프레드시트로 작성해야 할 때는 새 워크북을 생성하고, 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.")
셀 쓰기 루프는 어떻게 작동합니까
SetCellValue(rowIndex, columnIndex, value)은 object 값을 허용하므로, 타입 변환 없이 헤더 행의 열 이름과 데이터 행의 원시 셀 값을 전달할 수 있습니다. row + 1의 행 오프셋은 0번 행을 헤더용으로 예약합니다. 결과 XLSX 파일은 완전히 유효한 스프레드시트입니다 -- 플레이스홀더, 임시 파일 없음.
더 큰 DataTable의 경우 데이터를 쓸 때 열 자동 크기 조정을 적용하여 콘텐츠가 수동 포맷팅 없이 깔끔하게 표시되도록 고려하십시오.
DataTable을 DataGridView에 바인딩하려면 어떻게 해야 합니까?
Excel 시트를 DataTable로 내보내는 가장 일반적인 이유 중 하나는 Windows Forms DataGridView에 표시하기 위해서입니다. 일단 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;
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
바인딩 시간에 무슨 일이 발생합니까
DataSource을 설정하면 DataGridView이 DataTable로부터 열 이름과 행 데이터를 읽도록 트리거합니다. 각각의 DataColumn는 그리드 열이 되고, 각각의 DataRow는 보이는 행이 됩니다. 추가 코드 없이 그리드의 내장 제어를 통해 정렬, 필터링, 선택 동작을 적용할 수 있습니다.
이 패턴은 WPF DataGrid, ASP.NET GridView 및 다른 .NET 데이터 바인딩 인프라에도 동일하게 작동합니다. 단계별 가이드는 데이터 그리드 뷰를 Excel로 내보내는 방법을 역방향으로 참조하여 보세요.
내보낸 DataTable에서 LINQ 쿼리를 사용하는 방법은 무엇입니까?
워크시트를 DataTable로 변환한 후, AsEnumerable() 확장 메서드를 사용하여 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}");
}
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
DataTable에서 LINQ가 유용한 이유
LINQ 쿼리는 변환된 워크시트에서 데이터를 필터링, 정렬, 그룹화, 프로젝션하는 읽기 쉽고 강력하게 타입 지정된 방법을 제공합니다. row.Field<t>(columnName)는 타입 강제를 깔끔하게 처리하여, 값이 변환될 수 없을 경우 조용한 null을 반환하는 대신 InvalidCastException를 던집니다. 이로 인해 데이터 품질 문제를 초기에 더 쉽게 발견할 수 있습니다.
이 접근 방식을 앞서의 범위 기반 내보내기와 결합하여 특정 시트 영역을 쿼리하고 대형 파일에 대한 메모리 사용량을 낮게 유지합니다.
내보낼 때 Null 및 빈 셀을 처리하는 방법
Excel 스프레드시트에는 종종 빈 셀, 병합된 영역, 또는 플레이스홀더 텍스트 등 간격이 있습니다. IronXL은 내보낸 DataTable 내에서 빈 셀을 표준 ADO.NET 동작과 일치하는 DBNull.Value로 매핑하여 기존 null 처리 코드가 수정 없이 작동하도록 합니다.
| Excel 셀 상태 | DataTable 값 | 노트 |
|---|---|---|
| 텍스트 값 | 문자열 | 그대로 반환 |
| 숫자 값 | 더블 또는 소수 | 셀 형식에 따라 다름 |
| 날짜 값 | 날짜/시간 | 일련 번호에서 구문 분석됨 |
| 불리언 값 | 불리언 | Excel의 TRUE/FALSE |
| 빈 셀 | DBNull.Value | 표준 ADO.NET null |
| 수식 셀 | 계산된 결과 | IronXL은 먼저 수식을 평가합니다 |
Excel에 DataTable를 다시 작성할 때, DBNull.Value 필드는 빈 셀을 생성하여 재전환 정확도를 유지합니다. null 필드에 대한 기본 문자열이 필요하면 DBNull.Value을 대신 사용한 후 SetCellValue을 호출하십시오.
추가 데이터 준비 지침은, Microsoft의 DataTable 클래스 문서가 null 처리, 제약 조건 관리, 행 상태를 깊이 있게 다루고 있습니다.
대용량 워크시트를 내보낼 때 메모리를 절약하는 방법은?
수만 개의 행이 있는 워크시트를 위해 전체 시트를 한 번에 내보내는 것은 메모리에서 모든 데이터를 동시에 할당합니다. IronXL의 두 가지 패턴은 최고 메모리 사용량을 줄여줍니다:
- 범위 내보내기:
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
이 패턴은 메모리 제약이 적용되는 C#에서 대용량 Excel 파일을 읽는 것과 특히 관련이 있습니다.
데이터테이블을 데이터베이스에 쓰는 방법은?
일단 DataTable가 있으면, SqlBulkCopy을 통해 SQL Server에 삽입하는 것이 큰 데이터셋에 대해 가장 빠른 경로입니다. SqlBulkCopy은 DataTable을 직접 수락하고 개별 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.");
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.");
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 connection문자열 As String = "Server=.;Database=OrdersDB;Trusted_Connection=True;"
Using connection As New SqlConnection(connection문자열)
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.")
열 매핑 고려사항
ColumnMappings 컬렉션은 데이터베이스 열 이름과 DataTable 열 이름을 일치시킵니다. 두 이름이 동일하면 개별 매핑을 생략할 수 있으며 SqlBulkCopy이 이름에 따라 자동으로 매칭됩니다. 스프레드시트 열 순서가 데이터베이스 스키마와 다를 경우 명시적 매핑이 더 안전합니다.
IronXL과 데이터베이스 워크플로우를 결합하는 방법에 대해 더 알고 싶다면, 체삽입 전에 검증을 포함하여 추가적인 가져오기 시나리오를 다루는 C# Excel 가져오기 가이드를 확인하세요.
Entity Framework 기반 프로젝트의 경우, DataTable 행을 먼저 타입이 지정된 모델 객체로 변환한 다음, ORM 인식 배치 삽입을 위해 EFCore.BulkExtensions와 같은 라이브러리의 DbContext.BulkInsert을 사용하십시오. Microsoft의 SqlBulkCopy 문서는 일괄 옵션과 트랜잭션 지원을 자세히 설명합니다.
다음 단계는 무엇입니까?
이제 IronXL을 사용하여 Excel과 DataTable 간에 데이터를 양방향으로 이동시키는 완벽한 도구 세트를 갖추게 됩니다:
- 헤더 인식 내보내기를 위해
worksheet.ToDataTable(true)를 사용하여 전체 워크시트를 변환 worksheet["A1:D20"].ToDataTable(true)구문을 사용하여 특정 셀 범위 내보내기- 전체
DataSet액세스를 위해workbook.ToDataSet()으로 다중 시트 워크북 변환 DataTable콘텐츠를DataRow값과SetCellValue을 사용하여 XLSX에 다시 쓰기DataTable을 UI 컨트롤DataGridView에 단일DataSource할당으로 바인드- 높은 처리량의 데이터베이스 삽입을 위해
DataTable로부터 직접SqlBulkCopy공급
IronXL 기술을 깊이 익히기 위해, 다음 관련 주제를 탐색하세요:
- DataSet 및 DataTable 내보내기 -- 전체 API 참조
- OleDb 없이 C#에서 Excel을 DataTable로 변환
- C# DataTable을 Excel로 내보내는 튜토리얼
- ASP.NET에서 Excel로 DataTable 내보내기
- DataTable을 Excel로 내보내는 가장 빠른 방법
- C#에서 Excel 파일을 로드하고 읽기
- 서식을 포함하여 Excel 파일 내보내기
- C#에서 Excel 파일을 읽는 최고의 방법
- C# Excel 범위 선택 및 조작
- Excel 데이터를 C# 애플리케이션으로 가져오기
이 예제를 자신의 프로젝트에서 실행하려면 무료 IronXL 체험판 라이선스로 시작하세요. 배포할 준비가 되면, 상용 라이선스를 구매하거나 라이선스 지침을 위해 팀과 채팅하세요.
자주 묻는 질문
IronXL 사용하여 Excel 데이터를 C#의 DataTable로 내보내는 방법은 무엇입니까?
IronXL 사용하여 Excel 파일을 IronXL 에 불러오고 워크시트 또는 범위를 선택한 다음 ExportToDataTable 메서드를 사용하여 데이터를 DataTable 객체로 변환하면 C#에서 Excel 데이터를 DataTable로 내보낼 수 있습니다.
엑셀 데이터를 데이터테이블로 변환하면 어떤 이점이 있나요?
Excel 데이터를 DataTable로 변환하면 데이터베이스 작업, UI 컨트롤과의 데이터 바인딩, 원활한 .NET 통합에 적합한 구조화된 데이터를 얻을 수 있습니다. 또한 C# 애플리케이션 내에서 데이터를 쉽게 조작하고 처리할 수 있습니다.
IronXL Excel과 DataTable 간의 데이터 가져오기 및 내보내기를 모두 처리할 수 있습니까?
네, IronXL Excel에서 DataTable로 데이터를 가져오는 것과 DataTable에서 Excel로 데이터를 내보내는 것을 모두 효율적으로 처리하므로 C# 애플리케이션에서 데이터 교환을 관리하는 데 다용도로 활용할 수 있는 도구입니다.
IronXL 사용하여 Excel 시트 내의 특정 범위를 DataTable로 변환하는 것이 가능합니까?
네, IronXL 사용하면 Excel 시트 내의 특정 범위를 선택하여 DataTable로 변환할 수 있으므로 데이터 조작 및 추출에 유연성을 제공합니다.
IronXL 사용하여 Excel 데이터를 변환하려면 Microsoft Office가 설치되어 있어야 합니까?
아니요, IronXL 사용하여 Excel 데이터를 DataTable로 또는 그 반대로 변환하는 데 Microsoft Office가 컴퓨터에 설치되어 있을 필요는 없습니다. IronXL Microsoft Office와 독립적으로 작동합니다.
IronXL 사용하여 Excel에서 DataTable로 변환할 수 있는 데이터 유형은 무엇입니까?
IronXL 숫자, 텍스트, 날짜, 수식 등 다양한 유형의 Excel 데이터를 데이터 무결성과 구조를 유지하면서 DataTable 형식으로 변환할 수 있습니다.
IronXL DataTable을 Excel 파일로 내보낼 수 있습니까?
예, IronXL DataTable을 Excel 파일로 내보낼 수 있으므로 C# 애플리케이션에서 직접 보고서를 생성하거나 데이터 저장 솔루션을 만들 수 있습니다.




