Altbilgi içeriğine atla
IRONXL KULLANARAK

OleDb vs IronXL Kullanan C# ile DataTable Excel'e Nasıl Aktarılır

Bir DataTable'ı C#'ta bir Excel dosyasına - herhangi bir Office bağımlılığı olmadan - dışa aktarmak, doğru kütüphane ile basittir. Önce WorkBook.Create() çağırırsınız, dataTable.Columns ile başlıkları yazarsınız, hücreleri doldurmak için dataTable.Rows döngüsüne girersiniz ve ardından workbook.SaveAs("output.xlsx") ile kaydedersiniz. Sonuç, .NET 10, Linux konteynerleri ve Azure sunucusuz işlevleri de dahil olmak üzere herhangi bir platformda çalışan tamamen biçimlendirilmiş bir XLSX dosyasıdır.

Bu kılavuz, eski OleDb yaklaşımını modern IronXL .NET için yöntemi ile karşılaştırır. Neden OleDb sürücüsünün dağıtım ve uyumluluk problemleri yarattığını ve neden bunu sütun başlıkları, veri türleri, hücre biçimlendirme ve SQL söz dizimi veya yalnızca Windows'a özgü sürücü kurulumları olmadan büyük veri setleriyle başa çıkabilen temiz, sürdürülebilir kodla kaldırmanız gerektiğini göreceksiniz.


DataTable Dışa Aktarım İçin IronXL Nasıl Kurulur?

Herhangi bir dışa aktarma kodu yazmadan önce IronXL'yi projenize ekleyin. Visual Studio'da Paket Yöneticisi Konsolunu açın ve şu komutu çalıştırın:

Install-Package IronXL.Excel

IronXL, Microsoft Office, Access Veritabanı Motoru veya herhangi bir COM interop katmanına bağımlı değildir. Paket kurulduktan sonra, Windows, Linux, macOS, Docker, Azure ve AWS'de aynı kodu tek bir satırı değiştirmeden çalıştırabilirsiniz.

Neden OleDb Sürücü Kurulumu Gerektirir

Geleneksel OleDb yaklaşımı bir Excel dosyasını veritabanı olarak ele alır. OleDbConnection bir Microsoft.ACE.OLEDB.12.0 sağlayıcı kullanarak (veya .xls dosyaları için eski Microsoft.Jet.OLEDB.4.0 kullanarak) oluşturursunuz, ardından tabloya karşı SQL CREATE TABLE ve INSERT INTO komutları yürütürsünüz. Bu, Microsoft Office'in veya bağımsız Access Database Engine yeniden dağıtılabilir paketinin zaten yüklü olduğu geliştirici makinelerinde çalışır. Ancak, üretim ortamlarında - özellikle bulut işlevleri, Docker konteynerleri ve başsız .NET 10 çalışan sunucu çiftlikleri - bu sürücü nadiren mevcut ve kurulumu yükseltilmiş ayrıcalıklar gerektiriyor ve sürücü ile işlem arasında uyumlu bir bit derinliği gerektiriyor.

Geliştiriciler Neden Hala OleDb'yi Excel Dışa Aktarımı İçin Kullanıyor?

OleDb, .NET Framework'ün zaten parçası olduğu için Excel otomasyonu için varsayılan bir seçim haline geldi. Geliştiriciler zaten ADO.NET'i biliyorlardı, bu nedenle OleDbConnection, OleDbCommand ve OleDbDataAdapter'u Excel'e yazmak için yeniden kullanmak doğal geldi. Üçüncü taraf bir paket gerekmedi ve CREATE TABLE ve INSERT INTO için SQL benzeri sentaks, veritabanı programlamasıyla tanıdık olan herkese amacı açık hale getirdi.

İşte OleDb kullanarak bir DataTable'ı dışa aktarmak için geleneksel desen:

using System.Data;
using System.Data.OleDb;

// Build a sample DataTable
DataTable dataTable = new DataTable("Products");
dataTable.Columns.Add("ProductID", typeof(int));
dataTable.Columns.Add("ProductName", typeof(string));
dataTable.Columns.Add("Price", typeof(decimal));
dataTable.Rows.Add(1, "Widget", 29.99m);
dataTable.Rows.Add(2, "Gadget", 49.99m);
dataTable.Rows.Add(3, "Gizmo", 19.99m);

// OleDb connection string -- file must already exist on disk
string filename = @"C:\Output\Products.xlsx";
string connectionString =
    $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={filename};" +
    "Extended Properties='Excel 12.0 Xml;HDR=YES'";

using OleDbConnection connection = new(connectionString);
connection.Open();

// Create the sheet structure with SQL DDL
string create = "CREATE TABLE [Sheet1$] (ProductID INT, ProductName CHAR(255), Price DOUBLE)";
using (var createCmd = new OleDbCommand(create, connection))
    createCmd.ExecuteNonQuery();

