C# Excel OLEDB Bağlantı ve Veri Okuma – Class, yazım ile C# eğitimlerine devam ediyorum. Bu dersimde geçen günlerde paylaştığım C# Excelden Veri Okuma ve DataTable’a Yükleme – XLSX dersteki kodları class haline getirdim ve onu sizlerle paylaşacağım.
C# Excel OLEDB Bağlantı ve Veri Okuma – Class
Classlarla çalışmak her zaman çok güzel oluyor. Çünkü bir kere yazıyorsunuz ve sürekli kullanıyorsunuz. Bir süre sonra tekrar lazım olduğunda nerede kullanmıştım diye aramanıza gerek kalmıyor. Class’larınızı topladığınız klasörde öylece kullanılmayı bekliyor. Son derece güzel. Bu konu hakkında C# Class Nedir? Nasıl Kullanılır? adında bir dersimde var. Kesinlikle inceleyin derim.
Şimdi dersimizde geçelim.
İlk olarak bir OpenFileDialog nesnesi ile Excel seçim diyaloğu oluşturacağız. Ancak burada şöyle bir durum var. Eğer projenizin platformu 64 Bit yani x64 ise xls uzantılı excel dosyalarını okuyamazsınız. Eğer projenizin platformu x86 yani 32 Bit ise xlsx uzantılı dosyaları okuyamazsınız. Size şöyle bir hata verecektir.
‘Microsoft.Jet.OLEDB.4.0’ sağlayıcısı yerel makine kayıtlı değil.
Yukarıdaki hata 64 Bit projede xls uzantılı dosya okumaya çalıştığınızda çıkan bir hatadır. Tam tersi durumunda da buna benzer bir hata çıkar o hata da şöyledir.
‘Microsoft.ACE.OLEDB.12.0’ sağlayıcısı yerel makine kayıtlı değil.
Jet. OLEDB.4.0 XLS için, ACE.OLEDB.12 de XLSX dosyaları için kullanılır.
Bu classımızı yaparken bu hataları dikkate alarak hazırlayacağız. Eğer projemiz x64 ise OpenFileDialog penceresinde sadece xlsx uzantılı, x86 ise OpenFileDialog penceresinde sadece xls uzantılı dosyaları seçmek zorunda bırakacağız. Bu sayede yanlış dosya seçme şansı kalmayacak ve bizde ek olarak bir sürü kontrol için kod yazmak zorunda olmayacağız. Yani yılanın başını küçükken ezeceğiz. :)
Şimdi class’larımızı topladığımız klasör(!) üzerinde sağ tık yapıp Add > Class… diyoruz. Classımızın adı ExcelBaglanOku olacak. Siz başka isimler verebilirsiniz.
Classımızın namespace’leri aşağıdaki gibi olacak.
using System; using System.Collections.Generic; using System.Data; using System.Data.OleDb; using System.Globalization; using System.Linq; using System.Text; using System.Windows.Forms;
Excel Seçmek
Excel dosyası seçmek için bir metod tanımlıyoruz. Seçmeyi fakrlı , okumayı farklı butonlar altına koymak istediğimden Seçme ve Okuma işlemlerini ayrı metod içerisine alıyorum.
private static string ExcelYol = ""; public static string ExcelYoluSec() { string Platform = ""; OpenFileDialog ac = new OpenFileDialog(); if (Environment.Is64BitProcess) { ac.Filter = "Excel dosyaları(*.xlsx)|*.xlsx"; Platform = "x64. Sadece XLSX Dosyaları"; } else { ac.Filter = "Excel dosyaları(*.xls)|*.xls"; Platform = "x86. Sadece XLS Dosyaları"; } ac.Title = "Platform " + Platform ; ac.ShowDialog(); ExcelYol = ac.FileName.ToString(); return ExcelYol; }
Yukarıdaki kodlarımız Excel dosyası seçme işlemini yapıyor. Bir OpenFileDialog nesnesi tanımlıyoruz.
Environment.Is64BitProcess
Kısmı ile projemizin hangi platformda olduğunu anlıyoruz. Bunun en büyük amacı kafamızın rahat olması. Projeniz x86 da olsa x64 de olsa bu kodun çalışıp çalışmayacağı hakkında bir şüpheniz olmayacak. Projene ekle ve kullan.
OpenFileDialog nesnesinin filter özelliği sayesinde de projemizin platformuna göre hangi dosyayı seçebileceğimi ayarlıyoruz. Dikkat ederseniz “Tüm Dosyalar” filtresini kullanmadım. Bu şekilde kullanıcının sadece uygun olan dosya uzantısını seçmeye zorluyoruz. Bu şekilde olası hataların önüne geçebiliyoruz.
OpenFileDialog nesnesinin title özelliğine de hangi platform ve hangi dosya türünü seçebileceğini bilgi amaçlı gösteriyoruz.
Seçilen excel dosyasının yolunu alıyoruz ve hem class içindeki değişkene atamasını yapıyoruz hemde geri dönüş olarak veriyoruz. Kullanım şekli ise aşağıdaki gibidir.
txt_excel_yolu.Text = Cls.Global.ExcelBaglanOku.ExcelYoluSec();
Teknik olarak buna ihtiyacımız yok. Ancak kullanıcıya seçtiği excel yolunu göstermek istiyorum. O yüzden dosya yolunu bir textbox’a gösteriyorum. Burada
return ac.SafeFileName;
Diyerek textBox’a sadece seçilen excel dosyasının adını da gösterebiliriz. Sonuçta biz, bize önemli olan yolu class içindeki bir değişken aracılığı ile taşıyoruz.
Excel’e Bağlanma ve Okuma
Şimdi de Excel’e bağlanma ve içeriğini okumaya bakalım.
public static DataTable ExcelOku() { DataTable dtexcel = new DataTable(); if (ExcelYol.Trim().Length > 0) { DataTable schemaTable = new DataTable(); string strConn = ""; if (Environment.Is64BitProcess) strConn = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source=" + ExcelYol + "; Extended Properties = \"Excel 12.0; HDR = Yes; IMEX = 0\""; else strConn = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source=" + ExcelYol + "; Extended Properties = \"Excel 8.0; HDR = Yes; IMEX = 0\""; OleDbConnection conn = new OleDbConnection(strConn); conn.Open(); schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); DataRow schemaRow = schemaTable.Rows[0]; string sheet = schemaRow["TABLE_NAME"].ToString(); if (!sheet.EndsWith("_")) { string query = "SELECT * FROM [" + sheet + "]"; OleDbDataAdapter daexcel = new OleDbDataAdapter(query, conn); dtexcel.Locale = CultureInfo.CurrentCulture; daexcel.Fill(dtexcel); } conn.Close(); } else { MessageBox.Show("Okunacak EXCEL dosyası bulunamadı. Lütfen önce okunacak EXCEL dosyası seçin.", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Stop); } return dtexcel; }
Bir datatable tanımladık.
Eğer seçilen excel yolu boş ise excel dosyasının seçilmediğine dair uyarı verdirdik.
Aynı şekilde platforma göre excel’e bağlanmak için uygun olan connection string cümlesini seçtik.
OleDbConnection sınıfı ile de oledb üzerinden excel’e bağlandık.
Excel’deki verilerin olduğu sayfaya göre bir tablo şeması çıkardık ve boş olan datatable’mizi şekillendirdik.
BİLGİ NOTU: OleDbConnection String cümlesindeki HDR = Yes kısmı excelde okuduğumuz sayfanın ilk satırının kolon başlıkları olup olmadığını belirtiyoruz. Yes ise excel sayfasındaki ilk satır kolon başlıklarıdır. No ise kolon başlıkları değildir.
Kullanım şekli de aşağıdaki gibidir.
DataTable dtexcel = Cls.Global.ExcelBaglanOku.ExcelOku();
Burda ben bir datatable’ye eşitledim ancak siz direk olarak bir grid’in datasource özelliğine atayabilirsiniz.
C# Excel OLEDB Bağlantı ve Veri Okuma – Class , dersim da bu kadardı arkadaşlar. Diğer derslerimizde görüşmek üzere.
C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız.
Bu dersin kodlarını derslerime özel olarak hazırladığım Github Projemde bulabilirsiniz…
Takipte ve Sağlıcakla kalın. ;)
Merhabalar, c#’da oleDB kullanmadan excelden veri çekme ve veri aktarma işlerini nasıl yapabiliriz? Hiçbir otomasyon kullanmadan basic haliyle :)
OLEDB kullanmadan Excel ve Access’den veri okuma ve yazma işlemleri yapmak mümkün değildir. En azından ben ne gördüm ne de duydum.
Ayrıca Excel’e veri yazmayı da hiç tavsiye etmiyorum. Veri yazma işlemi olacak ise en azından Access olmalıdır.