C# İle Excel Dosyasına Veri Aktarımı Nasıl Yapılır?

C# İle Excel Dosyasına Veri Aktarımı Nasıl Yapılır?
C# İle Excel Dosyasına Veri Aktarımı Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Excel dosyalarıyla çalışmak için doğrudan Microsoft Office'in yüklü olmasına gerek yoktur. Aksine, sunucu taraflı uygulamalarda (ASP.NET Core gibi) Microsoft Office Interop kütüphanelerini kullanmak, performans ve lisanslama sorunları nedeniyle önerilmez. Bunun yerine, açık kaynaklı ve yüksek performanslı EPPlus veya ClosedXML kütüphanelerini kullanacağız.

  • .NET 8 veya .NET 9 SDK yüklü bir geliştirme ortamı (Visual Studio 2026 veya VS Code).
  • NuGet paket yöneticisi aracılığıyla projenize ekleyeceğiniz kütüphaneler.
  • Temel düzeyde C# nesne yönelimli programlama bilgisi.

Projenizi oluşturduktan sonra, terminal üzerinden şu komutla gerekli kütüphaneyi yükleyebilirsiniz:

dotnet add package EPPlus

EPPlus, Excel dosyalarını (OpenXML formatında) okumak ve yazmak için endüstri standardı haline gelmiş, hızlı ve güvenli bir kütüphanedir.

Adım Adım EPPlus ile Excel Dosyası Oluşturma

İlk adımda, basit bir liste verisini Excel dosyasına nasıl dönüştüreceğimizi inceleyelim. EPPlus kullanarak bir çalışma kitabı (Workbook) oluşturmak ve içine veri yazmak oldukça basittir.

using OfficeOpenXml;
using System.IO;

public void BasitExcelOlustur(string dosyaYolu)
{
    ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // Lisans ayarı
    using (var package = new ExcelPackage())
    {
        var worksheet = package.Workbook.Worksheets.Add("Veriler");
        worksheet.Cells[1, 1].Value = "ID";
        worksheet.Cells[1, 2].Value = "Ad";
        worksheet.Cells[2, 1].Value = 1;
        worksheet.Cells[2, 2].Value = "Ahmet Yılmaz";
        
        FileInfo fi = new FileInfo(dosyaYolu);
        package.SaveAs(fi);
    }
}

Burada ExcelPackage sınıfı, Excel dosyasının temel kapsayıcısıdır. LicenseContext ayarı, kütüphanenin ticari olmayan kullanım bildirimini yapmak için zorunludur. Dosyayı kaydederken FileInfo nesnesi kullanarak fiziksel yolu belirtiyoruz.

Nesne Listesini Excel'e Aktarma

Gerçek dünya uygulamalarında genellikle veritabanından gelen nesne listelerini (List) Excel'e aktarmanız gerekir. EPPlus, LoadFromCollection metodu ile bu işlemi tek satırda yapmanıza olanak tanır.

public void ListeyiAktar(List kullanicilar, string yol)
{
    using (var package = new ExcelPackage())
    {
        var worksheet = package.Workbook.Worksheets.Add("Kullanicilar");
        worksheet.Cells["A1"].LoadFromCollection(kullanicilar, true);
        package.SaveAs(new FileInfo(yol));
    }
}

LoadFromCollection metodundaki true parametresi, nesne özelliklerinin (property) başlık olarak kullanılmasını sağlar. Bu, kodunuzu temiz tutar ve manuel hücre doldurma zahmetinden kurtarır.

Excel Dosyasına Stil ve Biçimlendirme Ekleme

Verileri aktarmak tek başına yeterli olmayabilir; verilerin okunabilir olması için stil vermek gerekir. Hücreleri renklendirmek, yazı tipini kalınlaştırmak veya kenarlık eklemek için Style özelliğini kullanırız.

var headerCells = worksheet.Cells["A1:B1"];
headerCells.Style.Font.Bold = true;
headerCells.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
headerCells.Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightBlue);

Bu kod bloğu, başlık satırını mavi arka planlı ve kalın yazı tipine dönüştürür. Görsel hiyerarşi oluşturmak, son kullanıcının veriyi anlamlandırmasını kolaylaştırır.

Veri Aktarım Yöntemlerinin Karşılaştırılması