// Insert rows one at a time
string insert = "INSERT INTO [Sheet1$] (ProductID, ProductName, Price) VALUES (?, ?, ?)";
using OleDbCommand insertCmd = new(insert, connection);
insertCmd.Parameters.Add(new OleDbParameter("ProductID", OleDbType.Integer));
insertCmd.Parameters.Add(new OleDbParameter("ProductName", OleDbType.VarChar, 255));
insertCmd.Parameters.Add(new OleDbParameter("Price", OleDbType.Double));

foreach (DataRow row in dataTable.Rows)
{
    insertCmd.Parameters[0].Value = row["ProductID"];
    insertCmd.Parameters[1].Value = row["ProductName"];
    insertCmd.Parameters[2].Value = row["Price"];
    insertCmd.ExecuteNonQuery();
}
using System.Data;
using System.Data.OleDb;

// Build a sample DataTable
DataTable dataTable = new DataTable("Products");
dataTable.Columns.Add("ProductID", typeof(int));
dataTable.Columns.Add("ProductName", typeof(string));
dataTable.Columns.Add("Price", typeof(decimal));
dataTable.Rows.Add(1, "Widget", 29.99m);
dataTable.Rows.Add(2, "Gadget", 49.99m);
dataTable.Rows.Add(3, "Gizmo", 19.99m);

// OleDb connection string -- file must already exist on disk
string filename = @"C:\Output\Products.xlsx";
string connectionString =
    $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={filename};" +
    "Extended Properties='Excel 12.0 Xml;HDR=YES'";

using OleDbConnection connection = new(connectionString);
connection.Open();

// Create the sheet structure with SQL DDL
string create = "CREATE TABLE [Sheet1$] (ProductID INT, ProductName CHAR(255), Price DOUBLE)";
using (var createCmd = new OleDbCommand(create, connection))
    createCmd.ExecuteNonQuery();

// Insert rows one at a time
string insert = "INSERT INTO [Sheet1$] (ProductID, ProductName, Price) VALUES (?, ?, ?)";
using OleDbCommand insertCmd = new(insert, connection);
insertCmd.Parameters.Add(new OleDbParameter("ProductID", OleDbType.Integer));
insertCmd.Parameters.Add(new OleDbParameter("ProductName", OleDbType.VarChar, 255));
insertCmd.Parameters.Add(new OleDbParameter("Price", OleDbType.Double));

foreach (DataRow row in dataTable.Rows)
{
    insertCmd.Parameters[0].Value = row["ProductID"];
    insertCmd.Parameters[1].Value = row["ProductName"];
    insertCmd.Parameters[2].Value = row["Price"];
    insertCmd.ExecuteNonQuery();
}
Imports System.Data
Imports System.Data.OleDb

' Build a sample DataTable
Dim dataTable As New DataTable("Products")
dataTable.Columns.Add("ProductID", GetType(Integer))
dataTable.Columns.Add("ProductName", GetType(String))
dataTable.Columns.Add("Price", GetType(Decimal))
dataTable.Rows.Add(1, "Widget", 29.99D)
dataTable.Rows.Add(2, "Gadget", 49.99D)
dataTable.Rows.Add(3, "Gizmo", 19.99D)

' OleDb connection string -- file must already exist on disk
Dim filename As String = "C:\Output\Products.xlsx"
Dim connectionString As String = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={filename};" &
                                 "Extended Properties='Excel 12.0 Xml;HDR=YES'"

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

    ' Create the sheet structure with SQL DDL
    Dim create As String = "CREATE TABLE [Sheet1$] (ProductID INT, ProductName CHAR(255), Price DOUBLE)"
    Using createCmd As New OleDbCommand(create, connection)
        createCmd.ExecuteNonQuery()
    End Using

    ' Insert rows one at a time
    Dim insert As String = "INSERT INTO [Sheet1$] (ProductID, ProductName, Price) VALUES (?, ?, ?)"
    Using insertCmd As New OleDbCommand(insert, connection)
        insertCmd.Parameters.Add(New OleDbParameter("ProductID", OleDbType.Integer))
        insertCmd.Parameters.Add(New OleDbParameter("ProductName", OleDbType.VarChar, 255))
        insertCmd.Parameters.Add(New OleDbParameter("Price", OleDbType.Double))

        For Each row As DataRow In dataTable.Rows
            insertCmd.Parameters(0).Value = row("ProductID")
            insertCmd.Parameters(1).Value = row("ProductName")
            insertCmd.Parameters(2).Value = row("Price")
            insertCmd.ExecuteNonQuery()
        Next
    End Using
End Using
$vbLabelText   $csharpLabel

