C# Excel Format Değiştirme

Herkese merhaba, C# yazılarımıza kaldığımız yerden devam ediyoruz. Bu yazımızda C# ile Excel dosyalarını dönüştürmeyi anlatacağım. Hadi başlayalım !
Excel dosyalarını dönüştürmeden kastım aslında format değiştirme. Örneğin masaüstüne gelip yeni bir Excel dosyası oluşturursanız uzantısı yüklü olan Office sürümüne bağlı olarak .xlsx yada .xls olacaktır. Fakat Excel sadece .xls yada .xlsx dosya uzantılarından ibaret değil. .csv, .xlsm, .xlsb, .xltx, .xltm, .ods gibi birçok uzantısı da bulunmakta, tabi en çok kullanılanları .xlsx ve .xls olduğu için diğerlerini duymamış olabilirsiniz 🙂 Aslında Excel uygulaması bu uzantıların hepsini açabiliyor fakat olurda farklı bir uzantıya yada JSON, HTML, XML gibi dosya türlerine de ihtiyacınız olursa ve bunu C# ile kodlayarak yapmanız gerekiyorsa işte o zaman tür dönüşümü yapmanız gerekecektir.
Benim neredeyse tüm Excel işlemlerimde kullanmış olduğum bir tane kütüphane var, adı IronXL. Bu kütüphane C#’ın kendi kütüphanelerinden değil, 3. parti bir kütüphane ve en sevdiğim yanlarından birisi Excel işlemleri yapabilmek için bilgisayarınızda Excel’in yüklü olması gerekmiyor. Excel’in kendi interop yani kütüphanesini kullanarak bir Excel dosyasında yapabileceğiniz herşeyi yapabilirsiniz fakat projeyi bir başka bilgisayarda çalıştırıp Excel işlemleri yapmak istediğiniz zaman sizin bilgisayarınızda yüklü olan projeye referans olarak eklediğiniz Office sürümünün aynısının o bilgisayarda da olması gerekiyor. Bu yüzden çok aşırı efektif şeyler yapmayacaksanız Excel’in kendi kütüphanesini kullanmayıp IronXL gibi 3. parti kütüphaneler kullanmakta fayda var.
IronXL kütüphanesini kullanabilmek için öncelikle bir tane C# Windows Forms projesi oluşturalım ve kütüphaneyi projemize ekleyelim. 3. parti kütüphaneleri projemize ekleyebilmek için 2 farklı seçeneğimiz bulunmakta. Bunlardan birincisi kütüphane referanslarını (DLL dosyaları yada açık kaynak ise projeyi) Visual Studio üzerinden elle referans olarak göstermek. İkincisi ise paket yöneticilerinden birini kullanmak. Windows Forms projesi yaptığımız için en uygun paket yöneticisi Nuget olacaktır. Nuget, Visual Studio kurulumu ile birlikte gelen ve Visual Studio içerisinde gömülü olarak çalışan terminal komutlarını içeren bir program. Nuget’i kullanabilmek için Visual Studio üzerinden Tools > Library Package Manager > Package Manager Console adımlarını izleyerek açabilirsiniz. Açtıktan sonra Visual Studio’nun alt kısmında bir tane açılacak ve Nuget komutlarını bu alandan girebileceğiz.
Nuget ile projeye bir paket eklemek için install-package paket_adı -Version versiyon_adı komutunu girmemiz yeterli oluyor. Bu komuttaki -Version versiyon_adı kısmı zorunlu değil, yani girmeniz gerekmiyor. Fakat girmeniz durumunda o paketin yazdığın sürümünü indirip projeye ekliyor. Yazmazsanız da paketin son sürümünü indirip proje ekliyor. Biz bu projede IronXL paketini kullanacağız fakat paketin Nuget’teki adı IronXl.Excel olduğu için şu şekilde bir komut girmemiz gerekiyor;
install-package IronXL.Excel
Bu komutun ardından Nuget, IronXL.Excel paketini indirecek ve hem proje ana dizininde packages adında bir klasör oluşturup oraya yerleştirecek ve hemde paket DLL’ini projeye referans olarak ekleyecektir. Aslında Nuget’in güzel yanlarından birisi de bu. Tek komut ile hem paketi indiriyor hemde projeye referans olarak ekliyor. Ayrıca proje ana dizininde bulunan packages klasörünü silseniz ve hatta bin/Debug altındaki paket DLL dosyasını silseniz dahi projeyi bir sonraki açmanızda projeye referans olarak eklenmiş fakat silinmiş paketleri otomatik olarak indirecek ve projeye tekrardan dahil edecektir. Örneğin Github, Gitlab gibi git sistemlerinden indirdiğiniz C# projelerinde Nuget üzerinden projeye dahil edilmiş paketler bulunmaz, yani packages klasörü yoktur fakat projeyi açtığınızda Nuget devreye girer ve eksik olan paketleri indirip projeye ekler. Bu sayede hem projeyi indirdiğiniz git sistemine gereksiz yük binmez, hem paylaşan kişinin kodu daha temiz olur hemde siz projeyi daha küçük boyutlarda indirebilirsiniz. Nuget’ten bu kadar bahsettikten sonra artık kendi işimize bakalım.
IronXL.Excel paketi ile Excel işlemleri yapabilmek için WorkBook adında bir sınıf kullanıyoruz ve bu sınıf Excel’deki booka denk geliyor. Yani aslında Excel’i tutan nesne WorkBook sınıfı. Bu sınıftan yeni bir nesne türetmek için constructor metodu bulunmuyor. Bunun yerine sınıf altındaki static yani bulunduğu sınıfın yeni bir nesnesi türetilmeden ulaşılabilen Load() fonksiyonu kullanılıyor. Bu fonksiyon parametre olarak Excel dosyasının yolunu istiyor ve geriye de WorkBook sınıfından yeni bir nesne döndürüyor.
IronXL.Excel paketi ile Excel dosyasını farklı formatlara dönüştürebilmek için WorkBook sınıfının nesnesi altındaki SaveAs() fonksiyonu kullanılıyor ve bu fonksiyona string tipte dosyanın yeni adını ve yolunu gönderdiğinizde verdiğiniz yola dosyayı yeni uzantısıyla beraber kaydediyor. Elbette arka tarafta yapılan işlem sadece uzantı değiştirmek değil, örneğin uzantısı .xlsx olan bir dosyanın uzantısını .xml yaparsanız o dosya artık bir XML dosyasıdır diyemiyoruz çünkü karakter kodlamaları farklı. .xlsx uzantısındaki bir dosyayı XML formatına çevirmek için .xlsx kodlamasını .xml kodlamasına çevirmeniz gerekiyor. İşte SaveAs() fonksiyonuda bu kodlama çevirmesini yaparak yeni bir dosya oluşturuyor. Fakat SaveAs() fonksiyonu elbette tüm dosya uzantılarını desteklemiyor. Parametre olarak gönderdiğiniz yeni dosya yolunun uzantısı .xls, .xslx, .xlsm, .csv, .tsv, .json yada .xml olmak zorunda. Farklı bir uzantı girerseniz ne yazık ki FormatException hatası alırsınız.
Örneğin formda bulunan bir butona tıklandığında kullanıcıdan dosya seçmesini isteyelim ve seçilen dosyayı JSON olarak kaydettirelim. Bunun için form üzerine bir tane Button ve bir tanede OpenFileDialog ekleyelim. Kullanıcının sadece Excel dosyalarını seçebilmesini sağlayalım. Bunun için Form’un Load eventini açarak (Form üzerine çift tıklayarak yada Form’u seçip Properties ekranından Events kısmına geçip Load satırına çift tıklayarak oluşturabilirsiniz) şu kodları yazalım;
openFileDialog1.Filter = "Excel Dosyaları|*.xlsx;*.xls;*.csv";
Bu kod sayesinde kullanıcı sadece .xlsx, .xls ve .csv uzantısındaki dosyaları seçebilecek, diğer dosyaları seçemeyecektir.
Excel dosyasını dönüştürme işlemi kullanıcı butona tıklayınca olacağı için Button’un Click eventini de oluşturalım (Button üzerine çift tıklayarak yada Button’u seçip Properties ekranında Events kısmına geçip Click satırına çift tıklayarak açabilirsiniz) ve içerisine geçelim. Öncelikle kullanıcının dosyayı seçip seçmediğini anlamamız gerekiyor. Sonuçta önce kullanıcı dönüştürmek istediği dosyayı seçecek sonra biz o dosyayı JSON dosyasına çevireceğiz. Kullanıcı dosya seçmezse bizim herhangi bir şey yapmamıza gerek yok. O yüzden öncelikle kullanıcının dosya seçip seçmediğini anlayalım, dosya seçtiyse dönüştürme işlemini yapalım. Kullanıcı dosyayı OpenFileDialog üzerinden yapacak. OpenFileDialog ekranda popup olarak açılmakta ve dosya seçim alanının altında Tamam ve Iptal diye iki tane de buton bulunmakta ve bu butonlardan herhangi birine tıklandığında geriye DialogResult nesnesi geri döndürmektedir. DialogResult nesnesi Tamam butonuna tıklandığında OK, Iptal’e tıklandığında Cancel olmakta. OpenFileDialog penceresini açtırmak için ise OpenFileDialog nesnesi altında bulunan ShowDialog() fonksiyonu kullanılmakta. Aslında OK yada Cancel olan DialogResult nesnesini bu fonksiyon döndürüyor. ShowDialog() fonksiyonu OpenFileDialog’u tetikleyip işlem sonucunu bekliyor ve işlem yapıldığında (Tamam yada Iptal butonuna basıldığında) ise geriye dönüş yapıyor. İşte bizde ShowDialog() fonksiyonundan geriye dönen değeri kontrol edersek ve OK ise dönüştürme işlemini yaparsak yapmak istediğimiz şeye ulaşmış olacağız. Tabi bu kontrol işlemini if ile yapmamız gerekiyor. if şartına ShowDialog() fonksiyonundan dönen DialogResult nesnesinin OK olup olmadığına bakıp OK ise if bloğu içerisinde Excel dosyasını dönüştürme işlemini yapmamız gerekmekte. Hadi gelin şimdi bu anlattıklarımın kodunu yazalım;
if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
WorkBook.Load(openFileDialog1.FileName).SaveAs("c:/users/kullanıcı/desktop/excel-dönüştürüldü.json");
}
Evet görüldüğü üzere bu kadar anlattığım şey aslında 2 satırda yapılıyor 🙂
Yazdığımız tüm kodları daha toplu ve anlaşılabilir durması için aşağıya bırakıyorum;
void Form1_Load(object sender, EventArgs e)
{
openFileDialog1.Filter = "Excel Files|*.xlsx;*.xls;*.csv";
}
void button1_Click(object sender, EventArgs e)
{
if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
WorkBook.Load(openFileDialog1.FileName).SaveAs("c:/users/kullanıcı/desktop/excel-dönüştürüldü.json");
}
}
Tüm C# yazılarımıza buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.