2013-08-29 9 views
13

मैं उपयोग कर रहा हूँ OLEDB डेटा प्रदाता फ़ाइल उत्कृष्टता को पढ़ने के लिए उपयोग कर फ़ाइल उत्कृष्टता, लेकिन समस्या यह एक्सेल शीट में कुछ cloumn है संख्या स्ट्रिंग के बजाय उदाहरण के लिए एक अमान्य मान है कि वहाँ, जब मैंने पढ़ा है यह अमान्य मान मुझे वास्तविक मान के बजाय खाली स्ट्रिंग मिलता है।पढ़ना OLEDB डेटा प्रदाता

enter image description here

ऊपर दिए गए स्क्रीनशॉट के लिए

जब मैं मूल्य जॉन रिक्त स्ट्रिंग हो रही पढ़ें।

तो क्या इस अवैध मूल्य को पढ़ने का कोई तरीका है?

किसी भी मदद की सराहना की जाएगी।

कोड Excel फ़ाइल

private DataTable ReadExcelFile(string sheetName, string path) 
{ 

    using (OleDbConnection conn = new OleDbConnection()) 
    { 
     DataTable dt = new DataTable(); 
     string Import_FileName = path; 
     string fileExtension = Path.GetExtension(Import_FileName); 
     if (fileExtension == ".xls") 
      conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Import_FileName + ";" + "Extended Properties='Excel 8.0;HDR=YES;'"; 
     if (fileExtension == ".xlsx") 
      conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Import_FileName + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;'"; 
     using (OleDbCommand comm = new OleDbCommand()) 
     { 
      comm.CommandText = "Select * from [" + sheetName + "$]"; 

      comm.Connection = conn; 

      using (OleDbDataAdapter da = new OleDbDataAdapter()) 
      { 
       da.SelectCommand = comm; 
       da.Fill(dt); 
       return dt; 
      } 

     } 
    } 
} 

उत्तर

8

आप 0 TypeGuessRows रजिस्ट्री कुंजी के लिए मूल्य निर्धारित करने की आवश्यकता को पढ़ने के लिए है, इस तरह से चालक पहले 8 के बजाय सभी स्तंभ मानों के आधार पर डेटा प्रकार सेट हो जाएगा (डिफ़ॉल्ट)।

कुंजी का स्थान संस्करण से संस्करण के संस्करण में भिन्न होता है, तो आप आसानी से Google को अपने विशिष्ट संस्करण के आधार पर आसानी से Google कर सकते हैं। पहुँच कनेक्टिविटी इंजन 2007 के लिए उदाहरण के लिए यह होगा

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel 

वैसे, आप XLS फ़ाइलों को पढ़ने में जेट की जरूरत नहीं है, ऐस के साथ-साथ इस बात का पूरी तरह से सक्षम है।

+5

मुझे लगता है कि आप 'एचडीआर = हाँ' के बाद कनेक्शन स्ट्रिंग में '; IMEX = 1' 'सेट करके एक ही चीज़ को पूरा कर सकते हैं। –

+1

@ डॉगग्लेंसी जो मुझे याद है, इस दृष्टिकोण के साथ एक समस्या थी, लेकिन यह निश्चित रूप से लायक है एक कोशिश करें और यदि यह काम करता है, तो यह रजिस्ट्री संपादन से बेहतर है। –

+0

IMEX = 1 इस पर कोई प्रभाव नहीं डालता है। इस विषय को देखें http://stackoverflow.com/questions/10102149/what-is-imex-in-the-oledb-connection -string – Adam

5

इस के लिए मुझे

 using (OleDbConnection conn = new OleDbConnection()) 
     { 
      DataTable dt = new DataTable(); 
      conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;MAXSCANROWS=0'"; 
      using (OleDbCommand comm = new OleDbCommand()) 
      { 
       comm.CommandText = "Select * from [" + sheetName + "$]"; 
       comm.Connection = conn; 
       using (OleDbDataAdapter da = new OleDbDataAdapter()) 
       { 
        da.SelectCommand = comm; 
        da.Fill(dt); 
        return dt; 
       } 
      } 
     } 

MAXSCANROWS = 0 ओवरराइड रजिस्ट्री डिफ़ॉल्ट काम किया है और प्रकार का निर्धारण करने से पहले सभी पंक्तियों को स्कैन करता है। IMEX = 1 को अभी भी शामिल करने की आवश्यकता है।

उदाहरण के लिए, इस तालिका को देखते हुए:

Header | Header 
------ | ------ 
Cell1 | 2456354 
Cell2 | 2456354 
Cell3 | 2456354 
Cell4 | 2456354 
Cell5 | 2456354 
Cell6 | 2456354 
Cell7 | 2456354 
Cell8 | 2456354 
Cell9 | A5341 

निम्न कनेक्शन तार A5341 खो देंगे

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;'" 
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;MAXSCANROWS=0'" 

लेकिन यह काम करता है जब यह दोनों है।

संबंधित मुद्दे