Herkesin malumu olduğu üzere Windows yüklü bilgisayarların büyük bir yüzdesinde Word ve Excel programları yüklüdür. Bu nedenledir son 15 yıldır Türkiye’de geliştirilen birçok uygulamanın Word ve Excel desteği bulunmaktadır. Çünkü kullanıcıların böyle bir talebi var. Başka bir deyişle C# programlama diliyle uygulama geliştirmek isteyenler C# uygulaması dahilinde Word ve Excel’den nasıl yararlanıldığı konusunda mutlaka bilgi ediniyorlar.
Bu tespitten sonra birisi bilim adamı diğer ikisi programcı olan 3 kişi tarafından kurulan bir cümleyi sizinle paylaşmak istiyorum. Anlamını olduğu gibi bırakıp cümleyi biraz değiştirdiğimi bilmenizi istiyorum:
"İki kaynakta da Excel uygulamasının seçilmiş olması(başka bir programın çağrılırken aynı programın seçilmiş olması) nedeniyle suç işlenmiştir, çalıntı yapılmıştır.” Yani bu cümlede deniliyor ki C# uygulaması dahilinde Excel’den yararlanmayı düşünmek bir buluştur, kimsenin aklına gelebilecek bir işlem değildir. Bu cümlenin benim için öteki bir anlamı daha vardır: Bu cümlenin altında imzası olan kişilerden birisi programcılığı 10 yıl önce yayınlanan kitaplarımı okuyarak öğrenmeye başlamıştır. Bu kişi şimdilerde Ankara'da programcılık yaparak hayatını kazanmaktadır.
Şimdi gelin C# uygulaması dahilinde Excel’den yararlanma buluşunu yapan yerli yazara ve bu yerli yazarın buluşunu onaylayan bilim adamı ve programcılara inat C# uygulaması dahilinde Excel’den nasıl yararlanıldığını cümle aleme ifşa edelim.
C# projeleri dahilinde Excel’in kaynaklarından yararlanarak birçok işlemi kolaylaştırabilirsiniz. Bu amaçla ilk olarak Visual Studio’nun Solution Explorer penceresinden yararlanıp Add Reference diyalog kutusu ekrana getirip Com sekmesinde Microsoft Office 11 Library ve .NET sekmesinde ise Microsoft.Office.Interop.Excel referanslarını projeye dahil etmek gerekiyor.

Projeye dahil edilen bu Library veya referanslar Solution Explorer penceresinde listelenir. Add Reference diyalog kutusunda bu 2 referans projeye dahil edildikten sonra kod dosyasına ilgili namespace’lerdeki Class’lardan yararlanılmak istendiği using deyimiyle aşağıdaki gibi belirtilir.
using Microsoft.Office.Core;
using Microsoft.Office.Interop.Excel;
Bu hazırlıktan sonra üzerinde çalıştığım projenin formuna bir düğme yerleştirdim ve düğmenin Click olayını temsil eden metodunu aşağıdaki gibi düzenledim. Hemen bir uyarıda bulunmak gerekiyor: Hem System.Windows.Forms hem de Microsoft.Office.Interop.Excel adlı namespace’in Application adında bir sınıfı bulunmaktadır. Bu nedenle using bloğunda hem System.Widdows.Forms hem de Microsoft.Office.Interop.Excel’e yer verirseniz sorunlar yaşayabilirsiniz.
private void Excel_penceresi_Click(object sender, EventArgs e)
{
Microsoft.Office.Interop.Excel.Application Excel_uygulamasi;
Excel_uygulamasi = new Microsoft.Office.Interop.Excel.Application();
Excel_uygulamasi.Visible = true;
}
İzninizle biraz tarih: Çalışma tablosu programlarının atası Lotus’tur. Sonra Borland’ın Quatro’su gelir. Değişken adı benzerliği kabahatini işlememek için bu 3 satırlık metotta tanımladığım değişkene veya hazırladığım nesneye “lotus_uygulamasi” adını verdim. Aşağıda verilen kod her ne kadar sıradan olsa kullanım hakkının yerli bir yazara ait olduğu rivayet edilmektedir. Bu yerli yazara kalırsa Microsoft.Office.Interop.Excel’deki Application sınıfının örneğini almak kendi buluşudur.
private void Excel_penceresi_Click(object sender, EventArgs e)
{
Microsoft.Office.Interop.Excel.Application lotus_uygulamasi;
lotus_uygulamasi = new Microsoft.Office.Interop.Excel.Application();
lotus_uygulamasi.Visible = true;
}
Böylece değişken adı benzerliği kabahatinden yırttıktan sonra kodumuz üzerinde biraz duralım. Bu metotta önce “lotus_uygulamasi” adında bir değişken tanımladım. Ardından Excel.Application tipinde bir nesne hazırlayıp bu nesnenin referansını tanımlamış olduğum değişkene aktardım. Bu metodu işletirseniz bildiğiniz Excel penceresi ile karşılaşırsınız.

