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.
Yorum Yap