Bu kod, her DataRow'u ayrı bir veritabanı turu olarak ekler. Büyük veri setleri için bu döngü bir darboğaz haline gelir çünkü OleDb aracılığıyla mevcut bir toplu ekleme mekanizması yoktur. Her satır, bir sonraki satıra geçmeden önce tam bir SQL ayrıştırma, parametre bağlama ve yazma döngüsünü tetikler.

OleDb'nin Excel Dışa Aktarım İçin Ana Sınırlamaları Nelerdir?

Neden OleDb'nin yetersiz kaldığını anlamak, ekibinize göçü gerekçelendirmeye ve doğru değişimi seçmeye yardımcı olur.

Sürücü Bağımlılıkları ve Bit Uyumsuzlukları

Microsoft.ACE.OLEDB.12.0 sağlayıcı, uygulamanızın çalıştığı her makineye ayrı ayrı yüklenmelidir. İşleminiz 64-bit ise ancak yalnızca 32-bit Access Veritabanı Motoru mevcutsa, Microsoft Office 32-bit'in 64-bit .NET çalışma zamanı yanında kurulu olduğu yaygın bir yapılandırmada - bağlantı çalıştırma zamanında bir istisna atar. Microsoft bu bit sınırlamalarını belgeler ve sürücü ile çağıran işlem arasında eşleşen bir bit derinliği kullanılmasını önerir, ancak bu, paylaşılan barındırma veya konteynerize edilmiş ortamlarda genellikle pratik değildir.

Çapraz Platform Desteği Yok

OleDb, yalnızca Windows'a özgü bir teknolojidir. .NET 10, Linux ve macOS'u yerel olarak destekler ve modern mimariler, uygulama iş yüklerini giderek artan bir şekilde Linux düğümlerinde Docker konteynerlerinde çalıştırır. System.Data.OleDb ad alanı, Windows olmayan işletim sistemlerinde PlatformNotSupportedException attığı için, OleDb kullanan herhangi bir kod yolu bu platformlarda çalıştırılamaz.

Hücre Biçimlendirme Yeteneği Yok

OleDb, elektronik tabloyu düz bir veritabanı tablosu olarak ele alır. Ham değerleri ekleyebilirsiniz, ancak hücre yazı tiplerini, arka plan renklerini, kenarlıkları, sayı formatlarını veya sütun genişliklerini uygulamanız için hiçbir mekanizma yoktur. Eğer dışa aktarma, profesyonel görünümlü bir rapor, başlık satırı stili, para birimi formatlama veya koşullu renklendirme gerektiriyorsa, OleDb bunu sağlayamaz. Farklı bir kütüphane veya Excel Interop COM nesnesi ile ikinci bir geçişe ihtiyaç duyar, bu da kendi Office bağımlılığını ekler.

Excel Dosyasının Zaten Mevcut Olması Gerekiyor

OleDb, sıfırdan yeni bir Excel çalışma kitabı oluşturamaz. Bağlantıyı açmadan önce dosyanın hedef yolda zaten mevcut olması gerekir. Bu, önceden ekilmiş bir şablon dosyası veya başka bir kütüphane kullanarak çalışma kitabı oluşturma adımı gerektirir, bu da dağıtım paketine gereksiz bir karmaşıklık ekler.

DELETE İşlemleri Desteklenmiyor

Excel için OleDb sürücüsü INSERT ve sınırlı UPDATE işlemlerini destekler, ancak DELETE FROM kullanarak satır silme desteklenmez. Dışa aktarma sonrası satırların kaldırılmasını gerektiren herhangi bir veri manipülasyon iş akışı, dosyanın elle manipülasyonu veya tam dosya yeniden oluşturulması gibi manuel işlem gerektirir, bu da OleDb arayüzü üzerinden basit değildir.

IronXL İle Bir DataTable'ı Excel'e Nasıl Dışa Aktarabilirsiniz?

IronXL, tüm OleDb hattını doğrudan bir nesne modeli ile değiştirir. Bağlantı dizileri, SQL komutları ve sürücü gereksinimleri yoktur. Bir WorkBook oluşturursunuz, bir WorkSheet eklersiniz ve her hücre için SetCellValue() çağırırsınız:

using IronXL;
using System.Data;

// Build the same DataTable
DataTable dataTable = new DataTable("Products");
dataTable.Columns.Add("ProductID", typeof(int));
dataTable.Columns.Add("ProductName", typeof(string));
dataTable.Columns.Add("Price", typeof(decimal));
dataTable.Rows.Add(1, "Widget", 29.99m);
dataTable.Rows.Add(2, "Gadget", 49.99m);
dataTable.Rows.Add(3, "Gizmo", 19.99m);

// Create a new workbook and worksheet -- no template file needed
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Products");

// Write column headers into the first row
for (int col = 0; col < dataTable.Columns.Count; col++)
{
    worksheet.SetCellValue(0, col, dataTable.Columns[col].ColumnName);
}

