.Net 2.0 - .Net 3.5 ile excel'den veri nasıl alınır?

April 7, 2010 at 7:04 PMoozturk

Merhaba,

Excel'den veri alabilmek için öncelikle proje referanslarına aşağıdaki iki .net kütüphanesini eklememiz gerekiyor.

- Microsoft.Office.Core

- Microsoft.Office.Interop.Excel

Bu iki kütüphaneyi ekledikten sonra artık excel'e ulaşabilir hale gelmiş oluyoruz.

Excel'i çağırmak istediğimiz class'ın olduğu dosyanın başında gerekli namespace'i import edelim.

- using Excel = Microsoft.Office.Interop.Excel;

 

Şimdi mesela bir excel dosyasının içindeki ilk sayfadan veri okumak istiyoruz diyelim. Şöyle bir kod yazmamız yeterli.

 

Excel.Application xlApp;

Excel.Workbook xlWorkBook;

Excel.Worksheet xlWorkSheet;

object misValue = System.Reflection.Missing.Value;

xlApp = new Excel.ApplicationClass();

xlWorkBook = xlApp.Workbooks.Open(@"C:\files\2010.xls", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);

xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

string ProductCode = ((Excel.Range)xlWorkSheet.Cells[1, 1]).Value2.ToString();

 

xlWorkBook.Close(true, misValue, misValue);

xlApp.Quit();

 

 

 

releaseObject(xlWorkSheet);

releaseObject(xlWorkBook);

releaseObject(xlApp);

 

 

Tabii bu kodun çalışabilmesi için bir de releaseObject fonksiyonu lazım, onu da paylaşayım hemen

 

private void releaseObject(object obj)

{

try

   {

       System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);

        obj = null;

    }

catch (Exception ex)

    {

         obj = null;

&n bsp;        MessageBox.Show("Objeyi bırakamıyorum! " + ex.ToString());

     }

finally

     {

         GC.Collect();

      }

}

 

 

Peki, excel ile çalışmak için gerken kod tamam. Ancak derlediniz ve çalışmadığını gördünüz. Sanırım şöyle bir hata alıyorsunuz

 {"Old format or invalid type library. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))"}

Bu hata'nın neden kaynaklandığını da araştırırsanız, sorunun Excel 11.0 kütüphanesinin Culture ayarlarının US olmaması durumunda hata verdiğini öğrenebilirsiniz. Yani Excel kütüphanesinde hata var.

Peki bu hatayı nasıl aşacağız? Çok basit. Excel için çalışacak kodun başına aşağıdaki komutları yazarak, hem bilgisayarımızın Culture ayarının yedeğini alır hem de excel çalışabilsin diye US'e ayarlarız.

 

System.Globalization.CultureInfo oldCI = System.Threading.Thread.CurrentThread.CurrentCulture;

 

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

 

Kodun sonuna ise aşağıdak kodu yazarak tekrar bilgisayarın kendi Culture ayarlarına geri dönebiliriz.

System.Threading.Thread.CurrentThread.CurrentCulture = oldCI;

 

Bu kadar. Eğer dosya adını doğru yazdıysanız ve okumaya çalıştığınız hücrede bir değer varsa alırsınız.

 

 

İyi çalışmalar dilerim!

Posted in: .NET | C# | MS Office

Tags: ,

Silverlight for mobile. Bence işin düzene girdiği yer burası.

August 11, 2009 at 1:15 PMoozturk

Selamlar,

Yaşadığımız dünyada artık onlarca farklı işletim sistemi, farklı farklı platformlar, farklı ebat ve işlevsellikte cihazlar, uygulamalar, vb.. kullanıyoruz. Eh, bu durumdan en çok da biz geliştiriciler etkileniyoruz haliyle. Tarihin bence en büyük sorusu şudur: "Bütün platformları nasıl destekleyeceğiz?".

Şu anda bunu okurken aklınıza "elbette java!" diye bir düşüncenin yoğun olarak bulunduğunu tahmin ediyorum ancak bir sorum var; java ile hem pc hem handheld ortak bir çözüm üretebiliyor muyuz? Ya Adobe flash ile? Hayır. Java'nın da Adobe Flash'ın da mobil ve desktop tecrübesi tamamen farklı kütüphanelerle gerçekliğe kavuşuyor. Oturup ayrı ayrı hazırlamanız gerekiyor, ayrıca her ikisinin de onca olgunlaşmış olmasına rağmen her alanda yoklar ve ayrıca oldukları yerlerde de az evvel belirttiğim gibi farklı hazırlıklar gerektiriyorlar.

Bir cevap doğuyor: Silverlight for mobile. Silverlight'ın kendi sitesi içinde yer alan mobil sayfasında okuduğum üzere, bir cevap doğuyor. Okuduğum kadarıyla öncelikle nokia s60 ve windows mobile için çıkartılacak sürümler mevzu bahis, daha sonra diğer platformlarında hemen peşi sıra geleceğinden çok eminim. Android, vb...

Zaten silverlight şu anda Windows ve Mac kullanıcılarının kullanabildiği bir platform, şimdi Silverlight for mobile ile mobil hayatımıza da giriyor! Peki az evvel haklarında yazdığım java ve flash'ın Silverlight'tan eksiği, burada bunca önemli bulduğum şey nedir? Silverlight ile geliştirdiğimiz uygulamalar direk olarak silverlight mobile ile de çalışacağı iddia ediliyor! Yani biz geliştiriciler istemci tarafında da sunucu tarafında da tek kod yazacağız ve heryerde çalışacak uygulamalara sahip olacağız! İstemci tarafında javascript ile beraber çalışabilecekken, sunucu tarfında istediğimiz şeyi kullanabilecek, istemciden silverlight for mobile ile geliştirdiğimiz uygulamalardan sanki normal bir masaüstü uygulamasından erişir gibi sunucu uygulamalarımıza erişebileceğiz.

Bu kimi işte ihalelere girmeyi sorun olmaktan çıkartacakken, kimi durumda farklı cihaz altyapıları ve farklı işletim sistemleri kullanan daha fazla kullanıcıya erişim anlamına gelecek.

Henüz bir sürüm sunmamış olmalarına rağmen bu iddialı yazı ile geri dönüşü olmayan bir yola girmiş bulunuyor Microsoft. Kesinlikle hiç geç kalmadan bu konuyu araştırmak ve silverlight becerilerimizi geliştirmek lazım.

Posted in: .NET | Silverlight | Silverlight for mobile

Tags: , ,

Asp.Net MVC 1.0 Çıktı!

March 31, 2009 at 3:13 PMoozturk

Microsoft Asp.Net için MVC 1.0 çıktı!

Kurulum için önceki mvc versiyonlarını kaldırmanın yanında .net 3.5 için sp1'e de ihtiyacınız var. Kurulum için sp1 gerekmese de, kullanmak ve sorun yaşamamak için mutlaka sahip olmak gerekiyor. RC2 ile arasında hiçbir fark yok esasen ancak rc2 ile geliştirilmiş uygulamalarda bazı değişiklikler yapılması gerekiyor. Bütün yapmanız gerekenler için http://download.microsoft.com/download/A/6/8/A68968AE-DE1D-4FA4-A98A-B74042C6090D/ASP.NET%20MVC%20-%201.0%20Release%20Notes.doc dosyasını okumanızı tavsiye ederim.

 

