ExcelDataReader ile EXCEL’den Combobox’a Veri Aktarma İşlemleri

Bu yazımda da Csharpta windows form uygulaması üzerinde, ExcelDataReader kütüphanesi kullanarak, EXCEL dosyasından veriler nasıl windows formumuzda yer alan comboboxlara çekilir göstermek istiyorum. Tabi burda spesifik bir excel tablosu olarak düşünmeyelim. Aşağıdaki gibi 2 sheete sahip, birkaç sütun olan, birkaç satıra sahip excel dokümanımız olsun. Örneklemek için ben excel dokümanlarımı da resmedeyim.

Ogrenci Sheet:

OgrenciIDOgrenciAdOgrenciSoyadOgrenciCinsiyetOgrenciBolum
1EmirKARAERKEKElektronik Mühendisliği
2TuncayKAYAERKEKYazılım Mühendisliği
3GülhanAYYILDIZKADINDiyetisyenlik
4MustafaDERİNERKEKMekatronik Mühendisliği
5AlpEMMİOĞLUERKEKUçak Mühendisliği
6ZeynepKOMİKKADINTIP
7SenaDİŞÇİKADINTIP
8DemirŞİŞMİŞERKEKDiyetisyenlik
9KeremHEYECANLIERKEKİletişim
10NilBAKKALKADINSatış Pazarlama

Ogretmen Sheet:

OgretmenIDOgretmenAdOgretmenSoyadOgretmenCinsiyetOgretmenBrans
1İsmailGÜRSOYERKEKElektronik Mühendisliği
2AliRENDECİERKEKYazılım Mühendisliği
3GültenBAKAMAZKADINDiyetisyenlik
4ZeynepYAZARKADINMekatronik Mühendisliği
5HasanBOZTEPEERKEKUçak Mühendisliği
6İsmailBALTAERKEKTIP
7FilizBAŞARIRKADINTIP
8FirdevsCENNETKADINDiyetisyenlik
9EkmelEKMEKÇİKADINİletişim
10YusufALPERKEKSatış Pazarlama

Yani aslında demek istediğim bunlar tıpkı bir standart tablo gibi tablolar. Birleştirme vs olmayan tablolar.

Şimdi bizim amacımız şu; windows form üzerinde ben comboboxlara Sayfa yani Sheet isimlerini, Sütun isimlerini OgrenciID, OgrenciAd gibi ve ilgili sütuna göre de satır verilerini çekeceğim.

Visual Studio’ya dönüyorum ve windows formu tasarlamaya devam ediyorum. Aşağıdaki gibi bir tasarım elde ettim:

ExcelDataReader ile EXCEL’den Combobox’a Veri Aktarma İşlemleri

Burada label kontrollerine isim vermedim, sadece text özelliklerini ekranda görüleceği şekilde değiştirdim.

Bir adet textbox ekledim. Enabled özelliğini FALSE yaptım, dışarıdan yazı girilmesin. Name özelliğini txtDosyaAdi yaptım.

Buton kontrolümün text özelliğine &Dosya Aç yaptım. Name özelliğini btnDosyaAc yaptım.

Sayfa(Sheet) labeline yakın olan combobox name özelliğini cmbSayfa yaptım.

Kolon Adı labeline yakın olan combobox name özelliğini cmbKolon yaptım.

Veri labeline yakın olan combobox name özelliğini cmbVeri yaptım.

Comboboxların DropDownStyle özelliğini ise DropDownList yaptım.

Geri kalan tüm ayarlar görsel kısım istediğiniz şekilde değiştirebilirsiniz.

ExcelDataReader Ktüphanesinin Eklenmesi:

Daha sonra projeme sağ tıklıyorum. Manage Nuget Packages seçiyorum.

ExcelDataReader ile EXCEL’den Combobox’a Veri Aktarma İşlemleri

Ortadaki arama alanında ExcelDataReader yazıyorum. Ve bulduğum ExcelDataReader kütüphanesini yüklüyorum. Gelen soruya OK diyerek geçiniz.

ExcelDataReader ile EXCEL’den Combobox’a Veri Aktarma İşlemleri

Yüklemenin akabinde başarı ile yüklendi şeklinde bir mesaj almalısınız. Zaten referanslarınız arasında da ExcelDataReader görünecektir.

ExcelDataReader ile EXCEL’den Combobox’a Veri Aktarma İşlemleri