Bu sırada C# uygulaması dahilinde açılan Excel penceresinin menülerinden yararlanıp mevcut çalışma kitaplarından birisini açabilir veya yeni bir çalışma kitabı hazırlayabilirsiniz. Excel penceresi ekrana geldiği zaman otomatik olarak bir çalışma kitabına sahip olması için hazırlık yapacağım. Excel uygulamasının yani Microsoft.Office.Interop.Excel’deki Application sınıfının Workbooks adında statik bir koleksiyonu var. Add() metodu aşağıdaki gibi kullanıldığı zaman Excel uygulaması bir çalışma kitabına sahip olmaktadır.
private void Excel_penceresi_Click(object sender, EventArgs e)
{
Microsoft.Office.Interop.Excel.Application lotus_uygulamasi;
lotus_uygulamasi = new Microsoft.Office.Interop.Excel.Application();
lotus_uygulamasi.Visible = true;
object sablon=true;
lotus_uygulamasi.Workbooks.Add(sablon);
}
Workbooks koleksiyonuna eleman yani çalışma kitabı eklerken Add() metoduna true sabitini parametre olarak verebilirsiniz. Kodu 1 satır uzatmamın nedeni Add() metodunun parametresinin object tipinde olduğuna dikkatinizi çekmektir. Add() metodunu birden fazla kez kullanırsanız birden fazla Excel penceresi yani birden fazla çalışma kitabı hazırlamış olursunuz. Anlatılan şekilde çalıştırılan Excel’e ait pencere aşağıdaki gibi olmaktadır.