// Write data rows
for (int row = 0; row < dataTable.Rows.Count; row++)
{
    for (int col = 0; col < dataTable.Columns.Count; col++)
    {
        worksheet.SetCellValue(row + 1, col, dataTable.Rows[row][col].ToString());
    }
}

workbook.SaveAs("Products.xlsx");
using IronXL;
using System.Data;

// Build the same DataTable
DataTable dataTable = new DataTable("Products");
dataTable.Columns.Add("ProductID", typeof(int));
dataTable.Columns.Add("ProductName", typeof(string));
dataTable.Columns.Add("Price", typeof(decimal));
dataTable.Rows.Add(1, "Widget", 29.99m);
dataTable.Rows.Add(2, "Gadget", 49.99m);
dataTable.Rows.Add(3, "Gizmo", 19.99m);

// Create a new workbook and worksheet -- no template file needed
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Products");

// Write column headers into the first row
for (int col = 0; col < dataTable.Columns.Count; col++)
{
    worksheet.SetCellValue(0, col, dataTable.Columns[col].ColumnName);
}

// Write data rows
for (int row = 0; row < dataTable.Rows.Count; row++)
{
    for (int col = 0; col < dataTable.Columns.Count; col++)
    {
        worksheet.SetCellValue(row + 1, col, dataTable.Rows[row][col].ToString());
    }
}

workbook.SaveAs("Products.xlsx");
Imports IronXL
Imports System.Data

' Build the same DataTable
Dim dataTable As New DataTable("Products")
dataTable.Columns.Add("ProductID", GetType(Integer))
dataTable.Columns.Add("ProductName", GetType(String))
dataTable.Columns.Add("Price", GetType(Decimal))
dataTable.Rows.Add(1, "Widget", 29.99D)
dataTable.Rows.Add(2, "Gadget", 49.99D)
dataTable.Rows.Add(3, "Gizmo", 19.99D)

' Create a new workbook and worksheet -- no template file needed
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Products")

' Write column headers into the first row
For col As Integer = 0 To dataTable.Columns.Count - 1
    worksheet.SetCellValue(0, col, dataTable.Columns(col).ColumnName)
Next

' Write data rows
For row As Integer = 0 To dataTable.Rows.Count - 1
    For col As Integer = 0 To dataTable.Columns.Count - 1
        worksheet.SetCellValue(row + 1, col, dataTable.Rows(row)(col).ToString())
    Next
Next

workbook.SaveAs("Products.xlsx")
$vbLabelText   $csharpLabel

WorkBook.Create(ExcelFileFormat.XLSX), bellekte yeni bir çalışma kitabı oluşturur -- öncesinde bir dosyanın var olması gerekmez. CreateWorkSheet("Products") adlı bir sekme ekler. İç içe döngüler, DataTable'ın satır ve sütun sayılarını tam olarak yansıtır, hücre başına bir değer yazar. SaveAs() çalışma kitabını geçerli bir XLSX dosyası olarak diske yazar.

Çıktı

OleDb vs IronXL Kullanarak DataTable'ı Excel C#'a Aktarma: Resim 1 - Excel Çıktısı

Mevcut seçeneklere daha derin bir bakış için, dataSet ve DataTable nasıl dışa aktarılır kılavuzu ek yüklemeleri ve toplu dışa aktarma kalıplarını kapsar.

DataTable Dışa Aktarırken Hücre Biçimlendirmesini Nasıl Ekleriz?

Temel bir dışa aktarımdan sonra en yaygın gereksinimlerden biri, başlık satırını veri satırlarından bulunduğu bir yerle ayırt eder. IronXL, OleDb'nin eşleştiremeyeceği tam bir stil API'si sunar:

using IronXL;
using IronXL.Styles;
using System.Data;

DataTable dataTable = new DataTable("Products");
dataTable.Columns.Add("ProductID", typeof(int));
dataTable.Columns.Add("ProductName", typeof(string));
dataTable.Columns.Add("Price", typeof(decimal));
dataTable.Rows.Add(1, "Widget", 29.99m);
dataTable.Rows.Add(2, "Gadget", 49.99m);
dataTable.Rows.Add(3, "Gizmo", 19.99m);

WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Products");

// Write and style the header row
for (int col = 0; col < dataTable.Columns.Count; col++)
{
    var headerCell = worksheet[$"{(char)('A' + col)}1"];
    headerCell.Value = dataTable.Columns[col].ColumnName;
    headerCell.Style.Font.Bold = true;
    headerCell.Style.BackgroundColor = "#4472C4";
    headerCell.Style.Font.FontColor = "#FFFFFF";
}

// Write data rows with price column formatted as currency
for (int row = 0; row < dataTable.Rows.Count; row++)
{
    for (int col = 0; col < dataTable.Columns.Count; col++)
    {
        var cell = worksheet[$"{(char)('A' + col)}{row + 2}"];
        cell.Value = dataTable.Rows[row][col].ToString();

        // Apply currency format to the Price column
        if (dataTable.Columns[col].ColumnName == "Price")
            cell.FormatString = "$#,##0.00";
    }
}

