Selamlar!
uzun zamandır bişi yazamıyordum. Master, iş, Starcraft2(ki sanırım en büyük suçlu o) derken pek ilgilenemedim. Neyse bugün biraz bi zamanım oldu ve geçenlerde şirkette yazdığım bi programı eklemeye karar verdim.
Şirkette analizini yaptığım ve yürüttüğüm bir proje için (batchte çalışan çoklu poliçelendirme sistemi) excelden xml’e çeviren bir programa ihtiyaç oldu. İş birimi çoklu poliçelendirme işlemi yapılacak kayıtların bilgilerini excel ile göndermek, yazılım ise xml ile almak istiyordu. İki tarafta kendince haklı olduğundan, sorunu araya bir dönüştürücü program yazarak çözmeye karar verdim. Excelden aslında XML üretmek için VBA yazılabiliyor fakat benim denemelerimde bir türlü UTF8 formatında dosya yaratamadım. Bu yüzden C# ile exceli okuyan, exceli istenen formatta xmle çeviren bir program yazdım.
Programın işleyişi oldukça basit : ekrandan Excel dosyasını ve Xml formatında Format dosyasını okutuyorsununuz. Program ilk önce Format dosyasını okuyor(Formatter sınıfı : XmlDocument), bir iki küçük check yapıyor(doğru dosya okundumu diye), daha sonra arka planda excel applicationu açıp, excel dosyasındaki ilgili sheeti DataTable olarak dönüyor.

Sonra bu datatableı, okunan formata göre işleyip bir preview sayfası çıkartıyor. Bu sayfada kullanıcı acaba mappingi doğru yapmışmı, yanlış okunan birşey varmı diye kontrol ediyor. Ayrıca eğer formatta bazı alanlar için özel kurallar girildiyse(zorunlu alan, numeric alan, enum vs.) o checkleri yapıp kullanıcıyı uyarıyor.
Eğer bir sorun yoksa Save As ekranı açıp, exceli istenen formatta Xml’e çeviriyor.

Programın ne yazıkki unit testinglerini yazıcak vaktim olmadı. Zaten çokta kasış bişi olmadığından anlamakta zorluk çekilmeyecektir.
Eklere örnek bir xml ve excel dosyası da ekledim.
Format dosyası ile ilgili aşağıdaki kullanım klavuzunu yazmıştım. Neyin ne işe yaradığını kısaca anlatıyor. Bazı alanlar (DGR alanı gibi) şirkete özel kurallar. O yüzden sizin ihtiyacınız olmayacağından silebilirsiniz.
Format Xml İçeriği
<Format> : Format bölümü ana bölümdür ve bir kez tanımlanır.
- tarih = Formatın düzenlenme tarihi
- baslangicSatir = Excelde hangi satırdan itibaren poliçe kayıtları giriliyor.
- maxSatir = Okunacak en fazla satır // şuan aktif değil
- sheetName = Poliçe listesinin bulunduğu Sayfa ismi
<Alan> : Çıktı XML inde bulunacak bölümlerin listesi. <Alan> node’u iç içe olarak tanımlanabilir. Xml çıktısındaki hiyerarşik yapıyla aynı şekilde tanımlanmalıdır. Node’un Text kısmına eğer var ise Exceldeki kolon ismi yazılmalıdır(A kolonu, B kolonu gibi).
- name = Çıktı Xml’inde node ismi ne olarak yazılacak
- root = Çıktı Xml’inde ana node olduğunu belirtir. Format dosyası içinde bir kere belirtilmelidir.
- bosOlabilir = ilgili alanının Excel dosyasında belirtilmiş kolonda boş olup olamayacağını belirtir. Varsayılan true’dur.
- dgrAlani = ilgili alanın Excel dosyasında DGR/TR olarak hem isim hemde ID tutan bir alan olduğunu belirtir. Dönüştürme esnasında isim kısmı silinip sadece ID kısmı çıktı xmline basılır. Varsayılan false’dur.
- tarihKontrol = ilgili alanın Excel dosyasında tarih (YYYYAAGG) formatında girilmiş olmasını kontrol eder. Varsayılan false’dur.
- enum = İlgili alanın Excelde sadece belirtilmiş kayıtlar arasında girilmiş olup olmadığını kontrol eder. Olası tüm seçenekler | karakteri ile ayrılarak girilmelidir.
- value = value kısmı varsayılan değer olarak kullanılır. Eğer Excel’de ilgili alan boş bırakılmış ise, çıktı xml ine varsayılan değer yazılır.
- requiredAlan = Eğer ilgili alan, çıktı xml’ine sadece altındaki herhangi bir alanın değeri verilmiş ise basılacak ise requiredAlan kısmına, altında boş olmaması gereken alanın ismi yazılır. Örnek olarak Donanım alanı sadece altında bulunan Bedel alanı doldurulmuş ise çıktı xml ine basılacaktır.
Format dosyasının değiştirilmesi :
Durum 1: Excel formatı değiştirilmiş ise
Excel formatında eğer yeni bir kolon eklenmiş veya kolonların sırası değiştirilmiş ise, format dosyasında <Alan> node’unun text kısmında karşılık gelen Kolon Adı kısmı güncellenmelidir. Yani, eğer müşteri numarası artık B kolonunda değil D kolonunda alınacak ise
<Alan bosOlabilir="false">B</Alan>
yerine
<Alan bosOlabilir="false">D</Alan>
olarak güncellenmelidir.
Excel’de kontrolsel değişiklikler (zorunlu alan, tarih alanı vb.) yapıldığında aynı değişikliklerin, kolonun dönüşümünden sorumlu <Alan>’ın attributeleri için tanımlanmalıdır. Örnek olarak, plaka türü artık zorunlu olmayan bir alan olur ise bosOlabilir = değeri true yapılabilir veya varsayılan değeri zaten true olduğu için silinebilir.
Dosyayı İndirmek İçin : Excel2Xml