Her ne kadar Excel.Application sınıfının Workbooks koleksiyonuna Add() metodu ile eleman eklendiğinde hazırlanan çalışma kitabında bir tabloya yani Worksheet nesnesine yer verilse bile çalışma kitabında kendiniz 2. veya 3. tabloya yer vermek isteyebilirsiniz. Çalışma kitabında 2. tablo eklemek için yukarıda verdiğim koda ekleme yaptım.
private void Excel_penceresi_Click(object sender, EventArgs e)
{
Microsoft.Office.Interop.Excel.Application lotus_uygulamasi;
lotus_uygulamasi = new Microsoft.Office.Interop.Excel.Application();
lotus_uygulamasi.Visible = true;
object sablon=true;
lotus_uygulamasi.Workbooks.Add(sablon);
object missing = System.Reflection.Missing.Value;
lotus_uygulamasi.Worksheets.Add(missing, missing, missing, missing);
}
Worksheetskoleksiyona eleman yani tablo(worksheet nesnesi) eklerken kullanılan Add() metodu object tipinde 4 parametreye sahiptir. Microsoft’un tercihine uyup object tipinde bir değişken tanımlayıp bu değişken System.Reflection.Missing.Value sabitini aktarıp bu parametrenin yerine kullandım. Add() metodu hakkında net bilgiye sahip olmanız için orijinal yapısını aşağıda verdim.
object Add(In, Optional] object Before,
[In, Optional] object After,
[In, Optional] object Count,
[In, Optional] object Type );
Her ne kadar Add() metodunun orijinal yapısında bütün parametrelerin kullanılması isteğe bağlı denilse bile hepsini en azından yukarıdaki gibi kullanmak zorundayız. Add() metodu yukarıda verilen şekilde kullanıldığında çalışma kitabındaki mevcut tablonun soluna yeni bir tablo yerleştirilir. Yeni tablonun mevcut tablonun soluna yerleştirilmesini istiyorsanız önce referans olarak kullanacağınız Worksheet nesnesini elde edip bunu 2. parametre olarak kullanmanız gerekir. Bu işlemin nasıl yapıldığını aşağıda görebilirsiniz.
object missing = System.Reflection.Missing.Value;
Microsoft.Office.Interop.Excel.Worksheet Tablo;
Tablo = (Worksheet)lotus_uygulamasi.ActiveSheet;
lotus_uygulamasi.Worksheets.Add(missing, Tablo, missing, missing);
Bu kodda System.Reflection.Missing’de bulunan Value tipindeki değişkene ad seçerken Microsoft’un programcılarının tercihine bağlı kalıp missing adını verdim. Eğer madem yazdığım makale Türkçe ve bu değişken Value’nin Türkçe karşılığı deger’i değişken adı olarak kullanmış olsaydım değişken adı çalma suçunu işlemiş olurdum. Çünkü System.Reflection.Missing’de bulunan Value tipindeki değişkene “deger” adını vermek yerli bir yazarın buluşudur.
Sonradan eklediğim 2 satırdan ilkinde Worksheet tipinde bir değişken tanımladım. İkinci satırda ise kendi hazırladığım Excel.Application nesnesinin aktif tablosunu alıp bu değişkene aktardım. Çalışma kitabına Add() metodu ile bir seferde birden fazla tablo eklemek istiyorsanız tablo sayısını aşağıda yapıldığı gibi 3. parametrede belirtmeniz gerekir.
lotus_uygulamasi.Worksheets.Add(missing, Tablo, 2, missing );
Add() metodunun 4. parametresi ile çalışma kitabına eklenecek nesnenin türü seçilmektedir. Çalışma kitabına normal tablo yerine makro tablosu eklemek istiyorsanız 4. parametreyi aşağıdaki gibi düzenlemeniz gerekir.
object tablo_tipi = XlSheetType.xlExcel4MacroSheet;
object missing = System.Reflection.Missing.Value;
lotus_uygulamasi.Worksheets.Add(missing, missing, missing, tablo_tipi);
Excel Tablosuna Bilgi Girmek
Yukarıdaki sayfalarda çalışma kitabı hazırladık, sonra istediğimiz sayıda ve özellikte tabloyu hazırlayıp çalışma kitabına ekledik. Şimdi sırada tablolara bilgi girmek var. Excel.Application nesnesini üzerinde çalıştığım projenin ilk formunu temsil eden Class’ın her yerinde kullanabilmek için lotus_uygulamasi adını verdiğim değişkeni tanımladığım Class bloğuna aldım. Ardından forma 2. bir düğme yerleştirip aşağıda verdiğim kodu hazırladım.
private voidEkle_Click(objectsender, EventArgs e)
{
Microsoft.Office.Interop.Excel.Worksheet Aktif_tablo;
Aktif_tablo = (Worksheet)lotus_uygulamasi.ActiveSheet;
Aktif_tablo.Cells[2, 2] = "Fenerbahçe";
Aktif_tablo.Cells[3, 2] = "Beşiktaş";
Aktif_tablo.Cells[4, 2] = "Galatasaray";
}
Worksheet nesnesi hazırlandıktan sonra 2 boyutlu dizi değişken gibi işlev gören Cells() koleksiyonuna kolayca bilgi aktarılır. Bu örmekte Excel çalışma kitabındaki tabloya bilgileri direk Cells koleksiyonuna aktardım. Excel tablosuna aktarılacak bilgileri DataSet’ten veya başka bir kaynaktan alabilirsiniz.