// Auto-size columns so content is not clipped
worksheet.AutoSizeColumn(0);
worksheet.AutoSizeColumn(1);
worksheet.AutoSizeColumn(2);

workbook.SaveAs("ProductsStyled.xlsx");
using IronXL;
using IronXL.Styles;
using System.Data;

DataTable dataTable = new DataTable("Products");
dataTable.Columns.Add("ProductID", typeof(int));
dataTable.Columns.Add("ProductName", typeof(string));
dataTable.Columns.Add("Price", typeof(decimal));
dataTable.Rows.Add(1, "Widget", 29.99m);
dataTable.Rows.Add(2, "Gadget", 49.99m);
dataTable.Rows.Add(3, "Gizmo", 19.99m);

WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Products");

// Write and style the header row
for (int col = 0; col < dataTable.Columns.Count; col++)
{
    var headerCell = worksheet[$"{(char)('A' + col)}1"];
    headerCell.Value = dataTable.Columns[col].ColumnName;
    headerCell.Style.Font.Bold = true;
    headerCell.Style.BackgroundColor = "#4472C4";
    headerCell.Style.Font.FontColor = "#FFFFFF";
}

// Write data rows with price column formatted as currency
for (int row = 0; row < dataTable.Rows.Count; row++)
{
    for (int col = 0; col < dataTable.Columns.Count; col++)
    {
        var cell = worksheet[$"{(char)('A' + col)}{row + 2}"];
        cell.Value = dataTable.Rows[row][col].ToString();

        // Apply currency format to the Price column
        if (dataTable.Columns[col].ColumnName == "Price")
            cell.FormatString = "$#,##0.00";
    }
}

// Auto-size columns so content is not clipped
worksheet.AutoSizeColumn(0);
worksheet.AutoSizeColumn(1);
worksheet.AutoSizeColumn(2);

workbook.SaveAs("ProductsStyled.xlsx");
Imports IronXL
Imports IronXL.Styles
Imports System.Data

Dim dataTable As New DataTable("Products")
dataTable.Columns.Add("ProductID", GetType(Integer))
dataTable.Columns.Add("ProductName", GetType(String))
dataTable.Columns.Add("Price", GetType(Decimal))
dataTable.Rows.Add(1, "Widget", 29.99D)
dataTable.Rows.Add(2, "Gadget", 49.99D)
dataTable.Rows.Add(3, "Gizmo", 19.99D)

Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Products")

' Write and style the header row
For col As Integer = 0 To dataTable.Columns.Count - 1
    Dim headerCell = worksheet($"{ChrW(AscW("A"c) + col)}1")
    headerCell.Value = dataTable.Columns(col).ColumnName
    headerCell.Style.Font.Bold = True
    headerCell.Style.BackgroundColor = "#4472C4"
    headerCell.Style.Font.FontColor = "#FFFFFF"
Next

' Write data rows with price column formatted as currency
For row As Integer = 0 To dataTable.Rows.Count - 1
    For col As Integer = 0 To dataTable.Columns.Count - 1
        Dim cell = worksheet($"{ChrW(AscW("A"c) + col)}{row + 2}")
        cell.Value = dataTable.Rows(row)(col).ToString()

        ' Apply currency format to the Price column
        If dataTable.Columns(col).ColumnName = "Price" Then
            cell.FormatString = "$#,##0.00"
        End If
    Next
Next

' Auto-size columns so content is not clipped
worksheet.AutoSizeColumn(0)
worksheet.AutoSizeColumn(1)
worksheet.AutoSizeColumn(2)

workbook.SaveAs("ProductsStyled.xlsx")
$vbLabelText   $csharpLabel

Bu, mavi bir başlık satırı, beyaz başlık metni ve bir dolar işareti ile iki ondalık hane olarak görüntülenen fiyat değerleri içeren bir dosya üretir. hücre yazı tipi boyutu kılavuzu ve kenarlık ve hizalama referansı, mevcut tüm stil seçeneklerini açıklar.

Büyük DataTable Dışa Aktarımlarını Yönetme

Binlerce satırlık veri kümeleri için performans önemlidir. IronXL, bellek içindeki tüm hücre değerlerini SaveAs() tek bir disk yazmasıyla yazarken, bu OleDb deseninin satır başına bir ExecuteNonQuery() olmasıyla kıyaslandığında çok daha verimlidir. Çok büyük tabloları dışa aktarmanız gerekiyorsa, DataTable'ı Excel'e dışa aktarmanın en hızlı yolu kılavuzu, bellek açısından etkili akış tekniklerini kapsar.

