
C# ile Sütun Başlıklarıyla birlikte DataGridView'i Excel'e Aktarma
Veri Görünümünüzü Excel'e Sütun Başlıkları ile C#'ta Nasıl Aktarırsınız?
Windows Forms DataGridView kontrolünden Excel formatına veri aktarmak yaygın bir gereksinimdir, ancak geliştiriciler genellikle hayal kırıklığına uğrayacakları bir duvarla karşılaşır: dışa aktarılan dosyada sütun başlıkları eksik. Sütun başlıkları ile birlikte DataGridView'i Excel'e aktarmanız gerektiğinde, çözüm verilerinizi ve biçimlendirmeyi güvenilir bir şekilde korumalıdır. Microsoft Office Interop kullanarak geleneksel yaklaşımlar yavaş, kırılgan olabilir ve kodu çalıştıran her makinede MS Excel'in yüklü olmasını gerektirir.
IronXL bu sorunu temiz bir şekilde çözer. Herhangi bir Office bağımlılığı olmadan Excel dosyalarını okuyan, oluşturan ve yazan .NET Excel kütüphanesidir. Bu eğitim size, sütun başlıklarını, veri türlerini, boş hücreleri ve kullanıcı dostu dosya kaydetmeyi sadece birkaç satır kodla ele alan eksiksiz bir dışa aktarma çözümünde rehberlik eder.
Sonunda, tüm sütun başlıkları bozulmamış şekilde bir DataGridView'i XLSX dosyasına aktaran çalışan bir Windows Forms düğme işleyicisine sahip olacaksınız.
Başlamadan Önce İhtiyacınız Olanlar
Herhangi bir kod yazmadan önce, aşağıdakilerin yerinde olduğundan emin olun:
- Visual Studio 2022 veya daha yeni (herhangi bir sürümü)
- .NET 10 SDK yüklü
- .NET 10 hedefleyen bir Windows Forms Uygulama projesi
- IronXL yüklemek için NuGet erişimi
Aşağıdaki örnekler, C#'ta Excel dosyası yükleme öğreticisi olan modern .NET 10 proje yapısını ve üst düzey ifadeleri kullanır.
Bir .NET Projesine Kütüphane Nasıl Yüklenir?
Visual Studio'da NuGet Paket Yöneticisi Konsolu'nu açın ve aşağıdaki komutlardan birini çalıştırın. Paket, NuGet Galerisi'nde listelenmiştir ve .NET Standard 2.0 ve üstünü hedefler, bu yüzden herhangi bir modern .NET projesi ile çalışır.
Kurulumdan sonra, form dosyanızın üstüne gereken ad alanlarını ekleyin:
using IronXL;
using System;
using System.Data;
using System.Windows.Forms;Imports IronXL
Imports System
Imports System.Data
Imports System.Windows.FormsBu ithalatlar, IronXL'nin Excel işlevselliğine, DataTable işlemlerine ve dışa aktarma süreci için gerekli Windows Forms kontrollerine erişim sağlar.
Örnek Veri ile Bir DataGridView Nasıl Kurulur?
Visual Studio'da bir Windows Forms Uygulaması oluşturarak başlayın. Tasarımcı üzerinden ana forma dataGridView1 adlı bir DataGridView ve btnExport adlı bir Buton ekleyin. Daha sonra form yüklendiğinde grid oluşturun:
using System;
using System.Data;
using System.Windows.Forms;
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable();
// Define columns -- these names become Excel headers
dt.Columns.Add("Product ID", typeof(int));
dt.Columns.Add("Product Name", typeof(string));
dt.Columns.Add("Price", typeof(decimal));
dt.Columns.Add("Stock Quantity", typeof(int));
// Add sample rows
dt.Rows.Add(1001, "Laptop", 999.99m, 15);
dt.Rows.Add(1002, "Mouse", 29.99m, 50);
dt.Rows.Add(1003, "Keyboard", 79.99m, 30);
dt.Rows.Add(1004, "Monitor", 299.99m, 12);
dt.Rows.Add(1005, "Headphones", 89.99m, 25);
// Bind data to the grid
dataGridView1.DataSource = dt;
}
}Imports System
Imports System.Data
Imports System.Windows.Forms
Public Partial Class Form1
Inherits Form
Public Sub New()
InitializeComponent()
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim dt As New DataTable()
' Define columns -- these names become Excel headers
dt.Columns.Add("Product ID", GetType(Integer))
dt.Columns.Add("Product Name", GetType(String))
dt.Columns.Add("Price", GetType(Decimal))
dt.Columns.Add("Stock Quantity", GetType(Integer))
' Add sample rows
dt.Rows.Add(1001, "Laptop", 999.99D, 15)
dt.Rows.Add(1002, "Mouse", 29.99D, 50)
dt.Rows.Add(1003, "Keyboard", 79.99D, 30)
dt.Rows.Add(1004, "Monitor", 299.99D, 12)
dt.Rows.Add(1005, "Headphones", 89.99D, 25)
' Bind data to the grid
dataGridView1.DataSource = dt
End Sub
End Classdt.Columns.Add(...) çağrılarında tanımlanan sütun adları, dışa aktarılan Excel dosyasında başlık satırı olacaktır. Burada herhangi bir veri kaynağını kullanabilirsiniz -- bir veritabanı sorgusu sonucu, bir CSV içe aktarması veya bir DataTable olarak depolanan bir API yanıtı, gösterilen dışa aktarma kodu ile aynı şekilde çalışır. DataTable yaklaşımı özellikle uygundur çünkü DataGridView, herhangi bir IList veya IBindingList kabul eden bir DataSource özelliğini ortaya çıkarır; yani aynı dışa aktarma kodu, her bağlama senaryosu genelinde değişiklik yapmadan genelleştirilebilir.
DataGridView'iniz bir SqlDataAdapter kullanılarak bir veritabanından dolduruluyorsa, DataTable zaten türlenmiş sütunlar içerir. Bu türlenmiş değerleri SetCellValue'e geçirmek, onların üzerinde ToString() çağırmaktan ziyade, Excel çıktısında sayısal sütunları sayısal tutar, bu da herhangi bir sonraki raporlama veya pivot tablo kullanımı için önemlidir.
Bu, tüm verileri doldurulmuş bir DataGridView oluşturur:

Daha gelişmiş veri bağlama senaryoları için, DataGridView veri bağlama üzerine Microsoft'un belgelendirmesi ek örnekler sunar.
Sütun Başlıklarını Koruyarak DataGridView Excel'e Nasıl Aktarılır?
Dışa aktarma yöntemi, her DataGridView sütununun HeaderText özelliğinden sütun başlıklarını okur ve bunları çalışma sayfasının 0. satırına yazar. Veri satırları 1.satırdan itibaren takip eder. Bu yöntemi btnExport tıklama olayına bağlayın:
private void btnExport_Click(object sender, EventArgs e)
{
try
{
// Create a new Excel workbook in XLSX format
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Exported Data");
// Write column headers to row 0
for (int col = 0; col < dataGridView1.Columns.Count; col++)
{
worksheet.SetCellValue(0, col, dataGridView1.Columns[col].HeaderText);
}
// Write data rows starting at row 1
for (int row = 0; row < dataGridView1.Rows.Count; row++)
{
// Skip the placeholder new-row at the bottom of the grid
if (dataGridView1.AllowUserToAddRows && row == dataGridView1.Rows.Count - 1)
continue;
for (int col = 0; col < dataGridView1.Columns.Count; col++)
{
var cellValue = dataGridView1.Rows[row].Cells[col].Value;
if (cellValue != null)
{
worksheet.SetCellValue(row + 1, col, cellValue.ToString());
}
}
}
// Prompt the user to choose a save location
using SaveFileDialog saveFileDialog = new SaveFileDialog
{
Filter = "Excel Files|*.xlsx",
FileName = "DataGridView_Export.xlsx"
};
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
workbook.SaveAs(saveFileDialog.FileName);
MessageBox.Show("Export completed successfully!", "Success",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception ex)
{
MessageBox.Show($"Export failed: {ex.Message}", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}Private Sub btnExport_Click(sender As Object, e As EventArgs)
Try
' Create a new Excel workbook in XLSX format
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Exported Data")
' Write column headers to row 0
For col As Integer = 0 To dataGridView1.Columns.Count - 1
worksheet.SetCellValue(0, col, dataGridView1.Columns(col).HeaderText)
Next
' Write data rows starting at row 1
For row As Integer = 0 To dataGridView1.Rows.Count - 1
' Skip the placeholder new-row at the bottom of the grid
If dataGridView1.AllowUserToAddRows AndAlso row = dataGridView1.Rows.Count - 1 Then
Continue For
End If
For col As Integer = 0 To dataGridView1.Columns.Count - 1
Dim cellValue = dataGridView1.Rows(row).Cells(col).Value
If cellValue IsNot Nothing Then
worksheet.SetCellValue(row + 1, col, cellValue.ToString())
End If
Next
Next
' Prompt the user to choose a save location
Using saveFileDialog As New SaveFileDialog With {
.Filter = "Excel Files|*.xlsx",
.FileName = "DataGridView_Export.xlsx"
}
If saveFileDialog.ShowDialog() = DialogResult.OK Then
workbook.SaveAs(saveFileDialog.FileName)
MessageBox.Show("Export completed successfully!", "Success",
MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End Using
Catch ex As Exception
MessageBox.Show($"Export failed: {ex.Message}", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Subİhracat Adımlarının Detaylandırılması
Yöntemin her adımı belirli bir amaç sağlar:
- WorkBook.Create: Hafızada XLSX formatında yeni bir Excel dosyası başlatır.
SaveAsçağrılana kadar diske hiçbir dosya yazılmaz. - CreateWorkSheet: İhracat verilerini tutacak adlandırılmış bir sayfa ekler. "İhraç Edilen Veri" adı, Excel'de sekme etiketi olarak görünür.
- Sütun başlığı döngüsü: Her sütun için
dataGridView1.Columns[col].HeaderTextokur ve bunu satır indeksi 0'a yazar. Bu, başlıkların korunmasını sağlayan önemli adımdır. - Veri satırı döngüleri: İç içe döngüler her satır ve sütunu iter, verinin her zaman başlık satırının altında başlaması için
row + 1'i Excel satır indeksi olarak kullanır. - Null kontrolü: Hücre bir değer içermediğinde gerçek verilerde yaygın olan bir durumu ele alarak, istisnaların önlenmesine yardımcı olur.
- SaveFileDialog: Kullanıcıların runtime'de dosya adını ve hedefini seçmelerine olanak tanır, böylece hard-coded bir yol belirtilmez.
İhraç edilen dosya böyle görünür:

İhracat Sırasında Karşılaşabileceğiniz Yaygın Kenar Durumları Nasıl Ele Alınır?
Gerçek dünya verileri genellikle bir örnek veri seti kadar temiz değildir. Karşılaşmanız muhtemel senaryolar ve bunları nasıl ele alacağınız aşağıda açıklanmıştır.
Boş Hücreler
Veri döngüsündeki boş kontrol (if (cellValue != null)), boş hücreleri bir istisna atmadan işler. Boş hücreler, Excel çıkışında boş olarak kalır ve ızgara yapısını korur.
Karışık Veri Türleri
IronXL, farklı veri formatlarını otomatik olarak ele alır. ToString() ile bir sayıyı bir dize olarak geçirdiğinizde, Excel hala değere bağlı olarak bunu sayısal olarak tanıyabilir. Doğru tür kontrolü için, hücre değerini yazmadan önce doğru türe dökün:
if (cellValue is int intVal)
worksheet.SetCellValue(row + 1, col, intVal);
else if (cellValue is decimal decVal)
worksheet.SetCellValue(row + 1, col, (double)decVal);
else
worksheet.SetCellValue(row + 1, col, cellValue?.ToString() ?? string.Empty);If TypeOf cellValue Is Integer Then
Dim intVal As Integer = CType(cellValue, Integer)
worksheet.SetCellValue(row + 1, col, intVal)
ElseIf TypeOf cellValue Is Decimal Then
Dim decVal As Decimal = CType(cellValue, Decimal)
worksheet.SetCellValue(row + 1, col, CDbl(decVal))
Else
worksheet.SetCellValue(row + 1, col, If(cellValue?.ToString(), String.Empty))
End IfBu yaklaşım, Excel'de numerik sütunları numerik tutar, böylece formüller ve sıralama downstream doğru çalışır.
Başlıklardaki Özel Karakterler
&, <, > gibi özel karakterler ve aksanlı harfler içeren sütun başlıkları doğru şekilde dışa aktarılır. IronXL, kodlamayı otomatik olarak ele alır ve sizin tarafınızdan herhangi bir kaçış gerektirmez.
Büyük Veri Setleri
On binlerce satır içeren ızgaralar için, dışa aktarma mantığını bir arka plan iş parçacığına taşıyarak kullanıcı arayüzünü duyarlı tutmayı düşünün. WorkBook.Create ve döngü mantığını bir Task.Run çağrısına sarın ve tamamlandı geri çağrısından kullanıcı arayüzünü güncelleyin. Async Programlama ile Görev üzerine Microsoft'un belgeleri, desenin detaylarını açıklar.
hücre stilleri, formül korunumu ve parola koruma gibi ek senaryolar için, IronXL belgeleri her birini detaylı olarak ele alır.
Başlıca İhracat Yaklaşımları Nasıl Karşılaştırılır?
Bir kütüphaneye bağlı kalmadan önce, en yaygın yöntemler arasındaki denklemleri anlamak size yardımcı olur.
| Yöntem | Ofis Gerekli | Sütun Başlıkları | Performans | Sunucu-Güvenli |
|---|---|---|---|---|
| Microsoft Office Interop | Evet | Elle | Yavaş | Hayır |
| OpenXml SDK | Hayır | Elle | Hızlı | Evet |
| ClosedXML | Hayır | Elle | İyi | Evet |
| IronXL | Hayır | Otomatik | Hızlı | Evet |
Interop temelli çözümler, sunucuda Excel'in kurulu olmasını gerektirir, bu da hem bir lisanslama kaygısı hem de bir dağıtım karmaşıklığı oluşturur. OpenXml SDK güçlü ancak düşük seviyelidir -- bir başlık satırı yazmak, XML yapılarının elle inşa edilmesini gerektirir. IronXL ve ClosedXML, her ikisi de daha üst düzey API'ler sağlar, ancak IronXL'nin WorkBook ve WorkSheet modeli, geliştiricilerin elektronik tablolar hakkında zaten düşündükleri şekilde yakından eşleşir.
XLSX yerine CSV'ye Nasıl İhraç Edilir?
Aynı dışa aktarım deseni, bir Excel çalışma kitabı yerine bir CSV dosyası gerektiğinde de geçerlidir. Dosya formatını ve uzantısını değiştirin:
WorkBook csvWorkbook = WorkBook.Create(ExcelFileFormat.CSV);
WorkSheet csvSheet = csvWorkbook.CreateWorkSheet("Data");
// Headers and data loops remain identical
using SaveFileDialog dialog = new SaveFileDialog
{
Filter = "CSV Files|*.csv",
FileName = "DataGridView_Export.csv"
};
if (dialog.ShowDialog() == DialogResult.OK)
csvWorkbook.SaveAs(dialog.FileName);Imports System.Windows.Forms
Dim csvWorkbook As WorkBook = WorkBook.Create(ExcelFileFormat.CSV)
Dim csvSheet As WorkSheet = csvWorkbook.CreateWorkSheet("Data")
' Headers and data loops remain identical
Using dialog As New SaveFileDialog With {
.Filter = "CSV Files|*.csv",
.FileName = "DataGridView_Export.csv"
}
If dialog.ShowDialog() = DialogResult.OK Then
csvWorkbook.SaveAs(dialog.FileName)
End If
End UsingCSV ihracatı, tüketici sistemi XLSX'i desteklemediğinde veya dosya boyutu çok büyük veri setleri için bir endişe oluşturduğunda yararlıdır.
İhraç Edilen Dosyada Başlık Satırı Nasıl Biçimlendirilir?
İhraç edilen veri, başlık satırı görsel olarak ayırt edildiğinde daha okunabilir olur. IronXL, başlık değerlerini yazdıktan sonra kalın metin, arka plan rengi ve yazı tipi boyutu uygulamanıza olanak tanıyan hücre stillendirme seçenekleri sunar:
// Write headers and apply bold styling
for (int col = 0; col < dataGridView1.Columns.Count; col++)
{
string cellAddress = worksheet.GetCellAddress(0, col);
worksheet[cellAddress].Value = dataGridView1.Columns[col].HeaderText;
worksheet[cellAddress].Style.Font.Bold = true;
worksheet[cellAddress].Style.SetBackgroundColor("#4472C4");
worksheet[cellAddress].Style.Font.FontColor = "#FFFFFF";
}' Write headers and apply bold styling
For col As Integer = 0 To dataGridView1.Columns.Count - 1
Dim cellAddress As String = worksheet.GetCellAddress(0, col)
worksheet(cellAddress).Value = dataGridView1.Columns(col).HeaderText
worksheet(cellAddress).Style.Font.Bold = True
worksheet(cellAddress).Style.SetBackgroundColor("#4472C4")
worksheet(cellAddress).Style.Font.FontColor = "#FFFFFF"
Next colStil sahibi bir başlık satırı, ihraç edilen dosyanın hemen raporlama için kullanılmasına olanak tanır ve alıcının elle biçimlendirme uygulamasını gerektirmez. Tam bir stil özellikleri listesi için, IronXL hücre stil referansına bakınız.
Ücretsiz Bir Deneme ile Nasıl Başlanır?
IronXL, bu makalede gösterilen ihracat iş akışları dahil olmak üzere tüm özellikleri test etmenizi sağlayan ücretsiz bir deneme sunar. Yukarıda gösterilen NuGet komutlarından biriyle paketi yükleyin, IronXL lisans sayfasında bir deneme anahtarı oluşturun ve ilk kütüphane çağrısından önce uygulamanızda ayarlayın:
IronXL.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";Imports IronXL
IronXL.License.LicenseKey = "YOUR-LICENSE-KEY-HERE"Deneme, tamamen işlevsel Excel dosyaları üretir ve hangi özelliklerin mevcut olduğu konusunda kısıtlama yapmaz. Üretim dağıtımı için, lisans seçenekleri, tek geliştirici, ekip ve telif ücretsiz yeniden dağıtımı kapsar.
İlgili dışa aktarım senaryoları için, IronXL'nin veritabanlarını doğrudan Excel'e dışa aktarma, Excel dosyalarını DataGridViews'e okuma ve dışa aktarılan verilerden grafikler oluşturma işlemlerini nasıl ele aldığını keşfedin.
Use Case İçin Doğru İhracat Stratejisini Seçme
Bu rehber boyunca gösterilen doğrudan hücre-hücre ihracat yöntemi, çoğu Windows Forms uygulaması için uygundur. DataGridView'iniz bir DataTable'a bağlıysa, DataTable'ı doğrudan IronXL'nin çalışma sayfası dönüştürücüsüne de geçirebilirsiniz, bu başlık satırını otomatik olarak işler. Sabit sütun düzeniniz varsa ve en kısa kod yolunu istiyorsanız doğrudan DataTable yaklaşımını seçin. Her hücre için koşullu mantık gerektiğinde manuel hücre-hücre yaklaşımını seçin -- örneğin, kabul edilebilir bir aralığın dışında kalan hücreleri vurgulama veya null türleri açıkça yazmadan önce eşleme gibi.
ASP.NET Core denetleyicileri gibi sunucu tarafı senaryoları için indirilebilir Excel raporları oluşturan, aynı IronXL API'si geçerlidir. Tek fark kayıt hedefidir: SaveAs(filePath) yerine, workbook.ToByteArray() çağırın ve application/vnd.openxmlformats-officedocument.spreadsheetml.sheet içerik türüne sahip HTTP yanıtına baytları yazın. Çıkışın bir dosyaya veya bir akıma gitmesine bakılmaksızın, sütun başlıkları aynı şekilde aktarılır.

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ılandırılmış, görsel olarak çekici kılavuzlar oluşturmayı seviyor.
İlgili Makaleler



