Ara

Epplus İle C#'Ta Excel Dosyalarıyla Çalışma: Adım Adım Kılavuz

Veri tabanında topladığımız veya eklediğimiz verilerin dışa aktarılması sıklıkla gereklidir. Bu verileri farklı dosya formatlarına yazdırabiliriz. Bu yazıda, verilerin Excel dosyasına aktarılması ve Excel'den veri okunması işlemlerini EPPlus kütüphanesi kullanarak nasıl yapabileceğimizi inceleyeceğiz.

 

1. EPPlus Kütüphanesinin Projeye Dahil Edilmesi

Öncelikle, EPPlus kütüphanesini projemize eklememiz gerekiyor:

  • Solution Explorer'dan projenize sağ tıklayın.
  • "Manage NuGet Packages" seçeneğine tıklayın.
  • "Browse" kısmına gelip "EPPlus" yazın ve kütüphaneyi bulun.
  • EPPlus kütüphanesini projenize dahil edin.

 

2. ExcelVeriTransferi Sınıfının Oluşturulması

Şimdi ExcelVeriTransferi adında bir static sınıf oluşturup aşağıdaki gibi düzenleyelim:

using OfficeOpenXml;
using OfficeOpenXml.Table;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace Webkoz.ExcelTest
{
    public static class ExcelVeriTransferi
    {
        public static string ExceleYaz<T>(IEnumerable<T> veri, string dosyaYolu, string calismaSayfasiAdi) where T : new()
        {
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
            using (ExcelPackage paket = new ExcelPackage())
            {
                var calismaSayfasi = paket.Workbook.Worksheets.Add(calismaSayfasiAdi);

                // Tarih formatlama
                Type[] dateTypes = { typeof(DateTime), typeof(DateTime?) };
                var props = typeof(T).GetProperties();
                for (int i = 0; i < props.Length; i++)
                {
                    if (dateTypes.Contains(props[i].PropertyType))
                    {
                        var col = ToAlpha(i + 1);
                        calismaSayfasi.Cells[$"{col}:{col}"].Style.Numberformat.Format = "MM/dd/yyyy";
                    }
                }

                // Verilerin eklenmesi
                calismaSayfasi.Cells["A1"].LoadFromCollection(veri, true, TableStyles.Medium9);
                calismaSayfasi.Cells[calismaSayfasi.Dimension.Address].AutoFitColumns();

                // Dosyayı kaydetme
                var dosya = new FileInfo(dosyaYolu);
                if (dosya.Exists) return "Aynı ada sahip dosya zaten var";

                paket.SaveAs(dosya);
                return "Veriler Excel'e başarıyla aktarıldı!";
            }
        }

        private static string ToAlpha(int column)
        {
            if (column == 0)
                return "";
            else if (column <= 26)
                return ((char)('A' - 1 + column)).ToString();
            else
                return ToAlpha((column % 26 == 0 ? column - 1 : column) / 26) + ToAlpha((column - 1) % 26 + 1);
        }

        public static IEnumerable<T> ExceldenAl<T>(string dosyaYolu) where T : new()
        {
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
            var dosya = new FileInfo(dosyaYolu);
            using (var paket = new ExcelPackage(dosya))
            {
                var calismaSayfasi = paket.Workbook.Worksheets[0];
                var listeHalindekiVeriler = TabloyuNesneyeDonustur<T>(calismaSayfasi.Tables.First()).ToList();
                return listeHalindekiVeriler;
            }
        }

        private static IEnumerable<T> TabloyuNesneyeDonustur<T>(ExcelTable table) where T : new()
        {
            var convertDateTime = new Func<double, DateTime>(excelDate =>
            {
                if (excelDate < 1)
                    throw new ArgumentException("Exceldeki tarihler 0'dan küçük olamaz.");
                var dateOfReference = new DateTime(1900, 1, 1);
                if (excelDate > 60d) excelDate -= 2;
                else excelDate -= 1;
                return dateOfReference.AddDays(excelDate);
            });

            var tprops = (new T()).GetType().GetProperties().ToList();

            var start = table.Address.Start;
            var end = table.Address.End;
            var cells = new List<ExcelRangeBase>();

            for (var r = start.Row; r <= end.Row; r++)
                for (var c = start.Column; c <= end.Column; c++)
                    cells.Add(table.WorkSheet.Cells[r, c]);

            var groups = cells.GroupBy(cell => cell.Start.Row).ToList();

            var types = groups.Skip(1).First().Select(rcell => rcell.Value.GetType()).ToList();

            var colnames = groups.First().Select((hcell, idx) => new { Name = hcell.Value.ToString(), index = idx }).Where(o => tprops.Select(p => p.Name).Contains(o.Name)).ToList();

            var rowvalues = groups.Skip(1).Select(cg => cg.Select(c => c.Value).ToList());

            var collection = rowvalues.Select(row =>
            {
                var tnew = new T();
                colnames.ForEach(colname =>
                {
                    var val = row[colname.index];
                    var type = types[colname.index];
                    var prop = tprops.First(p => p.Name == colname.Name);
                    if (type == typeof(double))
                    {
                        if (!string.IsNullOrWhiteSpace(val?.ToString()))
                        {
                            var unboxedVal = (double)val;
                            if (prop.PropertyType == typeof(Int32))
                                prop.SetValue(tnew, (int)unboxedVal);
                            else if (prop.PropertyType == typeof(double))
                                prop.SetValue(tnew, unboxedVal);
                            else if (prop.PropertyType == typeof(DateTime))
                                prop.SetValue(tnew, convertDateTime(unboxedVal));
                            else
                                throw new NotImplementedException($"'{prop.PropertyType.Name}' türü henüz uygulanmadı!");
                        }
                    }
                    else
                    {
                        prop.SetValue(tnew, val);
                    }
                });
                return tnew;
            });
            return collection;
        }
    }
}

 