Ayrıca, formüller, aralıklar ve adlandırılmış tablolarla dışa aktarma mantığını gruplandırabilirsiniz. elektronik tablo oluşturma nasıl yapılır ve .NET kılavuzunda Excel yazma, DataTable'dan çok sayfali çalışma kitapları oluşturmanın tam desenlerini sağlar.

ASP.NET'te Bir DataTable'ı Excel'e Nasıl Dışa Aktarırsınız?

Bir web uygulamasında, genellikle çalışma kitabını diske kaydetmek yerine doğrudan tarayıcıya akıtırsınız. IronXL, bunun için workbook.ToByteArray() kullanarak HTTP yanıtına yazabileceğiniz ikili içeriği döndürür:

// In an ASP.NET controller action
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Report");

// Assume dataTable is populated from your data source
for (int col = 0; col < dataTable.Columns.Count; col++)
    worksheet.SetCellValue(0, col, dataTable.Columns[col].ColumnName);

for (int row = 0; row < dataTable.Rows.Count; row++)
    for (int col = 0; col < dataTable.Columns.Count; col++)
        worksheet.SetCellValue(row + 1, col, dataTable.Rows[row][col].ToString());

byte[] fileBytes = workbook.ToByteArray();
return File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Report.xlsx");
// In an ASP.NET controller action
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Report");

// Assume dataTable is populated from your data source
for (int col = 0; col < dataTable.Columns.Count; col++)
    worksheet.SetCellValue(0, col, dataTable.Columns[col].ColumnName);

for (int row = 0; row < dataTable.Rows.Count; row++)
    for (int col = 0; col < dataTable.Columns.Count; col++)
        worksheet.SetCellValue(row + 1, col, dataTable.Rows[row][col].ToString());

byte[] fileBytes = workbook.ToByteArray();
return File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Report.xlsx");
' In an ASP.NET controller action
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Report")

' Assume dataTable is populated from your data source
For col As Integer = 0 To dataTable.Columns.Count - 1
    worksheet.SetCellValue(0, col, dataTable.Columns(col).ColumnName)
Next

For row As Integer = 0 To dataTable.Rows.Count - 1
    For col As Integer = 0 To dataTable.Columns.Count - 1
        worksheet.SetCellValue(row + 1, col, dataTable.Rows(row)(col).ToString())
    Next
Next

Dim fileBytes As Byte() = workbook.ToByteArray()
Return File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Report.xlsx")
$vbLabelText   $csharpLabel

ASP.NET DataTable'ı Excel'e dışa aktarma öğreticisi bir ASP.NET uygulaması için tam kontrolör ve görünüm bağlantılamayı adım adım açıklar. DataTable'dan Excel C# kılavuzu çok sayfalı dışa aktarımlar ve DataSet desteği de dahil olmak üzere ek senaryoları kapsar.

Bir Bakışta OleDb vs. IronXL Karşılaştırması

C#'ta DataTable'ı Excel'e dışa aktarma için OleDb ve IronXL özellik karşılaştırması
Yetenek OleDb IronXL
Sürücü kurulumu gereklidir Evet (ACE.OLEDB veya Jet) Hayır
Çapraz platform (.NET 10 / Linux) Hayır Evet
Sıfırdan yeni çalışma kitabı oluştur Hayır Evet
Hücre biçimlendirme ve stil verme Hayır Evet
Formül desteği Hayır Evet
Toplu ekleme performansı Satır bazlı (yavaş) Bellekte (hızlı)
DELETE satır desteği Hayır Evet
Docker / konteyner desteği Hayır Evet

Data Sütun Türlerini İhraç Sırasında Nasıl Yönetirsiniz?

Bir DataTable sütunu sayısal veya tarihsel değerler tuttuğunda, onları dize olarak yazmak, Excel'in hücreyi metin olarak ele almasına neden olur, bu da sıralama, filtreleme ve formül referanslarını devre dışı bırakır. Değeri doğrudan geçirdiğinizde IronXL, yerel türleri .ToString() çağırmadan korur:

WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("TypedData");

DataTable table = new DataTable();
table.Columns.Add("ID", typeof(int));
table.Columns.Add("Amount", typeof(decimal));
table.Columns.Add("Date", typeof(DateTime));
table.Rows.Add(1, 1500.75m, new DateTime(2025, 6, 15));
table.Rows.Add(2, 3200.00m, new DateTime(2025, 7, 4));

// Write headers
for (int col = 0; col < table.Columns.Count; col++)
    worksheet.SetCellValue(0, col, table.Columns[col].ColumnName);

// Write typed values -- no .ToString() conversion
for (int row = 0; row < table.Rows.Count; row++)
{
    worksheet.SetCellValue(row + 1, 0, (int)table.Rows[row]["ID"]);
    worksheet.SetCellValue(row + 1, 1, (double)(decimal)table.Rows[row]["Amount"]);
    worksheet[$"C{row + 2}"].Value = (DateTime)table.Rows[row]["Date"];
    worksheet[$"C{row + 2}"].FormatString = "yyyy-MM-dd";
}

