"Enter"a basıp içeriğe geçin

C# Excel Veri Okuma – Excel’e Veri Aktarma EPPlus

C# excel veri okuma, excel’e veri aktarma işlemi nasıl yapılır bu makelede bunu göreceğiz. Makale içerisinde excele veri aktarma işlemi yaparken, hücre biçimlendirmeye ve tarih formatlamaya da değineceğiz. Bu işlemleri epplus kütüphanesini kullanarak yapacağız. Lafı uzatmadan örneğimize geçelim.
Console uygulaması oluşturalım. Uygulama oluştuktan sonra nuget package manager’i açalım ve EPPlus dll’ini projeye dahil edelim.

Ardından ‘ExcelVeriTransferi’ adında static bir sınıf oluşturalım. İçerisine exceleYaz ve exceldenAl adında public erişim belirtecine sahip iki metod, TabloyuNesneyeDonustur ve ToAlpha adında private erişim belirtecine sahip iki metod oluşturalım.

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

namespace Project.WinFormUI.HelperClasses
{
    public static class ExcelVeriTransferi
    {
        public static string ExceleYaz(IEnumerable veri, string dosyaYolu, string calismaSayfasiAdi) where T : new()
        {
            using (ExcelPackage paket = new ExcelPackage())
            {
                var calismaSayfasi = paket.Workbook.Worksheets.Add(calismaSayfasiAdi);
                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";
                    }
                }
                calismaSayfasi.Cells["A1"].LoadFromCollection(veri, true, TableStyles.Medium9);
                calismaSayfasi.Cells[calismaSayfasi.Dimension.Address].AutoFitColumns();
                var dosya = new FileInfo(dosyaYolu);
                if (dosya.Exists)
                {
                    try
                    {
                        dosya.Delete();
                    }
                    catch (IOException)
                    {
                        return "Dosya açık olduğundan işlem gerçekleştirilemiyor!";
                    }
                }
                paket.SaveAs(dosya);
                return "Veriler excele 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 ExceldenAl(string dosyaYolu, string calismaSayfasiAdi) where T : new()
        {
            var dosya = new FileInfo(dosyaYolu);
            using (var paket = new ExcelPackage(dosya))
            {
                var calismaSayfasi = paket.Workbook.Worksheets[calismaSayfasiAdi];
                var listeHalindekiVeriler = TabloyuNesneyeDonustur(calismaSayfasi.Tables.First()).ToList();
                paket.Save();
                return listeHalindekiVeriler;
            }
        }

        private static IEnumerable TabloyuNesneyeDonustur(ExcelTable table) where T : new()
        {
            //Tarihe dönüştürme
            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 = excelDate - 2;
                else
                    excelDate = excelDate - 1;
                return dateOfReference.AddDays(excelDate);
            });

            //T özelliklerini edinme.
            var tprops = (new T())
            .GetType()
            .GetProperties()
            .ToList();

            // Hücreleri tablo adresine göre alma.
            var start = table.Address.Start;
            var end = table.Address.End;
            var cells = new List();

            // Çalışma sayfasındaki tablo hücrelerini liste aktarma.
            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();

            // İkinci satırın sütun veri türlerini temsil ettiğini varsay.
            var types = groups
                .Skip(1)
                .First()
                .Select(rcell => rcell.Value.GetType())
                .ToList();

            // İlk satırın sütun adlarının olduğunu varsayalım.
            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();

            // Başlıktan sonraki her şey veri.
            var rowvalues = groups
                .Skip(1)
                .Select(cg => cg.Select(c => c.Value).ToList());

            // Toplama kabını oluşturma
            var collection = rowvalues
                .Select(row =>
                {
                    var tnew = new T();
                    colnames.ForEach(colname =>
                    {
                    // Excel int dahil tüm sayıları çift olarak saklar.
                    var val = row[colname.index];
                        var type = types[colname.index];
                        var prop = tprops.First(p => p.Name == colname.Name);
                    // Sayısalsa, çifttir, çünkü excel tüm sayıları bu şekilde saklar.
                    if (type == typeof(double))
                        {
                            if (!string.IsNullOrWhiteSpace(val?.ToString()))
                            {
                            // Kutuyu aç
                            var unboxedVal = (double)val;
                            //Listeye at
                            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(String.Format("'{0}' türü henüz uygulanmadı!", prop.PropertyType.Name));
                            }
                        }
                        else
                        {
                        // Bu bir dize
                        prop.SetValue(tnew, val);
                        }
                    });
                    return tnew;
                });
            //Geri gönder
            return collection;
        }
    }
}

Şimdi Ogrenci ve OgrenciManager adında bir sınıf oluşturalım.


public class Ogrenci
{
    public string Ad { get; set; }
    public DateTime EklenmeTarihi { get; set; }
}

public class OgrenciManager
{
    public static IEnumerable OgrenciGetir()
    {
        var ogrenciler = new List();
        Ogrenci ogrenci;

        ogrenci = new Ogrenci();
        ogrenci.Ad = "Mehmet";
        ogrenci.EklenmeTarihi = DateTime.Now;
        ogrenciler.Add(ogrenci);

        ogrenci = new Ogrenci();
        ogrenci.Ad = "Kardelen";
        ogrenci.EklenmeTarihi = new DateTime(2020, 02, 14);
        ogrenciler.Add(ogrenci);

        ogrenci = new Ogrenci();
        ogrenci.Ad = "Samet";
        ogrenci.EklenmeTarihi = new DateTime(2020, 02, 14, 13, 30, 57);
        ogrenciler.Add(ogrenci);

        ogrenci = new Ogrenci();
        ogrenci.Ad = "Yaren";
        ogrenci.EklenmeTarihi = new DateTime(2020, 02, 15);
        ogrenciler.Add(ogrenci);

        return ogrenciler;
    }
}

Sınıflar hazır olduğuna göre şimdi program.cs ye geçelim ve excele veri ekleme işlemini ve excelden veri alma işlemini gerçekleştirelim.


class Program
{
    static void Main(string[] args)
    {
        string dosyaYolu = @"D:\ExcelOrnek.xlsx";
        string calismaSayfasi = "Ogrenciler";
        var ogrenciler = OgrenciManager.OgrenciGetir();
        Yaz(dosyaYolu, calismaSayfasi, ogrenciler);
        Oku(dosyaYolu, calismaSayfasi);
        Console.ReadKey();
    }

    private static void Yaz(string dosyaYolu, string calismaSayfasi, IEnumerable ogrenciler)
    {
        string mesaj = ExcelVeriTransferi.ExceleYaz(ogrenciler, dosyaYolu, calismaSayfasi);
        Console.WriteLine(mesaj);
    }

    private static void Oku(string dosyaYolu, string calismaSayfasi)
    {
        var listeHalindekiVeriler = ExcelVeriTransferi.ExceldenAl(dosyaYolu, calismaSayfasi);
        foreach (var veri in listeHalindekiVeriler)
        {
            Console.WriteLine(veri.Ad + veri.EklenmeTarihi);
        }
    }
}

Bu işlemleri yapıp projeyi çalıştırdığınızda ‘Yerel Disk D’de excel dosyası oluşmuş bulunuyor.
C# ile excel veri okuma ve excele veri yazma işlemi bu şekilde arkadaşlar.İyi kodlamalar!

Yazıyı Paylaşmak İster misin?
Share on Facebook
Facebook
Pin on Pinterest
Pinterest
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Share on Tumblr
Tumblr
Share on Reddit
Reddit
    Bir cevap yazın

    E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir