Yazar |
|
sevecen
adana istanbul
Kayıt: 08.02.2006 |
|
DataTable dtEXCEL = new DataTable();
DataTable dtNAME = oleConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _obj);
OleDbDataAdapter adp;
if (dtNAME.Rows.Count > 0)
{
adp = new OleDbDataAdapter("Select * From [" + dtNAME.Rows[0]["TABLE_NAME"].ToString() + "]", oleConn);
adp.Fill(dtEXCEL);
}
Başlığı düzgün bir şekilde okuyor. Ama diğer verileri eksik okuyor. 4 kayıttan ilk ikisinin ilk 2 kolonunu okuyamıyor. Bunlar normal string alanlar. TArihleri de yanlış okuyor. 03.01.1990'ı 30684 yapmış vs.
Durum acil olduğu için fazla araştırmadan buraya yazdım. Yardımlarınızı bekliyorum.
Kolay gelsin.
bize ruyalarimizin degil uyanikligimizin tabiri gerek (Alinti)
|
|
Yazar |
|
mmt
Kayıt: 22.01.2006 |
|
http://aspnet.4guysfromrolla.com/articles/032608-1.aspx
burada anlatıyor ayrıntılı olarak, projenin zip dosyası da var altta onu da indirip inceleyebilirsin.
tarihleri yanlış çevirmesinin nedeni sanırım excelde o hücrenin formatının "genel" olarak ayarlanmasından kaynaklanıyor, tam emin değilim ama o hücreleri "tarih" olarak ayarlayıp bir dene istersen.
|
|
Yazar |
|
aliprinter
İstanbul
Kayıt: 12.02.2006 |
|
Kodunda bir problem gözükmüyor.
İlk 2 satırın ilk 2 sütununu okuyamasının nedenini tam olarak bilemiyorum sütun dizilişinden ya da format bozukluğundan kaynaklanabilir.
Ancak tarih alanlarının yanlış çıkması anladığım kadarıyla tarih bilgisinin sayı olarak saklanmasından kaynaklanıyor. Yani tarih ya da genel olarak ayalasan bile koddan çekerken bu sayıyı alıyor. Excel'den bunu düzeltmenin yolunu bilmiyorum açıkcası ama C#'tan bu sayı formatını normal tarih formatına çevirmek için aşağıdaki gibi bir yöntem kullanabilirsin:
Mesela 39295 = 01.08.2007'ye denk geliyor.
DateTime dtTarih = System.DateTime.FromOADate(39295); ;
|
|
Yazar |
|
sevecen
adana istanbul
Kayıt: 08.02.2006 |
|
Teşekkür ederim.
bize ruyalarimizin degil uyanikligimizin tabiri gerek (Alinti)
|
|
Yazar |
|
sevecen
adana istanbul
Kayıt: 08.02.2006 |
|
Konu yakın olduğu için yeni başlık açmadım. Zira bugünlerde çok soru soruyorum
Bu excel dosyasının kaydetmeden nasıl datatable a aktarırım?
Öyle durumda connection string kullanır mıyım?
Kullanırsam nasıl olur?
string con = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + Server.MapPath("../") + "DB\deneme.xls;" +
"Extended Properties=Excel 8.0;";
bize ruyalarimizin degil uyanikligimizin tabiri gerek (Alinti)
|
|
Yazar |
|
aliprinter
İstanbul
Kayıt: 12.02.2006 |
|
private DataTable getDataFromXLS(string strFilePath)
{
try
{
string con = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strFilePath + @";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""";
OleDbConnection xlscon =new OleDbConnection (con);
xlscon.Open();
OleDbCommand xlscmd = new OleDbCommand (@"SELECT * FROM [Kitap1$]", xlscon);
OleDbDataAdapter xlsda = new OleDbDataAdapter();
xlsda.SelectCommand = xlscmd;
DataTable xlsdt = new DataTable ();
xlsda.Fill(xlsdt);
xlscon.Close();
xlsda = null;
return xlsdt;
}
catch(Exception ex)
{
return null;
}
finally
{}
}
Basitçe Exceldeki verileri datatable'a aktarıp geri döndüren bir fonksiyon. Ama şu linkte daha ayrıntılı şekilde (range belirterek vs.) aktarmadan bahsetmiş bunu da bir kontrol et.
http://blogs.vbcity.com/hotdog/archive/2006/01/12/5777.aspx
|
|
Yazar |
|
sevecen
adana istanbul
Kayıt: 08.02.2006 |
|
aliprinter teşekkür ederim.
Fakat bu yolla excel dosyası kaydedilmek zorunda kalmayacak mı?
strFilePath için ne yazacağım?
bize ruyalarimizin degil uyanikligimizin tabiri gerek (Alinti)
|
|
Yazar |
|
aliprinter
İstanbul
Kayıt: 12.02.2006 |
|
DataTable veritabanından bağımsız çalışır. DataTable üzerinde değişiklik yapmayıp DataAdapter'da Update yapmadığın sürece Excel tablonda bir değişiklik olmaz zaten benim bildiğim kadarıyla. O yüzden connection stringde bir değişiklik olmasına da gerek yok. Datatable'a aldığın verileri başka bir veritabanına aktarırsın bu şekilde üzerinde değişiklik yapmadan.
Ancak connectionString üzerinde;
string con = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strFilePath + @";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1;Mode=ReadOnly""";
kırmızı ile yazılı Mode=ReadOnly parametresini eklersen bağlantı yalnızca okunabilir modda açılmış olur. Senin istediğin de böyle birşey anladığım kadarıyla.
|
|
Yazar |
|
sevecen
adana istanbul
Kayıt: 08.02.2006 |
|
Excel dosyasını kaydetmeden datatable'a aktarmaya çalıştığımda "Başlatma dizesi biçimi OLE DB belirtimine uymuyor. " hatasını alıyorum bu seferde.
string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + excelPost + "@;" +
"Extended Properties=Excel 8.0;Mode=ReadOnly";
OleDbConnection oleConn = new OleDbConnection(strConn);
oleConn.Open();
object[] _obj = new object[] { null, null, null, "TABLE" };
DataTable dtNAME = oleConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _obj);
bize ruyalarimizin degil uyanikligimizin tabiri gerek (Alinti)
|
|
Yazar |
|
sevecen
adana istanbul
Kayıt: 08.02.2006 |
|
Mode=Readonly yazmayınca da bu hatayı alıyorum.
"Güncelleştirilemiyor. Veritabanı veya nesne salt okunur."
bize ruyalarimizin degil uyanikligimizin tabiri gerek (Alinti)
|
|
Yazar |
|
aliprinter
İstanbul
Kayıt: 12.02.2006 |
|
string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + excelPost + "@;" +
"Extended Properties=Excel 8.0;Mode=ReadOnly";
Kırmızı olan yerlerde içerik hataları var. Aşağıdaki gibi olmalı:
string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;" +
@"Data Source=" + excelPost + ";" +
@"Extended Properties=""Excel 8.0;Mode=ReadOnly""";
|
|
|
|
-
Del.icio.us
-
Digg
-
Facebook
-
Furl
-
Google
-
Blink
-
Simpy
-
Spurl
-
Y! MyWeb
|
|
| | | | | | | |