İndirmek için microsoft.com sitesine göz atın, ya da buradan indirin (microsoft.com'dan direk link).

Posted in: .NET | ASP.NET | MVC

Tags: ,

XmlTextWriter ile memorystream'den veri okurken "Root element is missing" hatasının sebebi ne olabilir?

December 25, 2008 at 11:03 AMoozturk

Bu hatayı almak için yapılabilecek birkaç kolay hata var. Aşağıda sorunları sıralıyorum.

1. Root element gerçekten yaratılmamış olabilir. Xml dökümanları bir kök ve içinde diğer öğeler ile yazılabilir.

2. Birden çok root element yaratılmış olabilir. 1. seçenekte de belirttiğim gibi xml dökümanları bir tane kök barındırırlar.

3. WriteStartElement ile açılmış olan bir ya da birden fazla öğe WriteEndElement ile sonlandırılmamıştır. Bu da söz dizimi hatasına yol açar. Açılmış olan her öğe daha sonra kapatılmalıdır.

4. XmlTextWriter'ın Load fonksiyonu çağırılmadan önce MemoryStream.Position = 0 komutu çalıştırılmamıştır. Bu komut ile stream içindeki pozisyonumuzu belirlemezsek XmlTextWriter'ımız, nereden başlayacağını bilemeyeceği için, hazırladığımız xml dökümanını alamaz.

Aklıma gelenler bunlar.

Posted in: .NET

Tags: , , , , ,

Abstract Class vs Interface

November 13, 2008 at 2:23 AMoozturk

  Nesne tabanlı programlama (object oriented programming) yaparken, hazırladığımız classlar için base classlar hazarlarız. Bunu yaparken normal class, abstract class, interface kullanırız. Peki hangisi ne işe yarar, hangisini hangi durumlarda kullanmalı?

  Öncelikle abstract class ve interface için şunu söyleyebiliriz; direk olarak değişken yaratamayız bunlardan. Tamamen tanım amaçlı yazıldıkları için, normal class gibi kullanılamazlar. Haliyle eğer değişkene atayıp (instance) kullanmak istiyorsak taban class'ımızı mutlaka bu seçenekler arasından normal class'ı seçmeliyiz.

   Abstract class ile interface karşılaştırması yapmak istersen öncelikle söyleyebileceğimiz bazı farklar var aralarında. Abstract classlar; abstract metodlar (methods), abstract özellikler (properties) gibi diğer üyeleri de barındırabilirler. (Tıpkı normal classlar gibi). Interfaceler ise; Zaten abstract ya da public kelimelerini kullanmamıza gerek kalmadan, içinde tanımladığımız bütün metodları ve özellikleri public ve abstract olarak taşırlar. Yani başka bir şansımız zaten yoktur. Örnek olarak aşağıdaki koda bakalım.

//Abstarct Class

public abstract class Vehicles {

        private int noOfWheel;

        private string color;

        public abstract string Engine {

            get;

            set;

        }

        public abstract void Accelerator();

      }

      //Interface

public interface Vehicles {

        string Engine {

            get;

            set;

        }

        void Accelerator();

      }

  Gördüğümüz gibi abstract classlarda özellikleri ve diğer üyeleri private olarak da tanımlayabildiğimiz gibi aynı zaman da metodları da implemente de edebiliyoruz. Esasen abstract class için gerçek dünyada kullandığmız varlıklar için daha bir tanımlayıcı bakışa sahip olduklarını ancak interfacelerin çok daha tanımlayıcı amaçla kullanıldıklarını söyleyebiliriz. Varlıklar hakkında konuşabileceğimiz iki temel konu vardır. Birincisi maksat, ikincisi ise uygulamadır. Maksat derken buradaki kasıt; durum ve davranıştır, nasıl göründüğü ya da nasıl çalıştığı değil (belki birazcık bilinebilir ama tam denilemez). Uygulama derken de; uygulanırken ki durumu (yani gerçek durumu) ve davranışıdır.

   Biraz teoriden sıyrılıp, bir örnek üzerinden bakalım konuya.

  Bir CMS düşünelim (Content Management System - İçerik Yönetim Sistemi). İçerik; makale, blog ve eleştiriler olsun. Demek ki bu üç farklı şeyin bir ortak noktası var temel olarak o da üçünün de içerik olması. Icerik bizim tabanımız olacak demek ki. Peki Icerik, normal class mı, abstract class mı yoksa interface mi olmalı? Düşündüğümüz iş mantığı (business logic) çerçevesinden bakınca eğer Icerik uygulamanın temel varlığı olmayacak ve kullanılacak bir nesne olmayacaksa - ki bu örnek bu cümleye uyuyor çünkü bu uygulama da temel varlıklar makale, blog ve eleştirilerdir - ; o zaman normal class yapmamalıdır. Geriye abstract class ve interface kalıyor.

  Bu uygulama da her içeriğin yayınlanabilmesi gerekiyor. Haliyle, Icerik tanımının mutlaka içinde bir "yayınla" komutuna ihtiyacı vardır, bu durumda Icerik tanımını mutlaka abstract class olarak yapmak gerekir. Eğer iş mantığımda her içeriğin varsayılan ortak komutu olmasaydı (yayınla komutu mesela), o zaman abstract class'a gerek kalmazdı ve interface de kullanabilrdim. Bunlar normal class, abstract class ve interface arasında seçim yapılacağı zaman en temel farklar oluyorlar. Ama şu gerçeği unutmamak lazım ki, üzerinde konuştuğumuz şey yazılım ve değişmeyen tekşey zaten değişimin ta kendisi. Mesela eğer Icerik tanımını interface olarak yapsaydım, değişiklik yapmam zorlaşırdı. Icerik de yaptığım her değişikliği aynen, Icerikten türettiğim bütün nesnelere yansıtmak zorunda kalacaktım. Bunun üstesinden Icerik'i abstract class olarak tanımlayarak gelebiliyorum ancak unutmamak gereken bir tek durum dışında; çoklu miras (multiple inheritance). Interface ve abstract classları ayıran bir değer fark da CAN-DO (yapabilir) ve IS-A (böyledir) bağlantılarıdır. Az evvel bahsettiğim gibi interface'i çoklu miras için kullanabiliyoruz. Misal olarak bir de kopyalama davranışı veren "ICopy" adında bir interface'imiz olsun ki bu da genelleştirme ve uzmanlaştırma, özelleştirme durumu için bir IS-A bağlantısıdır. Yani türemiş bütün nesneler kendi kopyalama davranışlarına sahip olmak zorunda kalırlar. Eğer makale tanımı; abstract class olan Icerik'ten ve interface olan ICopy'den türerse bu da makale nesnesinin kopyalama yapabildiğini gösterir ki bu da CAN-DO'dur.

  Biraz teorik olarak biraz pratik desteğiyle konuyu derinlemesine anlatmaya çalıştım. Konuyu toparlamak gerekirse; abstract class, temel kimliği tanımlar. Bence abstract class günü kurtarır ve hızlıca devam edebilmeyi sağlar yani interface bence daha dikkatli kullanım ve yavaşlık getirir, gerektirir. Tabi daha önce de belirttiğim gibi interface'in en büyük avantajı ve abstract class'tan farkı çoklu miras (multiple inheritance)'dır.

  İyi çalışmalar dilerim.

Posted in: .NET | C#

Tags: , , , , , ,

C# ile Directx 9 kullanarak video oynatmak ne kadar zor olabilir ki?

July 27, 2008 at 3:49 PMoozturk

DirectX 9 sdk'yı www.microsoft.com sitesinden çektim ve bilgisayarıma kurdum. Yapmam gerektiği gibi c# projemin referanslarına Microsoft.DirectX.AudioVideoPlayback namespace'ini ekledim. Form1 adındaki form'un üstünde panel1 diye bir panel yarattım. Bir video dosyasını denemek için c:\ klasörüne koydum ve oynatmasını istediğim bu dosyayı gösterdim. Start debugging deyince hata alınca dünyam başıma yıkıldı tabii. İnternette ara dur, msdn.microsoft.com'da hatta forumlarda çözüm ara, yok... Olmuyor... Visual Studio 2008 ve .Net 3.5 ile dünyayı baştan yazarım diye düşünüyorken karşılaştığım sorun beni çileden çıkartmaya yetmişken bir de çözüm bulamamak iyice delirtti beni.

Yazdığım kod şuydu:

using Microsoft.DirectX.AudioVideoPlayback;

private void button1_Click(object sender, EventArgs e)

{

try

{

Video v = new Video("c:\\black0.avi");

v.Owner = panel1;

v.Size = panel1.Size;

//v.Size = v.DefaultSize;

//v.Fullscreen = true;

v.Play();

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);

}

}

