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:
OgrenciID | OgrenciAd | OgrenciSoyad | OgrenciCinsiyet | OgrenciBolum |
1 | Emir | KARA | ERKEK | Elektronik Mühendisliği |
2 | Tuncay | KAYA | ERKEK | Yazılım Mühendisliği |
3 | Gülhan | AYYILDIZ | KADIN | Diyetisyenlik |
4 | Mustafa | DERİN | ERKEK | Mekatronik Mühendisliği |
5 | Alp | EMMİOĞLU | ERKEK | Uçak Mühendisliği |
6 | Zeynep | KOMİK | KADIN | TIP |
7 | Sena | DİŞÇİ | KADIN | TIP |
8 | Demir | ŞİŞMİŞ | ERKEK | Diyetisyenlik |
9 | Kerem | HEYECANLI | ERKEK | İletişim |
10 | Nil | BAKKAL | KADIN | Satış Pazarlama |
Ogretmen Sheet:
OgretmenID | OgretmenAd | OgretmenSoyad | OgretmenCinsiyet | OgretmenBrans |
1 | İsmail | GÜRSOY | ERKEK | Elektronik Mühendisliği |
2 | Ali | RENDECİ | ERKEK | Yazılım Mühendisliği |
3 | Gülten | BAKAMAZ | KADIN | Diyetisyenlik |
4 | Zeynep | YAZAR | KADIN | Mekatronik Mühendisliği |
5 | Hasan | BOZTEPE | ERKEK | Uçak Mühendisliği |
6 | İsmail | BALTA | ERKEK | TIP |
7 | Filiz | BAŞARIR | KADIN | TIP |
8 | Firdevs | CENNET | KADIN | Diyetisyenlik |
9 | Ekmel | EKMEKÇİ | KADIN | İletişim |
10 | Yusuf | ALP | ERKEK | Satış 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:

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.

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

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, 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.


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:

Şimdilik bu kadar 🙂