2015-07-28 29 views
6

Excel dosyalarında (hem xls hem de xlsx) okumak için bir C# kitaplığı yazıyorum ve bir sorunla karşılaşıyorum. Benim Excel dosyası dize değerlerine sahip bir sütunu vardır, ama ilk satırda sayısal değeri varsaExcel veri ayıklama - Sütun veri türü ile sorun

this question ifade ne birbirinin aynı, OLEDB Sağlayıcısı sütun sayısal olarak varsayar ve için NULL döndürür Bu sütunda sayısal olmayan değerler.

in the answer provided olarak kayıt defterinde değişiklik yapabileceğimin farkındayım, ancak bu bir kitaplık olduğundan, birçok makinede kullanmayı planladığım ve her kullanıcının kayıt defteri değerlerini değiştirmek istemediğim için merak ettim daha iyi bir çözüm var.

Belki de ACE.OLEDB dışındaki bir DB sağlayıcısı (ve JET artık dikkate alınacak kadar iyi desteklenmiyor gibi görünüyor)?

Ayrıca, bunun XLS/XLSX üzerinde çalışması gerektiğinden, xls sürümü için EPPlus/XML okuyucusu gibi seçenekler çalışmayacaktır.

+0

bir '.csv' olarak yeniden kaydedin dosya. Aynı zamanda yüklenen ve düzenli bir şekilde dolduran bir makro var, ancak bu şekilde tüm biçimlendirme kaldırılır ve daha kolay bir içe aktarma sağlar. – AeroX

+0

Teşekkürler, @AeroX, Bunun hakkında düşünüyordum, ama eğer mümkün olursa, onlarca başka kutu solucanlar açtığından, Interop'tan kaçınmaya çalışıyorum :) ... Başka birinin başka bir çözümü olduğunu umuyorum, ama teşekkürler Yöntemi paylaşmak için çok! –

+0

Bunun yerine OpenXml Sdk kullanın. –

cevap

1

Kişisel bağlantı dizesi bağlantı dizesinde bu

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

IMEX = 1 gibi görünmelidir karışık veri türü olarak sütun tedavi etmek gerekir parçasıdır. Bu kayıt defterini düzenlemeye gerek kalmadan iyi çalışması gerekir.

HDR = Evet, yalnızca ilk satırı sütun üstbilgileri olarak işaretlemeniz yeterlidir ve özel sorununuz için gerekli değildir, ancak yine de ekledim.

Her zaman IMEX kullanmak için = 1, karma veri sütunları için verileri almanın daha güvenli bir yoludur.

Kaynak: https://www.connectionstrings.com/excel/

Düzenleme:

enter image description here

:

İşte data

çıktısı:

İşte

kullanıyorum veridir

string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\test.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"""; 

using (DbClass db = new DbClass(connString)) 
{ 
    var x = db.dataReader("SELECT * FROM [Sheet1$]"); 
    while (x.Read()) 
    { 
     for (int i = 0; i < x.FieldCount; i++) 
      Console.Write(x[i] + "\t"); 
     Console.WriteLine(""); 
    } 
} 

DbClass ben hayatı kolaylaştırmak amacıyla yapılan basit bir sarıcı:

Bu benim kullanılan tam koddur. Burada bulunabilir:

http://tech.reboot.pro/showthread.php?tid=4713

Şu anda bu sorunu çözmek yolu Excel'de dosyayı açmak ve Excel COM arayüzü ve bazı C# kullanmaktır
+0

KoBe, bunu okudum ve IMEX = 1'i ayarladım, ancak hala çalışmıyor ... –

+0

FYI, Sadly, Kobe, Bunu çevrimiçi buldum ve mantıklı geliyor: '' set IMEX = 1 '' Bağlantı dizesinin Genişletilmiş Özellikler bölümü. Bu ImportMixedTypes = Metin kayıt defteri ayarını zorlar. [CPLM \ Software \ Microsoft \ Jet \ 4.0 \ Engines \ Excel \ ImportMixedTypes] öğesini da sayısal olarak değiştirerek, türünün zorlamasını değiştirebilirsiniz. '- Temelde IMEX = 1 kayıt ayarını güçlendirir, ancak kendi başına yeterince iyi değildir. –

+0

Test etmek için kullandığım tam kodu ekledim. Bunu bulduğun yere bir link verebilir misin? Ayrıca, JET veya ACE için bu kayıt defteri ayarlarına sahip değilim. Yani, bunun nasıl olabileceğini görmüyorum. – Cory