Bakınca hiç hata görünmüyor halbu ki. Sorunu biraz daha deşince ve önerilen çözümleri beraber deneyince bir çözüm ürettim.

İşletim sistemim 64 bit ama directx kütüphanesinin 32 bit olması yüzünden önce configuration manager'dan bir x86 profili oluşturmam gerekiyormuş. Ama esas konu bu da değil, 'loader lock' hatası alıyordum, release alıp da exe dosyasını çalıştırınca hatasız çalışıyorken debug esnasında hata vermesinin sebebi nedir onu bulmam gerekiyordu. Sorun MDA (Managed Debugging Assistant)'da hata varmış ve microsoft bu hatanın farkında olduğunu ve sorunu gidermek için üzerinde çalışacaklarını duyurmuş. Bu sebeple Debug mensünden Exceptions komutunu çalıştırıp MDA nodundan loader lock seçeneği için thrown işaretini kaldırmam gerekiyormuş. Bunun da sebebi DirectX kütüphanesinin .Net 1.1 runtime versiyonuna sahip olması bu arada.

Sonunda bu şekilde sorunu çözmüş oldum. Visual Studio 2005 veya Visual Studio 2008 ile video ya da audio oynatmak istiyorsanız, sorununuzu bu şekilde çözebilirsiniz.

Not: Oynatacağınız audio ya da video için codeclerin programın çalışacağı bilgisayarda da yüklü olması gerekiyor, DirectX için ise redistributable paketini kuruluma eklemeniz gerekiyor.

Eh ben sorunumu çözdüm, darısı başınıza.

 

Referanslar:

http://www.thezbuffer.com/articles/304.aspx

http://msdn.microsoft.com/tr-tr/directx/default(en-us).aspx

http://msdn.microsoft.com/en-us/library/bb324497(VS.85).aspx#dx_avp_playing_a_video_file

http://msdn.microsoft.com/en-us/library/ms172219.aspx

Posted in: .NET | DirectX

Tags: , , , , , , , ,