Altbilgi içeriğine atla
IRONXL KULLANARAK

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

Doğru kütüphane ile, Office bağımlılığı olmadan C# dilinde bir DataTable'i Excel dosyasına aktarmak basittir. Ilk once WorkBook.Create() cagirilir, dataTable.Columns ile basliklar yazilir, hucreleri doldurmak icin dataTable.Rows ile dongu kurulur, daha sonra workbook.SaveAs("output.xlsx") ile kaydedilir. Sonuç, .NET 10, Linux konteynerleri ve Azure sunucusuz fonksiyonlar dahil her platformda çalışabilen tam formatlı bir XLSX dosyası olur.

Bu rehber, eski OleDb yaklaşımı ile modern IronXL for .NET metodunu karşılaştırır. OleDb sürücüsünün dağıtım ve uyumluluk sorunları yarattığını ve bunu bir SQL söz dizimi veya yalnızca Windows'ta bulunan sürücü kurulumlarına gerek kalmadan sütun başlıklarını, veri türlerini, hücre formatlamasını ve büyük veri kümesini ele alabilen temiz, bakımı kolay bir kodla nasıl değiştirebileceğinizi göreceksiniz.


DataTable Aktarımı İçin IronXL Nasıl Yüklenir?

Herhangi bir aktarım kodu yazmadan önce, projenize IronXL'i ekleyin. Visual Studio'da Paket Yöneticisi Konsolunu açın ve çalıştırın:

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

IronXL, Microsoft Office, Access Database Motoru veya herhangi bir COM etkileşim katmanına bağımlılık göstermez. Paket yüklendikten sonra, aynı kodu Windows, Linux, macOS, Docker, Azure ve AWS üzerinde tek bir satır bile değiştirmeden çalıştırabilirsiniz.

OleDb Neden Sürücü Yüklemesi Gerektirir

Geleneksel OleDb yaklaşımı, Excel dosyasını bir veritabanı olarak ele alır. Microsoft.ACE.OLEDB.12.0 saglayici (veya .xls dosyalari icin eski Microsoft.Jet.OLEDB.4.0) kullanarak bir OleDbConnection oluşturursunuz, sonra tablo uzerinde SQL CREATE TABLE ve INSERT INTO komutlarini calistirirsiniz. Bu, Microsoft Office veya bağımsız Access Database Motoru'nun zaten yüklü olduğu geliştirici makinelerinde çalışır. Ancak, üretim ortamları—özellikle bulut fonksiyonları, Docker konteynerleri ve başsız .NET 10 çalıştıran sunucu çiftlikleri— nadiren o sürücüye erişime sahip olurlar ve yükleme, yükseltilmiş ayrıcalıklar ve sürücünün uygulamanızla eşleşen bitişikteki işlemle uyum sağlamasını gerektirir.

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

OleDb, .NET Framework'un parçası olduğu için Excel otomasyonu için varsayılan bir seçenek oldu. Geliştiriciler zaten ADO.NET'i biliyorlardi, bu yuzden OleDbConnection, OleDbCommand ve OleDbDataAdapter'i Excel'e yazmak icin yeniden kullanmak dogal hissedildi. Ucuncu taraf pakete ihtiyaç yoktu ve CREATE TABLE ve INSERT INTO icin SQL benzeri soz dizimi, veritabani programlamasına asina olanlar icin amaci aciga cikardi.

OleDb kullanarak bir DataTable'i aktarmak için geleneksel desen şu şekildedir:

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.ExecuteHayırnQuery();

// 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.ExecuteHayırnQuery();
}
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.ExecuteHayırnQuery();

// 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.ExecuteHayırnQuery();
}
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 bir DataRow'u ayrı bir veritabanı gezintisi olarak ekler. Büyük veri kümesi için, o döngü bir dar boğaz haline gelir çünkü OleDb hızla çalışan bir toplu ekleme mekanizması sunmaz. Her satır, bir SQL tam analiz, parametre bağlama ve yazma döngüsünü tamamlayarak sonraki satıra geçmeden önce.

OleDb'nin Excel Aktarımı İçin Anahtar Sınırlılıkları Neler?

OleDb'nin neden yetersiz geldiğini anlamak, ekibinize geçişi haklı çıkarmanıza ve doğru değiştirmeyi seçmenize yardımcı olur.

Sürücü Bağımlılığı ve Bit Yapısı Çatışmaları