3. Veri Transferi İşlemleri

Artık oluşturduğumuz bu sınıfı kullanarak veri transferi işlemlerini gerçekleştirebiliriz.

a. Excel'den Veri Okuma

Excel dosyasından veri okumak için aşağıdaki kodu kullanabilirsiniz:

var veriler = ExcelVeriTransferi.ExceldenAl<SinifIsmi>(dosyaYolu).ToList();

b. Excel'e Veri Yazma

Verileri Excel dosyasına yazmak için aşağıdaki kodu kullanmanız yeterlidir:

var sonuc = ExcelVeriTransferi.ExceleYaz<SinifIsmi>(veriListesi, dosyaYolu, "CalismaSayfaAdi");

Bu kütüphane, program içerisinde oluşturulan sınıfları tablo olarak algılar. Örneğin, Ogrenci adında bir sınıfınız varsa ve bu sınıfı içeren bir List<Ogrenci> nesnesi oluşturup verileri doldurduysanız, bu kütüphane verilerinizi Excel dosyasına aktardığınızda, Excel dosyasında bir tablo oluşturur. Ogrenci sınıfınızda bulunan özellikleri, Excel tablosundaki sütun adları olarak belirler ve altına verileri doldurur. Aynı mantık Excel'den veri alırken de uygulanır. Verileri List<Ogrenci> listesine aktarmak için, Excel tablosundaki sütun adlarının, sınıfınızdaki özelliklere karşılık gelmesi gerekir. Aksi takdirde hata fırlatılacaktır.

Bu şekilde, EPPlus kütüphanesini kullanarak Excel dosyalarına veri yazma ve bu dosyalardan veri okuma işlemlerini gerçekleştirebilirsiniz. Bu işlemleri başarılı bir şekilde uyguladığınızda, verilerinizi kolayca Excel formatında dışa aktarabilir ve ihtiyaç duyduğunuzda geri alabilirsiniz.

Author

Bilgisayar programcılığı bölümü mezunuyum. Web ve masaüstü uygulama geliştiricisiyim. C#,.Asp.Net Core, JQuery, Ajax, Entity Framework konularında bilgi sahibiyim. Bu sitenin kurucusuyum . Aynı zamanda şiir yazmayı seven birisiyim. 2023 yılında "Gökkuşağının Koyu Tonu" adlı ilk şiir kitabım yayınlandı. Yazmaya devam ediyorum.
Yorum Yap
Yorumlar (0)