Aktif tabloyu yukarıda elde edip Worksheet nesnesine aktarırken Excel.Application nesnesinin ActiveSheet özelliğinden yararlandım. Aktif olmayan başka bir tabloya bilgi aktarmak istiyorsanız ActiveSheet yerine Sheets koleksiyonundan yararlanmanız gerekir. Aşağıda verilen kod işletildiğinde aynı bilgiler çalışma kitabındaki 2. tabloya aktarılır.
private voidEkle_Click(objectsender, EventArgs e)
{
Microsoft.Office.Interop.Excel.Worksheet Aktif_tablo;
Aktif_tablo = (Worksheet)lotus_uygulamasi.Application.Sheets[2];
Aktif_tablo.Cells[2, 2] = "Fenerbahçe";
Aktif_tablo.Cells[3, 2] = "Beşiktaş";
Aktif_tablo.Cells[4, 2] = "Galatasaray";
}
Excel Çalışma Kitaplarını Açmak
Yukarıdaki sayfalarda kendimiz Excel çalışma kitabı hazırlayıp tablo ekledik ve bu tabloya bilgi girdik. Şimdi ise mevcut bir Excel çalışma kitabı dosyasını, yani XLS uzantılı bir dosyayı C# uygulaması dahilinde açacağız. İlk olarak Open() metodunun orijinal yapısını size vereceğim.
Workbook Open([In] string Filename,
[In, Optional] object UpdateLinks,
[In, Optional] object ReadOnly,
[In, Optional] object Format,
[In, Optional] object Password,
[In, Optional] object WriteResPassword,
[In, Optional] object IgnoreReadOnlyRecommended,
[In, Optional] object Origin,
[In, Optional] object Delimiter,
[In, Optional] object Editable,
[In, Optional] object Notify,
[In, Optional] object Converter,
[In, Optional] object AddToMru,
[In, Optional] object Local,
[In, Optional] object CorruptLoad);
Gördüğünüz gibi Open() metodu ilki hariç diğerleri isteğe bağlı olan toplam 15 parametreye sahiptir. Bu makalede Open() metodunun bütün parametrelerinden söz edemeyeceğiz. Open metodunun nasıl kullanıldığını anlatmak için forma bir OpenFileDialog nesnesi yerleştirip aşağıda verdiğim kodu yazdım. Bu kez cesur davranıp Excel.Application nesnesi için tanımladığım değişkene “Excel_uygulamasi” adını verdim.
private void kitap_ac_Click(object sender, EventArgs e)
{
openFileDialog1.ShowDialog();
string Dosya = openFileDialog1.FileName;
object missing = System.Reflection.Missing.Value;
Microsoft.Office.Interop.Excel.Application Excel_uygulamasi;
Excel_uygulamasi = new Microsoft.Office.Interop.Excel.Application();
Excel_uygulamasi.Workbooks.Open(Dosya, missing, missing, missing,
missing,missing, missing, missing,missing,
missing, missing, missing, missing, missing,missing);
Excel_uygulamasi.Visible = true;
}
Excel Çalışma Kitabındaki Tabloların Adını Öğrenmek
Şimdi kod yazılarak açılan çalışma kitabındaki tabloların adlarını öğrenip bir ListBox’a aktaracağım. Bu amaçla forma listele adında bir Button yerleştirip verilen kodu yazdım. Excel çalışma kitabındaki tabloların adlarını öğrenmek için Sheets tipinde bir koleksiyon hazırladım. Devamında bu koleksiyonun Count özelliğine bakıp eleman sayısını öğrendim.
private void listele_Click(object sender, EventArgs e)
{
openFileDialog1.ShowDialog();
string Dosya = openFileDialog1.FileName;
Microsoft.Office.Interop.Excel.Application Excel_uygulamasi;
Excel_uygulamasi = new Microsoft.Office.Interop.Excel.Application();
Excel_uygulamasi.Workbooks.Open(Dosya, missing, missing, missing,
missing,missing, missing, missing,missing,
missing, missing, missing, missing, missing,missing);
Sheets Tablolar = Excel_uygulamasi.Worksheets;
for(int i=1; i<Tablolar.Count; i++)
{
Worksheet Tablo = (Worksheet)Tablolar.get_Item(i);
listBox1.Items.Add(Tablo.Name.ToString());
}
}
“Tablolar” adını verdiğim Sheets koleksiyonun elemanlarını tek tek elde etmek için “Tablo” adını verdiğim Worksheet nesnesi hazırladım. Worksheet nesnesini hazırlarken Sheets sınıfının Get_Item() metodunu kullandım. Bu metot ilgili tablonun sıra numarasını parametre olarak almaktadır.
Excel Çalışma Kitabından Veri Okumak
C# projesi dahilinde açılan Excel çalışma kitaplarından kolay bir şekilde verileri okuyup kullanabilirsiniz. Bu işlemin nasıl yapıldığını anlatmak için ilgili çalışma kitabındaki ilk tablonun ilk 3 sütunun ilk 5 satırının içeriğini elde edip forma yerleştirdiğim ListBox’lara aktaracağım. Forma 3 ListBox yerleştirdikten sonra aşağıda verdiğim kodu hazırladım.
private void Excel_penceresi_Click(object sender, EventArgs e)
{
openFileDialog1.ShowDialog();
string Dosya = openFileDialog1.FileName;
Microsoft.Office.Interop.Excel.Application Excel_uygulamasi;
Excel_uygulamasi = new Microsoft.Office.Interop.Excel.Application();
Excel_uygulamasi.Workbooks.Open(Dosya, 0, false, 1,"", "", false,
Microsoft.Office.Interop.Excel.XlPlatform.xlWindows,
"", true, false, 0, true, false, false);
Sheets Tablolar = Excel_uygulamasi.Worksheets;
Worksheet Tablo = (Worksheet)Tablolar.get_Item(1);
for (int i=1; i<=5; i++)
{
Range erim = Tablo.get_Range("A" + i.ToString(), "C" + i.ToString());
Array dizi = (Array)erim.Cells.Value2;
if (dizi.GetValue(1, 1) != null)
{
string str1 = dizi.GetValue(1, 1).ToString();
string str2 = dizi.GetValue(1, 2).ToString();
string str3 = dizi.GetValue(1, 3).ToString();
listBox1.Items.Add(str1);
listBox2.Items.Add(str2);
listBox3.Items.Add(str3);
}
}
Excel_uygulamasi.Quit();
}
Bu kodun kalın yapılmış kısmında Excel çalışma kitabının ilk tablosunu elde ettikten sonra 5 turluk bir döngü hazırladım. Çünkü ilk tablonun ilk 5 satırı ile ilgilendiğimi söylemiştim. Döngünün her turunda Range nesnesi hazırladım. Tablonun ilk 3 sütunu ile ilgilendiğim için Range nesnesini hazırlarken ilk kısmına “A” sütununu, 2. kısmına ise C’yi ekledim. Range nesnesinin Cells koleksiyonun elemanlarını 2 boyutlu dizi değişkenine aktarmak için Value2 özelliğinden yararlandım. Devamında ise dizi değişkenin elemanlarını GetValue() metodu ile okuyup ListBox’lara aktardım.
* Meraklısı İçin Notlar
Bu makalede C# uygulaması dahilinde Excel'le yapılabilinecek işlemlerin çok azından söz ettik. Sanmayınız ki yerli C# kitaplarında bu konuda daha ayrıntılı bilgi var.