.Net(c#) – ExcelDataReader ile Excel’den veri okuma

24 May

Merhaba arkadaşlar,
Daha önce sizlere burada Excelden veri okuma işlemini nasıl yapabiliriz anlatmıştım. Burada anlattığım yöntem microsoft office kütüphaneleri ile yapılış yöntemiydi.

Ancak bu yöntem ile projeyi web’te yayınlamak istediğimde şöyle bir hata aldım ‘Exception from HRESULT: 0x80040154’ Bu hatanın sebebi sunucumda office kurulu olmamasıydı. Biraz araştırma sonrasında ExcelDataReader kütüphanesini buldum. Bu kütüphane ile sunucumda office olmadan excelden dosyaları okuyabildim.

Şimdi bu kütüphanenin kullanımına geçelim.
Örnek console uygulaması açıp aşağıda ki örneği yapabilirsiniz. Daha sonra bunu web projelerinizde de aynı şekilde kullanabilirsiniz.

Package Manager Console açın ve şunu yazarak projeye indirin;

Install-Package ExcelDataReader

Daha sonra aşağıda ki console uygulamasını bireberi uygulayıp çalıştırabilirsiniz.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Excel;
using System.Data;

namespace ExcelConverter
{
    class Program
    {
        static void Main(string[] args)
        {
            //Dosyanın okunacağı dizin
            string filePath = @"C:\Users\Semih\Documents\Test.xlsx";

            //Dosyayı okuyacağımı ve gerekli izinlerin ayarlanması.
            FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);
            //Encoding 1252 hatasını engellemek için;

System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

            IExcelDataReader excelReader;
            List liste = new List();
            int counter = 0;

            //Gönderdiğim dosya xls'mi xlsx formatında mı kontrol ediliyor.
            if (Path.GetExtension(filePath).ToUpper() == ".XLS")
            {
                //Reading from a binary Excel file ('97-2003 format; *.xls)
                excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
            }
            else
            {
                //Reading from a OpenXml Excel file (2007 format; *.xlsx)
                excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
            }

            /*yeni sürümlerde bu kaldırıldığı için kapatıldı.
            //Datasete atarken ilk satırın başlık olacağını belirtiyor.
            excelReader.IsFirstRowAsColumnNames = true;
            DataSet result = excelReader.AsDataSet();*/

            //Veriler okunmaya başlıyor.
            while (excelReader.Read())
            {
                counter++;

                //ilk satır başlık olduğu için 2.satırdan okumaya başlıyorum.
                if (counter > 1)
                {
                    liste.Add("Ad =" + excelReader.GetString(0));
                    liste.Add("Soyad =" + excelReader.GetString(1));
                }
            }
            
            //Okuma bitiriliyor.
            excelReader.Close();

            //Veriler ekrana basılıyor.
            foreach (var item in liste)
            {
                Console.WriteLine(item);
            }

            Console.ReadKey();
        }
    }
}

İşlemler bu kadar. Kolay gelsin iyi çalışmalar.

9 Replies to “.Net(c#) – ExcelDataReader ile Excel’den veri okuma

    • Merhaba,
      Kütüphanenin güncel sürümlerinde burası kaldırıldığı için sizde görmüyor. Bu yazıyı yazdığım sene hangi versiyona isitanden yazdığımı hatırlamıyorum fakat güncel şuan ki sürüm 3.6.0’da bu kullanım kaldırılmış. Bu sebeple blogtada burayı commentledim şuan.
      Teşekkürler.

  1. merhaba, emeğinize sağlık. Bir sorum olacak.
    excelReader.GetString(0) dediğinizde ilk satır ve sütundaki veriyi alıyor sanırım. Bunu nasıl çoklayabilirim? Yani benim elimdeki excelde birden çok satır ve sütun var hepsindeki dataları okuyup veritabanıma atmam lazım. GetString(0,5) yada GetString(3,9) gibi for döngüleri ile dönüp dataları almam lazım. Tam anlayamadım o kısmı belkide çok kolay bişey ama göremedim şuan. Yardımcı olabilir misiniz?

    • Merhaba,
      GetString(0) dediği, excel’de ki ilk sütuna denk geliyor. GetString(1),GetString(2),GetString(3) diye gittiğinizde, yan yana devam etmiş oluyorsunuz.
      Counter ile de satırları yönetebilirsiniz.

      Örnek vericek olursak, şöyle bir exceliniz olduğunu varsayalım: Ad, Soyad, Adres, Email.
      10 satır veriniz olduğunu düşünelim. ilk satır başlık sa counter 1den sonra işlem yapmaya başlattınız diye kabul edelim.
      Bu durumda, while içinde GetString(0) == Ad kısmına denk gelir, GetString(1) == Soyad, GetString(2) == Adres, GetString(3) ise Emaile denk gelir.
      Counter her arttığında, bir alt satıra inmiş olursunuz.
      İyi çalışmalar

  2. Merhaba emeğinize sağlık bende sizin yapınızı kullanıyorum ama bir sorum olacak bütün verileri okuduktan sonra satır boş bile olsa okumaya devam ediyor null exception hatası veriyor ne yaptıysam engelleyemedim. verilerin bittiğini nasıl anlayabilirim ?

    • Merhaba,
      Verdiğim örnekte 47.Satırda ki while dögüsü içinde excel satırlarında dönüyoruz. Burada satır kalmadığı zaman while parantezleri dışına çıkıp, 60’ıcı satırda excelReader.Close(); diyerek excel ile işlemi komple bitiriyoruz.
      Yani while döngüsü, satırlarda döndüğümüz kısım. While bittiyse satır bitmiştir, o zaman da excelReader.Close() diyerek excel işlemlerini komple bitirp kapatıyoruz.
      Sizler null exception hatasını while içinde olmayna bir kolonu okumaya çalıştığınzda alıyor olabilirsiniz. Özetle olmayan bir satırda dönmemeli. Debug yapıp kontrol etmenizi tavsiye ederim.

  3. Bilgileriniz için ellerinize sağlık. Fakat çalışma kitabında birden çok sheet olduğunda sheet seçiminş nasıl yaparız.

admin için bir cevap yazınCevabı iptal et