Microsoft.ACE.OLEDB.12.0 saglayici, uygulamanizi calistiran her makinaya ayri olarak kurulmalidir. İşlem 64-bit ise ancak yalnızca 32-bit Access Database Engine kullanılabilir -- bu, Microsoft Office 32-bit sürümünün 64-bit bir .NET çalışma zamanı yanında kurulduğu yaygın bir yapılandırmadır -- bağlantı, çalışma zamanında bir kısıtlama atar. Microsoft, bu bit yapısı sınırlıkları belgeler ve sürücü ile çağıran işlem arasında uyumlu bir bit yapısı kullanılmasını önerir, ancak bu sık sık paylaşımlı barındırma veya konteynerize ortamlar için mümkün değildir.

Çok Platformlu Destek Yok

OleDb, yalnızca Windows için bir teknolojidir. .NET 10'da Linux ve macOS doğrudan desteklenir ve modern mimariler giderek artan bir şekilde, uygulama yüklerini Linux düğümlerinde Docker konteynerlerinde çalıştırır. System.Data.OleDb namespace'i Windows disindaki isletim sistemlerinde PlatformHayırtSupportedException attiligi icin, OleDb kullanan kod yolu tamamen bu platformlarda calismaktan engellenir.

Hücre Biçimlendirme Olanaklarının Olmayışı

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 uygulayacak bir mekanizmanız yoktur. Eğer aktarımınız başlık satırı stiline sahip profesyonel bir rapor ile çagrısız denetim gerektiriyorsa, para birimleri için biçimlendirme veya şartlı biçimlendirme, OleDb bunları gerçekleştiremez. Farklı bir kütüphane veya Excel Interop COM nesnesi ile ikinci bir geçiş gerekebilir ki, bu da kendi Office bağımlılığını ekler.

Excel Dosyasının Zaten Var Olması Gerekir

OleDb, sıfırdan yeni bir Excel çalışma kitabı oluşturamaz. Bağlantıyı açmadan önce dosya, hedef yolda zaten var olmalıdır. Bu, ya başlangıç olarak kullanılan bir şablon dosya veya farklı bir kütüphane ile çalışma kitabını oluşturmak için ayrı bir adım gerektirir, bu da dağıtım paketine gereksiz bir karmaşıklık ekler.

SİLME İşlemleri Desteklenmez

Excel icin OleDb surucusu INSERT ve sinirli UPDATE işlemlerini destekler, ancak DELETE FROM kullanarak satir silme işlemi desteklenmez. Herhangi bir veri işleme akışı, aktarım sonrası satırların kaldırılmasını gerektiriyorsa, bu işlemsel dosya manipülasyonu veya tam bir dosya yeniden oluşturma yöntemine başvurmayı gerektirir, bunlar da OleDb arayüzü üzerinden basit değildir.

IronXL ile Bir DataTable'i Excel'e Nasıl Aktarırsınız?

IronXL tüm OleDb hattını doğrudan bir nesne modeliyle değiştirir. Bağlantı dizileri, SQL komutları ve sürücü gereksinimleri yoktur. Bir WorkBook oluşturursunuz, bir WorkSheet eklersiniz ve her hucre icin SetCellValue() cagirisinda bulunursunuz:

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), daha once var olmasi gerekmeyen yeni bir kitabı bellek icinde kurar. CreateWorkSheet("Products") adli bir sekme ekler. İç içe döngüler tam olarak DataTable'ın satır ve sütun sayısını yansıtır, hücre başına bir değer yazar. SaveAs(), calisma kitabini disk uzerine tamamen gecerli bir XLSX dosyasi olarak atar.

Çıktı

DataTable'i Excel C#'a OleDb ve IronXL kullanarak aktarma: Resim 1 - Excel Çıktısı

Daha fazla seçeneği keşfetmek için, veri kümesi ve DataTable aktarımı nasıl yapılır rehberi, ek yüklemeler ve toplu aktarım desenlerini kapsamaktadır.

Bir DataTable'i Aktarırken Hücre Biçimlendirmesi Nasıl Eklenir?

Temel bir aktarım sonrasında en yaygın gereksinimlerden biri başlık satırını veri satırlarından ayırmak için stil kazandırmaktır. IronXL, OleDb'nin sunamayacağı 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 başlık satırı, beyaz başlık metni ve iki ondalık basamaklı dolar işaretiyle fiyat değerleri gösteren bir dosya oluşturur. Hücre yazı tipi boyutu kılavuzu ve çerçeve ve hizalama başvurusu mevcut stil seçeneklerinin tümünü açıklar.

Büyük DataTable Aktarımı Yaparken

Binlerce satır içeren veri kümeleri için, performans önemlidir. IronXL, @--CODE-540--@@'da tek bir disk yazma oncesinde tüm hucre degerlerini bellekte yazar, bu, satir basina bir ExecuteHayırnQuery() kullanan OleDb deseninden çok daha etkilidir. Çok büyük tabloları aktarmanız gerekirse, DataTable'ı Excel'e aktarmanın en hızlı yolu rehberi, bellek verimli akış tekniklerini kapsar.