Yöntem Avantajı Dezavantajı
EPPlus Hızlı, zengin özellikler, modern Büyük dosyalarda bellek kullanımı
CSV (StreamWriter) Çok hızlı, kütüphane gerektirmez Stil desteği yok
OpenXML SDK Microsoft resmi, çok hızlı Kodlaması karmaşık
Kritik Güvenlik Uyarısı: Excel dosyalarına veri aktarırken, kullanıcıdan gelen verileri doğrudan hücreye yazmadan önce mutlaka temizleyin. Özellikle Excel formül enjeksiyonu (CSV Injection) riskine karşı, hücre içeriği "=" ile başlıyorsa bunu tek tırnak (') ile ön ekleyerek etkisiz hale getirin.

Sıkça Sorulan Sorular

Excel dosyası oluştururken "Access Denied" hatası alıyorum, neden?

Bu hata genellikle dosyanın başka bir uygulama (örneğin Excel'in kendisi) tarafından açık tutulmasından kaynaklanır. Dosyayı kapatıp tekrar deneyin veya dosya yolunun yazma izni olup olmadığını kontrol edin.

Çok büyük veri setlerinde bellek sorunu yaşar mıyım?

Evet, EPPlus tüm veriyi bellekte tutar. Eğer milyonlarca satır yazıyorsanız, "Stream" tabanlı yöntemleri veya CSV formatını tercih etmelisiniz.

Excel'de formül kullanabilir miyim?

Evet, worksheet.Cells["C1"].Formula = "=SUM(A1:B1)"; şeklinde formül atayabilirsiniz. Ancak dosya açıldığında hesaplamanın tetiklenmesi için dosyanın kaydedilmesi gerekir.

Excel dosyasını web uygulamasında nasıl indirtebilirim?

ASP.NET Core'da File(stream.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "dosya.xlsx") metodunu kullanarak doğrudan tarayıcıya dosya akışı sağlayabilirsiniz.

Excel dosyasına şifre koyabilir miyim?

Evet, package.Workbook.Protection.SetPassword("sifre123"); komutu ile çalışma kitabını koruma altına alabilirsiniz.

Performans Optimizasyonu ve Büyük Veri Setleri ile Çalışma

Excel dosyalarıyla çalışırken en sık karşılaşılan sorun, veri boyutu arttıkça uygulamanın yanıt vermeyi kesmesi veya "Out of Memory" (bellek yetersizliği) hataları almasıdır. EPPlus gibi kütüphaneler veriyi bellekte (RAM) işlediği için, milyonlarca satırlık veriyi tek seferde yüklemek sistem kaynaklarını tüketebilir.

Büyük veri setlerini yönetmek için şu stratejileri uygulayabilirsiniz:

  • Veriyi Parçalara Bölün (Chunking): Veritabanından veriyi 50.000'lik paketler halinde çekerek Excel'e yazın.
  • Gereksiz Stil İşlemlerinden Kaçının: Her hücreye tek tek stil uygulamak yerine, Range nesnelerini kullanarak toplu biçimlendirme yapın.
  • Garbage Collector'ı Tetikleyin: Çok büyük dosyalarda işlem bittikten sonra GC.Collect() kullanarak belleği manuel olarak temizleyebilirsiniz.
// Büyük veri setleri için toplu stil uygulaması örneği
using (var package = new ExcelPackage(fileInfo))
{
    var worksheet = package.Workbook.Worksheets.Add("Rapor");
    // Tek tek stil vermek yerine aralık bazlı stil
    var range = worksheet.Cells["A1:Z10000"];
    range.Style.Font.Name = "Calibri";
    range.Style.Font.Size = 11;
    
    package.Save();
}

Excel Dosyalarında Hata Ayıklama ve Dosya Bütünlüğü

Excel dosyalarıyla çalışırken dosyanın kilitlenmesi veya bozulması (corruption) durumları yaşanabilir. Özellikle web sunucularında dosya akışları (streams) kapatılmadığında bu sorunlar sıklaşır. Dosya bütünlüğünü korumak ve hataları izlemek için using bloklarını mutlaka kullanmalı ve dosya erişimini kontrol etmelisiniz.

Dosyanın o an başka bir kullanıcı tarafından açık olup olmadığını kontrol etmek için aşağıdaki yardımcı metodu projenize ekleyebilirsiniz:

public bool IsFileLocked(FileInfo file)
{
    try
    {
        using (FileStream stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.None))
        {
            stream.Close();
        }
    }
    catch (IOException)
    {
        return true; // Dosya kilitli
    }
    return false;
}

Yaygın Hata Kodları ve Çözümleri

Hata Türü Olası Neden Çözüm
IOException Dosya başka bir işlem tarafından kullanılıyor. Dosyayı kapatın veya IsFileLocked kontrolü ekleyin.
InvalidOperationException Excel yapısı bozulmuş veya geçersiz format. Dosya yolunu ve izinlerini kontrol edin, EPPlus sürümünü güncelleyin.
OutOfMemoryException Bellek sınırı aşıldı. Veriyi parça parça işleyin veya 64-bit mimariye geçiş yapın.

Bu hata ayıklama yöntemleri, özellikle üretim ortamındaki (production) uygulamalarınızın kararlılığını artıracak ve kullanıcılarınıza daha profesyonel bir deneyim sunmanızı sağlayacaktır.

Sonuç

C# ile Excel dosyasına veri aktarımı, doğru kütüphanelerle oldukça verimli ve yönetilebilir bir süreçtir. EPPlus gibi araçlar sayesinde hem estetik hem de işlevsel raporlar oluşturabilirsiniz. Güvenlik kurallarına (özellikle formül enjeksiyonuna) dikkat ederek, kullanıcılarınız için güvenilir raporlama çözümleri geliştirebilirsiniz.

Bir sonraki adım olarak, oluşturduğunuz Excel dosyalarını bir veritabanından otomatik olarak çeken bir "Background Worker" veya "Hangfire" entegrasyonu üzerine çalışarak süreci otomatize etmeyi deneyebilirsiniz.

Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Üretim ortamında kullanmadan önce mutlaka hata yönetimi (try-catch blokları) ve giriş doğrulama mekanizmalarını ekleyin. Yazılım güvenliği, geliştiricinin sorumluluğundadır.
Bu yazıya tepkinizi paylaşın:
Selin Yılmaz

Sürdürülebilir yaşam ve pratik ev yönetimi üzerine içerik stratejileri geliştiriyorum. Yalın anlatımı ve uygulanabilirliği ön planda tutan bir yazı dilim var.

Yorumlar (0)

Yorum Yaz