ExcelDataReader, Microsoft Excel verilerini okumak için C# ile yazılmış hızlı bir kütüphanedir.

Aynı şekilde ExcelDataReader.DataSet içinde arama yapıp, yüklüyorum. Yüklemenin akabinde başarı ile yüklendi şeklinde bir mesaj almalısınız. Zaten referanslarınız arasında da ExcelDataReader görünecektir. ExcelDataReader.DataSet, ExcelDataReader’e bağlı olan bir alt kütüphanedir.

ExcelDataReader ile EXCEL’den Combobox’a Veri Aktarma İşlemleri
ExcelDataReader ile EXCEL’den Combobox’a Veri Aktarma İşlemleri

Daha sonra tekrar formuma dönüyorum ve Dosya Aç butonuna çift tıklayarak kodlarımı yazmaya başlıyorum.

Kütüphanelerime ExcelDataReader’ı ekliyorum. Ayrıca dosya yazma ve okuma işlemleri için de System.IO kütüphanesini ekliyorum.

using ExcelDataReader;
using System.IO;

Şimdi bazı sınıfları kısaca açıklayalım:

DataTableCollection: DataSet için tablo koleksiyonunu temsil eden bir sınıftır.

DataSet: Veri kümesidir.

OpenFileDialog: Dosya açma işlemleri için ilgili dialog penceresini açar.

IExcelDataReader: Excel dosyasından veri okuma işlemleri için kullanılır.

Programın algoritmasını özetlersek kabaca şu şekilde; öncelikle OpenFileDialog ile excel dokümanlarını filtreleyerek bir dialog penceresi vasıtası ile açmak istediğim excel dokümanını açacağım.

Seçilen dosyanın adını formumda yer alan texboxa yazdıracağım.

Excel dokümanından okunan veriler DataSet olarak geri döndürülecek. DataSetteki tüm tablo adlarını okuyup comboxlarıma alacağım. Daha sonra seçilen sheet bilgisini ilgili combobaxa, verileri alacğaım kolon adlarını ilgili comboxa ve o kolondan gelen verileir de diğer combobox içine alacağım.

Tüm kodları paylaşalım:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ExcelDataReader;

namespace ExceldenVeriCekme
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        DataTableCollection VeriTopla;

        private void btnDosyaAc_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog DosyaAc = new OpenFileDialog() { Filter = "*.xls | *.xlsx" })
            {
                if (DosyaAc.ShowDialog() == DialogResult.OK)
                {
                    txtDosyaAdi.Text = DosyaAc.FileName;

                    using (var stream = File.Open(DosyaAc.FileName, FileMode.Open, FileAccess.Read))
                    {
                        using (IExcelDataReader okuyucu = ExcelReaderFactory.CreateReader(stream))
                        {
                            DataSet sonuc = okuyucu.AsDataSet(new ExcelDataSetConfiguration()
                            {
                                ConfigureDataTable = (_) => new ExcelDataTableConfiguration() { UseHeaderRow = true }
                            });

                            VeriTopla = sonuc.Tables;
                            cmbVeri.DataSource = null;
                            cmbSayfa.Items.Clear();
                            cmbSayfa.Items.AddRange(VeriTopla.Cast().Select(t => t.TableName).ToArray());


                        }                      

                    }
                }
            }
        }

        DataTable dt;

        private void cmbSayfa_SelectionChangeCommitted(object sender, EventArgs e)
        {
            //Sayfa adına göre veri seçimi
            dt = VeriTopla[cmbSayfa.SelectedItem.ToString()];
            var kolonAdlari = (from kolon in dt.Columns.Cast() select kolon.ColumnName).ToArray();
            cmbKolon.Items.Clear();
            cmbKolon.Items.AddRange(kolonAdlari);
        }

        private void cmbKolon_SelectionChangeCommitted(object sender, EventArgs e)
        {
            //Sayfa adına göre veri seçimi
            if (dt != null)
            {
                string kolonAdi = cmbKolon.SelectedItem.ToString();
                var veri = dt.DefaultView.ToTable(false, kolonAdi);
                cmbVeri.DataSource = veri;
                cmbVeri.DisplayMember = kolonAdi;
                cmbVeri.ValueMember = kolonAdi;
            }
        }
    }
}

Sonuç olarak aşağıdaki gibi bir durum ortaya çıkıyor:

ExcelDataReader ile EXCEL’den Combobox’a Veri Aktarma İşlemleri

Şimdilik bu kadar 🙂

Bir cevap yazın

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