Excel versiyon problemi

Katılım
31 Ağustos 2007
Mesajlar
2
Excel Vers. ve Dili
2003 tr
Geliştirmiş olduğum c# programından Excel'e veri export ediyorum. Eğer geliştirme yaptığım makinede ofis 2003 kurulu ise, referans olarak excel'i import ederken Microsoft Excel 11.0 Object Library import ediliyor. Makinede ofis 2007 kurulu ise Microsoft Excel 12.0 Object Library import ediliyor. Daha sonra üzerinde ofis 2003 kurulu makinede derlenmiş programı 2007 kuruluda çalıştırmak istediğimde problem yaşıyorum.

Tüm excel versiyonları için ortak olarak kullanılabilecek bie dll mevcut mu? Ya da bu problemi başka türlü nasıl aşabilirim?
 

Levent Menteşoğlu

Administrator
Yönetici
Admin
Katılım
13 Ekim 2004
Mesajlar
16,057
Excel Vers. ve Dili
Excel 2010-32 bit-Türkçe
Excel 365 -32 bit-Türkçe
Geliştirmiş olduğum c# programından Excel'e veri export ediyorum. Eğer geliştirme yaptığım makinede ofis 2003 kurulu ise, referans olarak excel'i import ederken Microsoft Excel 11.0 Object Library import ediliyor. Makinede ofis 2007 kurulu ise Microsoft Excel 12.0 Object Library import ediliyor. Daha sonra üzerinde ofis 2003 kurulu makinede derlenmiş programı 2007 kuruluda çalıştırmak istediğimde problem yaşıyorum.

Tüm excel versiyonları için ortak olarak kullanılabilecek bie dll mevcut mu? Ya da bu problemi başka türlü nasıl aşabilirim?
Benim bildiğim ortak bir dll yok, ancak sorun yukarıda belirttiğinizin tam tersi durumunda olması gerekir gibi geliyor bana. Yani 2007 de derlenmiş bir program 2003te problem oluşturabilir. Buda 2007 de dosyanın farklı bir uzantı ile kaydedilmesinden kaynaklanıyor.
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Referans ekleyerek yaptığınızda, eklediğiniz referansı diğer PC'de bulamazsa bu tip bir problem yaşayabilirsiniz.

Bence, C#' da önce bir Excel nesnesini oluşturun ve daha sonra devam edin.

VBA veya VB platformlarında bu iş CreateObject(......) ile yapılıyor. C#'ın kendisi de nesneye yönelik bir dil olduğu için bu şekilde yapabilirsiniz diye düşünüyorum.

Örneğin, Excel VBA ile bir Word nesnesi oluşturmak için;

Kod:
Set WdApp = CreateObject("Word.Application")
kullanılır.
 
Katılım
31 Ağustos 2007
Mesajlar
2
Excel Vers. ve Dili
2003 tr
using Excel;
.
.
.
private void btnExcel_Click(object sender, EventArgs e)
{
Excel.Application ExcelApp;
Excel._Workbook ExcelWorkbook;
Excel._Worksheet ExcelWorkSheet;

ExcelApp = new Excel.Application();
ExcelWorkbook = (Excel._Workbook)(ExcelApp.Workbooks.Add(true));
ExcelWorkSheet = (Excel._Worksheet)ExcelWorkbook.Sheets["Sayfa1"];
ExcelWorkSheet.Name = "Rapor";
...
}

burada Excel namespace'sini kullanabilmek için öncelikle referanslar kısmından Microsoft Excel 11.0 Object Library'i ekliyorum. Zeten referans eklemeden Excel application oluşturulamaz diye düşünüyorum. Sorunda bu noktada başlıyor. Microsoft Excel 11.0 Object Library'i eklediğimde ofis 2007 kurulu makinada application oluşturulamazken, ofis 2007 kurulu bir makinada Microsoft Excel 12.0 Object Library'i import edip programı derlediğimde bu kez 2003 kurulu makinada application oluşturulamıyor. Çünkü her iki makinada da aradığı dll'i aradığı konumda bulamıyor.

dolayısıyla cevabını bulmak istediğim soru bu işlemi her hangi bir referans belirtmeden yapıp yapamayacağım ya da her iki versiyon içinde geçerli olacak bir referansın mevcut olup olmadığı.

:dusun:
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
.......
dolayısıyla cevabını bulmak istediğim soru bu işlemi her hangi bir referans belirtmeden yapıp yapamayacağım ya da her iki versiyon içinde geçerli olacak bir referansın mevcut olup olmadığı.

:dusun:
Anlatmaya çalıştığım da bu işte.

C# dilinde nasıl olur bilmiyorum ama, VBA veya VB' de referans vermek yerine CreateObject komutuyla bir nesne oluşturabiliyorsunuz ve bu kodla oluşturulan nesne, her bilgisayarda her türlü Excel versiyonunda çalışır.

Esasında sizin, sorunuzu Excel forumlarında değil de C# forumlarında aramanız gerekir.

Belki aşağıdaki linkten yardım alabilirsiniz;

http://www.csharpnedir.com/forum2/

http://www.csharpnedir.com/forum2/search_results_posts.asp?SearchID=20070901121639&KW=excel
 
Katılım
29 Eylül 2006
Mesajlar
2
Excel Vers. ve Dili
Excel-2000
C# uygulamanizdan degisik versiyonlardaki excel'e yaptiginiz baglantinin calismamasi ile ilgili asagida bir link var:

http://msdn2.microsoft.com/en-us/library/ms139836.aspx

Bununla birlikte Excel'de de C# uygulamasina eklediginiz System.Data.OleDB namespace'i ile SQL sorgularininin calistirilabilecegini okumustum bir yerde ama denemek buguneymis...

OleDbConnection con = new OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;Data Source=Book1.xls;Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"");
OleDbCommand cmd = new OleDbCommand("SELECT * FROM [Sheet1$]",con);

Bu sorgunuzun sonucunda excel sheet'inizdeki alanlarinizi cekebilirsiniz ama bunun 8 satir ile sinirli olmasi gibi bir durumun soz konusu oldugunu okudum.Denedim ama 8 satirdan fazlasini da cekebildim.Eger 8 satirdan fazlasini cekemzseniz ,Registry'de bir takim degisiklik(ler) yapmak gerekiyor.

Tabii bu sorgulamayi yapmadan once excel'de kolon isimlerini ayarlamaniz gerekiyor cunku yukaridaki sorgu sanildigi gibi kolon ismi olarak A,B,C,...
dondurmuyor.Onun yerine ilk satirda yazilanlari kolon ismi olarak aliyor.Yani A1="abc", B1="def", C1="ghi" ise sorgu sonucunda kolon isimleri A,B,C degil abc,def,ghi oluyor.Bunun olmasi icin HDR=Yes yazmaniz gerekiyor.

Eger ilk satirinizin kolon ismi olarak alinmasini istemiyorsaniz HDR=No diyebilirsiniz ama bu sefer de kolon isimleri F1,F2,F3... diye geliyor.

Eger boyle de olmasini istemiyorsaniz HDR=No dedikten sonra sorgu sonucunu bir DataTable nesnesine atip, bu nesnenin kolon isimlerini degistirebilirsiniz...

IMEX=1 ise excel sheet'inizden alfa-numerik bilgi cekebilmenizi sagliyor.Eger IMEX=1 demezseniz satirlardaki numerik degerleri null olarak cekersiniz ve bu IMEX=1 'i insert , update gibi sorgularda kullaninca calismadigi icin bu sorgularda imex=1 'i yazmayin ama select sorgusunda yazin...

Tabii yukarida verdigim connection string ile Excel2007'ye baglanti yapamazsiniz(daha dogrusu yapamazmissiniz).Bunun icin de ayri bir connection string lazim.O da asagida :
(Excel2007 olmadigi icin bunu deneyemedim artik isinize yariyorsa siz deneyip sonucu yazarsiniz...)

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsx;Extended Properties="Excel 12.0;HDR=YES";

Hangi connection stringi kullnacaginiza ise excel dosyanizin uzantisina bakarak karar verebilirsiniz.Bir kac mesaj once soylenildigi gibi 2007 ile onceki versiyonlarin dosya uzantilari degisik...

Son olarak bir soruna deginmek istiyorum: Ben SELECT,INSERT,UPDATE sorgularini calistirdim ama DELETE sorgusunda hata verdi.Su an ona bakiyorum.Cozum bulursam buraya yazarim...

Ayrica asagidaki sitelere bakarsaniz belki isinize yarayan bir cozum bulabilirsiniz...

http://www.gelecekonline.com/Yazilar.asp?goster=dos&id=203

http://www.codeproject.com/office/excel_using_oledb.asp

http://www.brianpeek.com/blogs/archive/2006/04/18/415.aspx

Asagidaki adreste bilinen veritabanlarina baglanmak icin gerekli connectionstringler ve aciklamalari mevcut...

http://www.connectionstrings.com/

Eger cozum bulamazsaniz google'da excel ve OleDB ile ilgili biraz arastirma yapin...
 
Katılım
29 Eylül 2006
Mesajlar
2
Excel Vers. ve Dili
Excel-2000
Bir ornek olarak da soyle bir sey vereyim :

Kod:
        private void button1_Click(object sender, EventArgs e)
        {

            OleDbConnection con = new OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;Data Source=Book1.xls;Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"");
            OleDbCommand cmd1 = new OleDbCommand("INSERT INTO [Sheet1$] (a,b,c) VALUES(@val1,@val2,@val3)",con);

            cmd1.Parameters.Add("@val1", OleDbType.VarChar).Value = "wwww";
            cmd1.Parameters.Add("@val1", OleDbType.VarChar).Value = "mmmm";
            cmd1.Parameters.Add("@val1", OleDbType.VarChar).Value = "kkkk";

            con.Open();
            cmd1.ExecuteNonQuery();
            con.Close();
        }
Sanirim sizin de excel dosyasina export ederken demek istediginiz C# programinda elde ettiginiz veriyi excel'e yazdirmakti.Bunu da yukaridaki INSERT sorgusuyla yapabilirsiniz.
Tabii parametre kullanimi, ve diger seyleri detayli aciklamayacagim.Basitce olusturdugumuz sorguda parametre kullandik, bu parametrelerin degerlerini belirttik , sonra da veritabanindan herhangi bir veri kumesi cekmeyecegimiz icin OleDbCommand nesnesinin ExecuteNonQuery(); methodunu kullandik.Eger bunlar hakkinda bir fikriniz yoksa http://www.csharpnedir.com adresinde yararli makaleler var...

Not:Eger excel dosyanizi calisma aninda olusturmak istiyorsaniz projenizin basinda System.IO; namespace'ini dahil ederek
Kod:
File.Create("Book1.xls")
seklinde bir excel dosyasi yaratabilirsiniz...

Eger programinizi sizden baskalari kullanacaksa , hedef bilgisayarda kurulu olan excel versiyonunu kontrol eden bir kod ile kullanacaginiz connection stringi belirleyebilirsiniz veya onceden yarattiginiz bir excel dosyasinin uzantisinin ".xls" veya ".xlsx" olup olmadigina bakarak da kontrol edebilirsiniz...

Mesela asagidaki gibi bir kod yazilabilir :
Kod:
FileInfo file = new FileInfo(fileName);//yazacaginiz excel dosyasinin ismini bir sekilde fileName'e atayin...

OleDbConnection con;
if(file.Extension == "xls")
            con = new OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;Data Source="+fileName+";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"");

else if(file.Extension == "xlsx")

            con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+fileName+";Extended Properties=\"Excel 12.0;HDR=YES\"");
 
Son düzenleme:

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
.......
.....
Bence, C#' da önce bir Excel nesnesini oluşturun ve daha sonra devam edin.

VBA veya VB platformlarında bu iş CreateObject(......) ile yapılıyor. C#'ın kendisi de nesneye yönelik bir dil olduğu için bu şekilde yapabilirsiniz diye düşünüyorum.

........
Not:Eger excel dosyanizi calisma aninda olusturmak istiyorsaniz projenizin basinda System.IO; namespace'ini dahil ederek
Kod:
File.Create("Book1.xls")
seklinde bir excel dosyasi yaratabilirsiniz...
İşte benim demek istediğim de buydu.

Demek, C# ile herhangibir referans eklemeden runtime (kod çalışma süreci) içinde bir Excel dosyası böyle oluşturulabiliyor.

Sanırım, yukaridaki kod çalıştırıldığında C# projesinin olduğu dizinde Book1.xls dosyasını oluşturuyor. Eğer farklı bir dizinde oluşturmayı isteseydik, muhtemelen
Kod:
File.Create("D:\TestFolder\Book1.xls")
gibi olacaktı ...

Not:
1) Foruma kayıt tarihinden sonra ilk mesajınız biraz geç oldu gibi ama, bu detaylı açıklamalarınız için Sayın Baron06'a teşekkürler .... :mrgreen:

2) Bu arada;

baron06' Alıntı:
Son olarak bir soruna deginmek istiyorum: Ben SELECT,INSERT,UPDATE sorgularini calistirdim ama DELETE sorgusunda hata verdi.Su an ona bakiyorum.Cozum bulursam buraya yazarim...
Excel'e bağlantı kurarken ISAM sürücüleri Excel'deki bir alandan kayıt silinmesine izin vermez.
 
Son düzenleme:
Üst