workbook.SaveAs("TypedData.xlsx");
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("TypedData");

DataTable table = new DataTable();
table.Columns.Add("ID", typeof(int));
table.Columns.Add("Amount", typeof(decimal));
table.Columns.Add("Date", typeof(DateTime));
table.Rows.Add(1, 1500.75m, new DateTime(2025, 6, 15));
table.Rows.Add(2, 3200.00m, new DateTime(2025, 7, 4));

// Write headers
for (int col = 0; col < table.Columns.Count; col++)
    worksheet.SetCellValue(0, col, table.Columns[col].ColumnName);

// Write typed values -- no .ToString() conversion
for (int row = 0; row < table.Rows.Count; row++)
{
    worksheet.SetCellValue(row + 1, 0, (int)table.Rows[row]["ID"]);
    worksheet.SetCellValue(row + 1, 1, (double)(decimal)table.Rows[row]["Amount"]);
    worksheet[$"C{row + 2}"].Value = (DateTime)table.Rows[row]["Date"];
    worksheet[$"C{row + 2}"].FormatString = "yyyy-MM-dd";
}

workbook.SaveAs("TypedData.xlsx");
Imports System
Imports System.Data

Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("TypedData")

Dim table As New DataTable()
table.Columns.Add("ID", GetType(Integer))
table.Columns.Add("Amount", GetType(Decimal))
table.Columns.Add("Date", GetType(DateTime))
table.Rows.Add(1, 1500.75D, New DateTime(2025, 6, 15))
table.Rows.Add(2, 3200.00D, New DateTime(2025, 7, 4))

' Write headers
For col As Integer = 0 To table.Columns.Count - 1
    worksheet.SetCellValue(0, col, table.Columns(col).ColumnName)
Next

' Write typed values -- no .ToString() conversion
For row As Integer = 0 To table.Rows.Count - 1
    worksheet.SetCellValue(row + 1, 0, CInt(table.Rows(row)("ID")))
    worksheet.SetCellValue(row + 1, 1, CDbl(CDec(table.Rows(row)("Amount"))))
    worksheet($"C{row + 2}").Value = CType(table.Rows(row)("Date"), DateTime)
    worksheet($"C{row + 2}").FormatString = "yyyy-MM-dd"
Next

workbook.SaveAs("TypedData.xlsx")
$vbLabelText   $csharpLabel

Excel şimdi Miktar sütununu sayısal olarak sıralayabilir ve Tarih sütununu tarih seçicilerle filtreleyebilir. Ek veri formatı kalıpları için, hücre veri formatını ayarlama kılavuzuna bakın. Eğer dışa aktarma sonrasında verileri geri okumanız gerekiyorsa, Excel'den DataTable'a öğretici ters işlemi kapsar.

Mevcut OleDb İhracat Kodunu Taşımak

OleDb'den IronXL'a geçiş yapmak genellikle tek bir sprint'ten daha az zaman alır. Yapısal değişiklikler şunlardır:

  1. Tüm using System.Data.OleDb referanslarını ve ACE sürücü sarmalayıcı paketi için NuGet referanslarını kaldırın.
  2. OleDbConnection başlatma bloğunu WorkBook.Create(ExcelFileFormat.XLSX) ile değiştirin.
  3. CREATE TABLE komutunu workbook.CreateWorkSheet("SheetName") ile değiştirin.
  4. INSERT INTO döngüsünü, her hücre için birer SetCellValue() çağrısı ile iç içe değiştirin.
  5. connection.Close()'i workbook.SaveAs("output.xlsx") ile değiştirin.

Üstelik, Excel 2007 veya sonrasına henüz yükseltilmemiş olan alıcılar için eski format dosyaları üretmek adına .xls uzantısı ile workbook.SaveAs() da çağırabilirsiniz. Elektronik tablo dosya türlerini dönüştürme kılavuzu, desteklenen tüm çıktı formatlarını listeler.

IronXL Nasıl Test Edilir ve Lisanslanır?

IronXL, deneme lisansı ile geliştirme sırasında ücretsiz kullanılabilir. Anahtarı ilk IronXL çağrısından önce kodda uygularsınız:

IronXL.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
IronXL.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
Imports IronXL

IronXL.License.LicenseKey = "YOUR-LICENSE-KEY-HERE"
$vbLabelText   $csharpLabel

Lisans anahtarı uygulama kılavuzu, yapılandırma dosyaları ve ortamsal değişkenler dahil olmak üzere tüm yerleşim seçeneklerini açıklar. Bulut dağıtımları için, Docker ve Linux başlama sayfaları, platforma özgü kurulum adımlarını kapsar.

