30 Ekim 2013 Çarşamba

C# ile Excel Çalışmak

Bu makalede projelerimizde Excel'i nasıl kullanacağımız işleyeceğiz. Veritabanı uygulamalarında, verilerimizi Excel'e aktararak çıktı alma, raporlama vs işlemlerinde Excel'i kullanabiliriz. Excel'i projelerimizde kullanabilmemiz için öncelikle gerekli Library'i import etmemiz gerekmektedir. Bir tane Windows Application açıp, proje ismine sağ tıklayarak Add Reference seçeneğini tıklayınız. Açılan iletişim kutusunda COM sekmesine geçip Excel Object Library seçeneğini seçip projenize ekleyin. Uygulamamızda Excel dosyası oluşturup, üzerinde işlemler yapacağız. Aşağıdaki gibi bir form tasarlayın.

1.Şekil: Form tasarımı.
Öncelikle veritabanımızdaki Users tablosundaki verileri DataGridView'de görüntüleyeceğiz. Sonra bu değerleri bir diziye aktaracak ve "Excel'e Aktar" butonuna tıkladığımızda bu dizi ile verileri Excel'e aktaracağız. Öncelikle aşağıdaki tanımlamaları yapın.
string[,] dizi;
string[] Cname;
int satir, sutun;
Microsoft.Office.Interop.Excel.Application yeni = new Microsoft.Office.Interop.Excel.Application();
"dizi" isimli iki boyutlu dizimizi DataSet'teki bilgileri tutmada kullanacağız. "Cname" adlı diziyi ise DataSet'teki tablonun sutun adlarını tutmada kullanacağız. Excel'e aktarırken ilk satır olarak sütun isimlerini aktaracak sonra bir satır boşluk bırakıp verileri ekleyeceğiz. "satir" ve "sutun" değişkenleri DataSet'teki tablonun satır ve sütun sayılarını tutmaktadır. Verileri "dizi" isimli iki boyutlu diziye aktarırken bu değerleri kullanacağız. Sonraki tanımlamamızda ise bir Excel dosyası tanımladık. Şimdi formumuzun Load olayına aşağıdaki kodları yazalım.
private void Form1_Load(object sender, EventArgs e)
{
SqlConnection baglan = new SqlConnection("server=localhost;database=bm;integrated security=sspi");
SqlDataAdapter verial = new SqlDataAdapter("select UserName,Password from users",baglan);
DataSet ds = new DataSet();
verial.Fill(ds);
satir=ds.Tables[0].Rows.Count;
sutun = ds.Tables[0].Columns.Count;
dizi= new string[satir,sutun];
for (int i = 0; i < satir; i++)
{
for (int j = 0; j < sutun; j++)
{
dizi[i,j]=Convert.ToString(ds.Tables[0].Rows[i][j]);
}
}
Cname = new string[sutun];
for (int k = 0; k < sutun; k++)
{
Cname[k] = ds.Tables[0].Columns[k].ColumnName.ToString();
}
dataGridView1.DataSource = ds.Tables[0];
}
Veritabanında Users tablosundaki verileri çektik. Verileri iki for döngüsü kullanarak "dizi" isimli iki boyutlu dizimize aktardık. Bir for döngüsü kullanarak sütun isimlerini de elde ettik. Son olarak verileri DataGridView'de görüntüledik. Şimdi verileri Excel'e aktarmaya geldi. "Excel'e Aktar" butonunun Click olayına aşağıdaki kodları yazın.
private void button1_Click(object sender, EventArgs e)
{
yeni.Application.Workbooks.Add(true);
yeni.Visible = true;
Microsoft.Office.Interop.Excel.Worksheet sayfa =(Microsoft.Office.Interop.Excel.Worksheet) yeni.ActiveSheet;
sayfa.Name = "Users";
for (int k = 1; k <= sutun; k++)
{
sayfa.Cells[1, k] = Cname[k-1].ToString();
sayfa.Cells[2, k] = " ";
}
for (int i = 0; i <satir; i++)
{
int sat=i+3;
for (int j = 0; j <sutun; j++)
{
int sut=j+1;
sayfa.Cells[sat,sut]=dizi[i,j].ToString();
}
}
}
"yeni" adlı Excel uygulamamıza bir çalışma sayfası ekledik ve Excel uygulamasını görünür yaptık. Bu haliyle uygulamayı çalıştırıp butona tıklarsanız boş bir excel sayfası açılacaktır. Click olayında üçüncü satırda bir çalışma sayfası tanımladık ve excel uygulamasında aktif olan çalışma sayfasını üzerinde işlem yapmak için bu değişkene atadık. Öncelikle Worksheet nesnesinin Name özelliğini kullanarak çalışma sayfamıza bir isim verdik. Varsayılan olarak bu değer "Sayfa1" değerindedir. Excel satırları 1 indexinden başlar. Bildiğiniz gibi diziler 0 indexinden başlar. Bunu göz önüne alarak for döngüsünü kuruyor ve sütun isimlerini ilk satıra ekliyoruz. "sayfa.Cells[1, k] = Cname[k-1].ToString();" kod satırında, birinci satırın k'inci sütununa Cname dizimizin (k-1)'inci elemanını atadık. Sonra ikinci satırı "sayfa.Cells[2, k] = " "; " ifadesi ile boş bıraktık. Şimdi verilerimizi eklemeye geçebiliriz. Hatırlar isek excel sayfamızda ilk satıra sütun isimlerini eklemiştik. İkinci satırı boş bıraktık. Verileri eklemeye üçüncü satırdan itibaren başlayacağız. Excel'de eklenecek satır numarasını belirlerken bunu dikkate alıyoruz. Bu nedenle ekleme yapılacak satır sayısını "int sat=i+3" şeklinde tanımladık. Ekleme yapılacak sütun sayısını ise "int sut=j+1" şeklinde tanımladık. Bunun nedeni daha öncede ifade ettiğimiz gibi excel satırlarının 1 değerinden itibaren indexlenmesidir. Uygulamamızı şimdi çalıştırabiliriz. Veriler görüldüğü gibi DataGridView'de görüntülenmektedir. "Excel'e Aktar" butonunu tıkladığımızda, bir excel uygulaması başlatılacak ve veriler excel'e aktarılacaktır. Benim uygulamamda görüntü aşağıdaki gibidir.