Ayrıca, formüller, aralıklar ve adlandırılmış tablolarla birlikte aktarma mantığını da gruplayabilirsiniz. Elektronik tablo oluşturma nasıl yapılır ve .NET'te Excel yazma kılavuzu, DataTable'lardan çok yapraklı çalışma kitapları oluşturmanın tam desenlerini sağlar.

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

Web uygulamalarında genellikle çalışma kitabını doğrudan tarayıcıya aktarırsınız, diske kaydetmek yerine. IronXL, HTTP yanitina yazabileceginiz ikili icerigi donduren workbook.ToByteArray() ile bunu destekler:

// 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'i Excel'e Aktarma kılavuzu, bir ASP.NET uygulaması için tam kontrolcü ve görünüm bağlantılarını adım adım anlatır. DataTable'dan Excel C# kılavuzu, çoklu yaprak aktarımlarını ve DataSet desteğini içeren ek senaryoları kapsar.

OleDb ve IronXL'yi Kısaca Karşılaştırma

OleDb ve IronXL'yi karşılaştırma, DataTable'dan Excel'e C# aktarımları için özellik karşılaştırması
Yetkinlik OleDb IronXL
Sürücü kurulumu gerekiyor Evet (ACE.OLEDB veya Jet) Hayır
Çok platformlu (. Hayır Evet
Sıfırdan yeni çalışma kitabı oluşturma Hayır Evet
Hücre biçimlendirme ve stil Hayır Evet
Formül desteği Hayır Evet
Toplu ekleme performansı Row-by-row (slow) Hafızada (hızlı)
Satır silme desteği Hayır Evet
Docker / konteyner desteği Hayır Evet

Sütun Veri Türlerini Aktarım Sırasında Nasıl Ele Alırsınız?

Bir DataTable kolonu sayısal veya tarih değerleri tutuyorsa, onları string 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. IronXL, .ToString() cagirisinda bulunmak yerine degeri dogrudan gectiginiz zaman yerel tipleri 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 artık Miktar sütununu sayısal olarak sıralayabilir ve Tarih sütununu tarih seçicilerle filtreleyebilir. Ek veri formatı desenleri için, hücre veri formatı kılavuzuna bakın. Verileri dışa aktardıktan sonra geri okumanız gerekiyorsa, Excel'den DataTable'a eğitim ters işlemi kapsar.

Mevcut OleDb Dışa Aktarım Kodunu Taşımak

OleDb'den IronXL'e geçiş, genellikle tek bir sprintten daha az zaman alır. Yapısal değişiklikler şunlardır:

  1. Tüm using System.Data.OleDb referanslarini ve herhangi bir ACE surucu sarici paketine ait NuGet referanslarini kaldirin.
  2. OleDbConnection başlatma blogunu WorkBook.Create(ExcelFileFormat.XLSX) ile değiştirin.
  3. CREATE TABLE komutunu workbook.CreateWorkSheet("SheetName") ile değiştirin.
  4. INSERT INTO dongusunu, her hucre icin birer tane olacak sekilde ic ice SetCellValue() cagrilariyla değiştirin.
  5. connection.Close() ile workbook.SaveAs("output.xlsx")'yi değiştirin.

Ayrica, indirme tuketicileri henüz Excel 2007 ya da ilerisine yukselmedi ise, eski format dosyalar uretmek icin .xls uzantisi ile birlikte workbook.SaveAs()'i de cagirabilirsiniz. Elektronik tablo dosya türlerini dönüştürme kılavuzu tüm desteklenen çıktı formatlarını listeler.

IronXL'i Nasıl Test Eder ve Lisanslarsınız?

IronXL bir deneme lisansı ile geliştirmede ücretsiz olarak kullanılabilir. Anahtarı, ilk IronXL çağrısından önce kodda uygulayın:

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 rehberi, yapılandırma dosyaları ve ortam değişkenleri dahil tüm yerleştirme seçeneklerini açıklar. Bulut dağıtımları için, Docker ve Linux başlangıç sayfaları, platforma özgü kurulum adımlarını kapsar.

Microsoft, Access Veritabanı Motorunun OleDb senaryolarındaki bilinen sınırlamalarını belgeler, ve IronXL paketinin tam sürüm geçmişi ve indirme istatistikleriyle NuGet.org'da barındırılır. Resmi Open XML SDK dokümantasyonu, IronXL'in uyguladığı temel XLSX spesifikasyonunu açıklar.

Sıradaki Adımlarınız Neler?

Artık OleDb sürücüleri, SQL sözdizimi ve platform kısıtlamaları olmadan bir DataTable'ı bir XLSX dosyasına aktarmak için çalışan bir deseniniz var. Temel is akisi -- WorkBook.Create(), CreateWorkSheet(), SetCellValue() bir dongude, sonra SaveAs() -- uc satirlik bir örnekten, yuzbinlerce satirlik veri setlerine kadar olceklenir.

Mevcut OleDb dışa aktarmanızı yukarıda gösterilen temel IronXL deseniyle değiştirerek başlayın, ardından veri dışa aktarma doğrulandıktan sonra stil API'sini kullanarak biçimlendirme katmanı ekleyin. IronXL için başlangıç rehberi ve özellikler genel bakışı, kütüphanenin desteklediği her şeyi tam anlamak için iyi birer okuma olacaktır. Aynı akışın bir parçası olarak CSV dosyalarıyla çalışıyorsanız, C# DataTable'dan CSV'ye rehber, aynı DataTable nesnesinden virgülle ayrılmış çıktı nasıl üretileceğini gösterir.

Sıkça Sorulan Sorular

C#'de OleDb kullanarak DataTable'i Excel'e aktarmanın sınırları nelerdir?

C#'de DataTable'i Excel'e aktarmak için OleDb kullanmak, eski doğasından dolayı sinir bozucu olabilir. Geliştiriciler genellikle uyumluluk sorunları, daha düşük performans ve daha karmaşık hata yönetimi gibi sınırlamalarla karşılaşır ve bu da IronXL gibi modern alternatifleri daha cazip kılar.

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

IronXL, Excel'e DataTable'i dışa aktarmak için modern bir yaklaşım sunar, daha iyi performans, geniş uyumluluk ve basitleştirilmiş kod sağlar. Dışa aktarmaları yönetirken, OleDb ile ilişkili yaygın sorunları ortadan kaldırır, .NET geliştiricilerinin Excel dosyalarını daha kolay yönetmelerini sağlar.

DataTable dışa aktarmaları için OleDb'den IronXL'ye geçiş yapmamı neden düşünmeliyim?

DataTable dışa aktarmaları için IronXL'ye geçiş yapmak, geliştirilmiş performans, daha kolay uygulama ve modern .NET uygulamaları ile uyumluluk gibi birçok avantaj sunar; bu da geliştirme için gerekli olan zaman ve çabayı azaltır.

IronXL büyük DataTable dışa aktarmalarını OleDb'den daha verimli bir şekilde yönetebilir mi?

Evet, IronXL, büyük DataTable dışa aktarmalarını verimli bir şekilde yönetmek için tasarlanmıştır, OleDb'ye kıyasla daha hızlı işlem süreleri sunar ve bellek kullanımını azaltır, bu da büyük veri setleri ile çalışan uygulamalar için idealdir.

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

IronXL, C# ve .NET'in en son sürümleriyle tamamen uyumludur, modern uygulamalarla kesintisiz entegrasyon sağlar ve yeni özellikleri ve geliştirmeleri desteklemek için sürekli güncellemeler sunar.

OleDb'ye kıyasla modern alternatifler, örneğin IronXL, hangi faydalar sağlar?

Modern alternatifler, örneğin IronXL, geliştirilmiş performans, daha kolay hata yönetimi, farklı Excel formatları ile daha iyi uyumluluk ve basitleştirilmiş kod gibi faydalar sağlar, bu da geliştirici verimliliğini büyük ölçüde artırabilir.

IronXL, OleDb ile karşılaştırıldığında hata yönetimini nasıl ele alır?

IronXL, daha basit hata yönetimi ve açık istisna ele alımı sunarak OleDb ile ilişkili karmaşıklığı ve olası sorunları azaltır, böylece geliştiricilerin uygulamalarını hata ayıklama ve sürdürme işlerini kolaylaştırır.

UI tabanlı .NET uygulamalarında DataTable'in Excel'e dışa aktarılma nedenleri nelerdir?

UI tabanlı .NET uygulamalarında, DataTable'i Excel'e dışa aktarma genellikle raporlama, veri analizi ve kullanıcı dostu veri manipülasyonu için kullanılır ve sıklıkla nesne gönderici desenlerini kullanarak olay işleyicilerden tetiklenir.

Jordi Bardia
Yazılım Mühendisi
Jordi Python, C# ve C++ konularında en yetkin, Iron Software'deki yeteneklerini kullanmadığı zamanlarda; oyun programlıyor. Ürün testi, ürün geliştirme ve araştırma sorumluluklarını paylaşan Jordi, sürekli ürün gelişimine büyük değer katıyor. Çeşitli deneyimleri onu ...
Daha Fazlasını Oku

Iron Destek Ekibi

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