C# Excel to Datatable

Posted on Åžubat 20th, 2009 in C# by Hhuso

Mükemmel bir olay bence. Excel belgesini veri tabanı olarak kullanabiliyoruz. Performans açısından araştırmadım fakat az ve sık güncellenen datalar için excel belgesi kullanılabilir. Benim senaryom fazla firmanın bulunmadığı bir excel dökümanını grid view e aktarıp kullanıcıya gösterilmesiydi. Aşağıdaki kodlarla bunu başarabildim.

    public DataTable ExcelDatatoDataTable(string WorkSheetName)
    {
        OleDbConnection con = new OleDbConnection(”Data Source=” + System.Web.HttpContext.Current.Server.MapPath(”/YellowPage/BIESariSayfalar.xls”) + “;Provider=Microsoft.jet.OLEDB.4.0;Extended Properties=Excel 8.0;”);
        OleDbCommand com = new OleDbCommand(”SELECT * FROM [" + WorkSheetName + "$]“, con);
        if (con.State == ConnectionState.Closed)
            con.Open();
        OleDbDataReader dr = com.ExecuteReader();
        DataTable dt = new DataTable();
        dt.Load(dr);
        return dt;
    }

“System.Web.HttpContext.Current.Server.MapPath” kod kısmı ile dosyamın yolunu belirtirken root dan baÅŸlamasını istedim. Class içerisinde olduÄŸum için bunu kullandım. EÄŸer ki class içinde olmasaydım “Server.MapPath” kod parçacığı iÅŸimi görecekti.

Bir class içine bu metodu yazdım. Metodu çağırırken bir string istedim. Stringe excel dökümanındaki worksheet ismini atadım. Daha sonra sorgumu çalıştırdım. Dönen datatable gridview de data source oldu.

Kaynak : http://www.yazgelistir.com/Makaleler/1000002045.ygpx

Yazıya Ek : 23.02.2009

SqlBulkCopy sınıfı ile veri taşıma(Excel to SQL Database)

Excel’de bulunan verilerimizi zaman zaman SQL Server’a taşımak isteyebiliriz.Bu iÅŸlemi hızlı ve güvenli bir ÅŸekilde yapmak için kullanacağımız class SqlBulkCopy sınıfıdır.Örnek üzerinden devam edecek olursak bir excel dosyamız var programımızda yüklenirken bu excel’deki bilgiler dataGridView’da listelenecek.Excel -> SQL butonuna basıldığında ise excel’de bulunan verileri SQL server’da oluÅŸturmuÅŸ olduÄŸumuz tabloya aktaracağız.

İlk olarak excel dosyamızı oluşturacak olursak.Yapı aşağıdaki gibidir;

1 numaralı satırda tablomuzun alanlarını belirtiyoruz.Burada 4 adet alan bulunmaktadır.Verilerimizi girdikten sonra bu tüm alanları seçip Ad Kutusu diye adlandırılan alan yani Calisanlar dediÄŸimizi alana bu seçmiÅŸ olduÄŸumuz tablo adını girmemiz gerekiyor.Biz örneÄŸimizce Calisanlar diyip Enter’a bastık.Artık elimizde 4 alanlı Calisanlar isminde Excel’de bulunan bir tablomuz var.

Burada bulunan bilgileri SQL Server’a aktaracağımızda orada da buradaki ile aynı yapıya sahip bir tablo oluÅŸturmamız gerekiyor. Excel’de oluÅŸturduÄŸumuz ÅŸekilde birbirine denk gelmesi için aynı tablo yapısını oluÅŸturuyoruz.

Artık Excel tablomuza karşılık gelen  SQL Server’da bir tablo bulunmaktadır. Åžimdi bizim yapacağımız bu excel’deki verileri oluÅŸturmuÅŸ olduÄŸumuz  Sql Server’a taşımak.ÖrneÄŸimizin arayüzü aÅŸağıdaki gibidir ;

Excel -> SQL butonuna basıldığında dataGrid’de gözüken bilgiler oluÅŸturmuÅŸ olduÄŸumuz SQL tablomuza gidecektir !

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Data.SqlClient;

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

        //form yüklendiÄŸinde excel dosyasına baÄŸlanıp bilgileri okuduktan sonra dataGridView’da listeliyoruz.
        void ExcelDosyaOku()
        {
            OleDbConnection con = new OleDbConnection(@”Provider = Microsoft.Jet.OleDb.4.0 ; Data Source = C:\CalisanlarExcel.xls ; Extended Properties = Excel 8.0″);
          �
            //excel dosyasını oluşturup tüm alanları seçtikten sonra vermiş olduğumuz isimi yani Calisanlar bilgisini burada sorgumuzda belirtiyoruz.
            OleDbCommand cmd = new OleDbCommand(”select * from Calisanlar”, con);
            OleDbDataAdapter da = new OleDbDataAdapter(cmd.CommandText, con.ConnectionString);
            DataTable dt = new DataTable();
            da.Fill(dt);
            dataGridView1.DataSource = dt;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //yukarıdaki listeleme metodunu çağırıyoruz.
            ExcelDosyaOku();
        }

        //Excel’deki verileri SQL’e taşıyacak olan iÅŸlemler
        private void btnBilgileriTasi_Click(object sender, EventArgs e)
        {
            //Excel dosya bilgileri için bağlantı,command ve dataReader nesnelerini oluşturuyoruz.Tüm bilgileri okuyup OleDbDataReader nesnemize atıyoruz.
            OleDbConnection conExcel = new OleDbConnection(@”Provider = Microsoft.Jet.OLEDB.4.0 ; Data source= C:\CalisanlarExcel.xls ; Extended Properties = Excel 8.0″);
            OleDbCommand cmdExcel = new OleDbCommand(”Select * from Calisanlar”, conExcel);
            conExcel.Open();
            OleDbDataReader dr = cmdExcel.ExecuteReader();
          �
            //sql tablo bilgileri
            SqlConnection conSQL = new SqlConnection(”data source=. ; database=Calisanlar; integrated security=true“);
            //taşıma işlemini yapacak olan nesnemiz.Parametre olarak kopyalanacak olan hedefin connection bilgilerini veriyoruz.
            SqlBulkCopy sbc = new SqlBulkCopy(conSQL);

            //Sql’e taşınacak olan tablonun adı . Server’da oluÅŸturduÄŸumuz tablo adı
            sbc.DestinationTableName = “CalisanlarTablo”;

            //SqlBulkCopy nesnesine excel ve sql server tablolarını birbirine eÅŸitlememiz için SqlBulkCopyColumnMapping sıfınından oluÅŸturduÄŸumuz nesneye parametre olarak ilk alana kaynak tablo adını ikinci parametre olarakte hedef tablo adını verip daha sonra SqlBulkCopy sıfından oluÅŸturmuÅŸ olduÄŸumuz sbc nesnesinin  ColumnMappings ‘i ile add diyip eklemek için tanımladığımız SqlBulkCopyColumnMapping nesnesini veriyoruz.Uzun bir yoldur.
            SqlBulkCopyColumnMapping sbccm = new SqlBulkCopyColumnMapping(”ID”, “id”);
            sbc.ColumnMappings.Add(sbccm);

            //yukarıdaki uzun yolu kullanmak yerine bu yolu kullanarak direk Add diyip ilk parametreye kaynak tablo adını ikinci parametreye de hedef yani taşınacak olan tablo adını vererek tabloları belirleyebiliriz.
            sbc.ColumnMappings.Add(”Ad”, “ad”);
            sbc.ColumnMappings.Add(”Soyad”, “soyad”);
            sbc.ColumnMappings.Add(”Cinsiyet”, “cinsiyet”);

            //Bu işlemleri yapmamız için hedef tablo bağlantımız yani SQL bağlantımızı açıyoruz.
            conSQL.Open();

            //SqlBulkCopy nesnemizin WriteToServer metodu yukarıda ki excel’de bulunan verileri barındıran OleDbDataReader türündeki dr isimli nesneyi parametre vererek sql’e excel’den okuduÄŸu verileri yazmasını saÄŸlıyoruz.
            sbc.WriteToServer(dr);

            //yazma iÅŸlemi tamamlandığında OleDbDataReader,SqlBulkCopy, Excel dosya connection’unu ve sql baÄŸlantılarını kaptarak iÅŸlemimiz tamamlıyoruz.
            dr.Close();
            sbc.Close();
            conExcel.Close();
            conSQL.Close();
        }
    }
}

Sql tablomuza sorgu atarak sonuca bakacak olursakta Excel tablosunda bulunan tüm bilgilerin SQL Server’da oluÅŸturduÄŸumuz tabloya aktarıldığı görülüyor.

SqlBulkCopy örneğini indir

Faydalı olması dileğiyle iyi çalışmalar herkese :)

Serhat TAÅž

Kaynak : http://www.serhattas.net/post/2009/01/01/SqlBulkCopy-sc4b1nc4b1fc4b1-ile-veri-tasc4b1ma.aspx

Post a comment