2.Şekil: Uygulamanın çalışması
Son olarak formumuzu kapattığımızda excel uygulamamızda kapansın. Bunun için formun FormClosed olayına aşağıdaki kodu yazın.
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
yeni.ActiveWindow.Close(null,null,null);
}
Excel'e veri gönderdikten sonra almamak olmaz sanırım. Verileri aktardığımız Excel dosyasını C:\ sürücüsüne Kitap1.xls olarak kaydedelim. Şimdi de excel'den veri alalım. Bunun için öncelikle kaydettiğimiz excel dosyasını açalım. Verilerin kayıtlı olduğu hücreleri seçelim. Benim, uygulamamda yukarıdaki resimde görüldüğü gibi A1-B14 arası hücreleri seçmem gerekiyor. Seçme işlemini gerçekleştirdikten sonra excel menülerinden Ekle/Ad/Tanımla seçeneğini tıklayalım. Çıkan iletişim kutusunda oluşturulacak tablomuza bir isim verelim. Ben "users" ismini verdim. İlk satırdaki veriler sütun başlıkları olarak alınır. Böylece seçtiğimiz hücreleri bir tablo olarak tanımladık. Şimdi bir tane daha buton ekleyelim uygulamamıza ve Click olayına aşağıdaki kodları yazalım. Öncelikle projemize System.Data.Odbc isim alanını eklememiz gerekir.
private void button2_Click(object sender, EventArgs e)
{
dataGridView1.DataSource = " ";
OdbcConnection baglan = new OdbcConnection("Dsn=Excel Dosyaları;dbq=C:\\Kitap1.xls;defaultdir=C:;driverid=790;maxbuffersize=2048;pagetimeout=5");
OdbcDataAdapter da = new OdbcDataAdapter("select * from users", baglan);
DataSet ds = new DataSet();
da.Fill(ds);
dataGridView1.DataSource = ds.Tables[0];
}
Görüldüğü gibi ConnectionString dışında diğer veritabanı işlemlerinden bir farkı yok. Formumuz açıldığında Sql Server'daki "Users" tablosunda veriler yüklenecektir. "Excel'e Aktar" butonuna tıkladığımızda veriler excel'e aktarılacaktır. "Excel'den Al" butonuna tıkladığımızda Odbc nesneleri kullanılarak belirtilen konumdaki excel dosyasından veriler çekilir. Odbc kullanmak karışık geldiyse aynı işlemi OleDb nesneleri ile de yapabildiğimizi belirtmek isterim. Access veritabanına bağlanıyor gibi excel'e bağlanabiliriz. Ancak ConnectionString'te ufak bir değişiklik yapmamız gerekiyor. Data Source belirttikten sonra "Extended Properties=Excel 5.0" ifadesinide ConnectionStringe eklememiz gerekmektedir(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\Kitap1.xls; Extended Properties=Excel 5.0). Gerisi bildiğimiz veritabanı işlemleri.

Hiç yorum yok:

Yorum Gönder