Microsoft, OleDb senaryoları için Access Veritabanı Motorunun bilinen kısıtlamalarını belgelendirmiştir ve NuGet.org, IronXL paketini tam sürüm geçmişi ve indirme istatistikleri ile barındırır. Resmi Açık XML SDK belgeleri, IronXL'ın uyguladığı temel XLSX spesifikasyonunu açıklar.

Sonraki Adımlarınız Neler?

Artık bir DataTable'yi OleDb sürücüleri olmadan, SQL söz dizimi olmadan ve platform sınırlamaları olmadan bir XLSX dosyasına aktarmak için bir çalışma modeline sahipsiniz. Temel iş akışı -- bir döngüde WorkBook.Create(), CreateWorkSheet(), SetCellValue(), ardından SaveAs() -- üç satırlık bir örnekten yüz binlerce satırlık veri kümelerine kadar genişler.

Mevcut OleDb ihracatınızı yukarıda gösterilen temel IronXL modelini kullanarak başlatın ve ardından veri ihracatının doğrulandığını gözlemleyerek stil API'sini kullanarak biçimlendirme uygulayın. Başlangıç kılavuzu ve özellikler özetini anlamak için iyi okuyuculardır. Eğer aynı boru hattının bir parçası olarak CSV dosyalarıyla çalışıyorsanız, C# DataTable'dan CSV'ye kılavuzu, aynı DataTable nesnesinden virgülle ayrılmış çıkış üretmenin nasıl yapılacağını gösterir.

Sıkça Sorulan Sorular

C#'da DataTable'ı Excel'e aktarmak için OleDb kullanmanın sınırlamaları nelerdir?

C#'da DataTable'ı Excel'e aktarmak için OleDb kullanmak, eski doğası nedeniyle hayal kırıklığı yaratabilir. Geliştiriciler genellikle uyumluluk sorunları, daha yavaş performans ve daha karmaşık hata yönetimi gibi sınırlamalarla karşılaşır, bu da modern alternatifler olan IronXL'yi daha çekici hale getirir.

IronXL, DataTable'ı Excel'e aktarma sürecini nasıl iyileştirir?

IronXL, DataTable'ı Excel'e aktarmada daha iyi performans, daha geniş uyumluluk ve basitleştirilmiş kod sunarak modern bir yaklaşım sağlar. OleDb'nin yaygın hayal kırıklıklarını ortadan kaldırır ve .NET geliştiricilerinin Excel aktarımını daha kolay yönetmesini sağlar.

DataTable aktarımları için OleDb'den IronXL'ye geçmeyi neden düşünmeliyim?

DataTable aktarımları için IronXL'ye geçiş, geliştirme için gereken zaman ve çabayı azaltarak modern .NET uygulamalarıyla geliştirilmiş performans, daha kolay uygulama ve arttırılmış uyumluluk gibi birçok avantaj sunar.

IronXL, büyük DataTable aktarımlarını OleDb'ye göre daha verimli şekilde yönetebilir mi?

Evet, IronXL, büyük DataTable aktarımlarını verimli bir şekilde yönetmek için tasarlanmıştır ve OleDb'ye kıyasla daha hızlı işlem süreleri sunarak ve bellek kullanımını azaltarak büyük veri setleriyle uğraşan uygulamalar için idealdir.

IronXL, C# ve .NET'in en son sürümleri ile uyumlu mu?

IronXL, C# ve .NET'in en son sürümleriyle tamamen uyumlu olup modern uygulamalarla sorunsuz entegrasyon sağlarken yeni özellikler ve geliştirmeler için sürekli güncellemeler sunar.

Modern alternatifler olan IronXL'nin, geleneksel OleDb'ye kıyasla sağladığı yararlar nelerdir?

Modern alternatifler olan IronXL, geliştirici verimliliğini büyük ölçüde artırabilecek şekilde geliştirilmiş performans, daha kolay hata yönetimi, çeşitli Excel formatlarıyla daha iyi uyumluluk ve basitleştirilmiş kod gibi yararlar sağlar.

IronXL, hata yönetimini OleDb'ye kıyasla nasıl yönetir?

IronXL, açık istisna yönetimi ile basitleştirilmiş bir hata yönetimi sunar, böylece OleDb ile ilişkili karmaşıklık ve potansiyel sorunları azaltarak geliştiricilerin uygulamalarını daha kolay hata ayıklamasını ve sürdürmesini sağlar.

UI tabanlı .NET uygulamalarında DataTable'ı Excel'e aktarmanın yaygın kullanım alanları nelerdir?

UI tabanlı .NET uygulamalarında, DataTable'ı Excel'e aktarma işlemi genellikle rapor oluşturma, veri analizi ve kullanışlı veri işleme için kullanılır, genellikle nesne gönderici desenlerini kullanarak olay işleyicilerinden tetiklenir.

Curtis Chau
Teknik Yazar

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapı...

Daha Fazla Oku

Iron Destek Ekibi

Haftada 5 gün, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara