2008-11-18 8 views
10

मुझे एक्सेल स्प्रैडशीट तक पहुंचने और स्प्रेडशीट से डेटा को SQL डेटाबेस में डालने की आवश्यकता है। हालांकि प्राथमिक कुंजी मिश्रित हैं, अधिकांश संख्यात्मक हैं और कुछ अल्फा-न्यूमेरिक हैं।सी # के साथ एक्सेल स्प्रेडशीट तक पहुंचने से कभी-कभी कुछ कक्षों के लिए खाली मूल्य लौटाता है

मेरी समस्या यह है कि जब संख्यात्मक और अल्फा-न्यूमेरिक कुंजी समान स्प्रेडशीट में होती हैं तो अल्फा-न्यूमेरिक कोशिकाएं रिक्त मान लौटाती हैं, जबकि अन्य सभी कोशिकाएं बिना किसी समस्या के अपने डेटा लौटाती हैं।

मैं एक्सेल फ़ाइल तक पहुंचने के लिए ओलेडीबी विधि का उपयोग कर रहा हूं। कमांड स्ट्रिंग के साथ डेटा को पुनर्प्राप्त करने के बाद मैंने डेटा को डेटा एडाप्टर में रखा और फिर मैं डेटासेट भर गया। मैं डेटासेट में पहले डेटाटेबल में सभी पंक्तियों (डॉ) के माध्यम से पुन: प्रयास करता हूं।

मैं का उपयोग कर, डॉ द्वारा कॉलम संदर्भ [ "..."]। ToString()

अगर मैं विजुअल स्टूडियो 2008 में इस परियोजना डिबग और मैं "विस्तारित गुण" देखने, पर मेरे माउस पकड़ कर "डॉ" मैं DataRow के मान देख सकता हूं, लेकिन प्राथमिक कुंजी जो अल्फा-न्यूमेरिक होना चाहिए {} है। अन्य मूल्य उद्धरणों में संलग्न हैं, लेकिन खाली मूल्य में ब्रेसिज़ हैं।

क्या यह सी # समस्या या एक्सेल समस्या है?

क्या किसी ने कभी भी इस समस्या का सामना किया है, या शायद एक समाधान/फिक्स पाया है?

अग्रिम धन्यवाद।

+0

संभावित डुप्लिकेट: http://stackoverflow.com/q/3232281/2291 –

उत्तर

1

{} का अर्थ है कि यह किसी प्रकार की खाली वस्तु है और स्ट्रिंग नहीं है। जब आप ऑब्जेक्ट पर होवर करते हैं तो आपको इसके प्रकार को देखने में सक्षम होना चाहिए। इसी प्रकार, जब आप डॉ ["..."] को देखने के लिए क्विकवॉच का उपयोग करते हैं तो आपको ऑब्जेक्ट प्रकार देखना चाहिए। आपको प्राप्त वस्तु किस प्रकार का है?

1

आइटमअरे एक ऑब्जेक्ट ऐरे है। तो मुझे लगता है कि DataRow में "कॉलम", जिसे मैं संदर्भित करने का प्रयास कर रहा हूं, प्रकार ऑब्जेक्ट का है।

+0

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

1

VISTA संगतता के लिए आप कनेक्शन स्ट्रिंग में EXCEL 12.0 ड्राइवर का उपयोग कर सकते हैं। यह आपकी समस्या का समाधान करना चाहिए। यह मेरा था।

3

एक्सेल डेटा स्रोत संपूर्ण कॉलम के लिए कॉलम प्रकार चुनता है। यदि कोशिकाओं में से एक उस प्रकार से बिल्कुल मेल नहीं खाता है, तो यह उस तरह के रिक्त स्थान छोड़ देता है। हमारे पास ऐसे मुद्दे थे जहां हमारे टाइपिस्ट ने संख्यात्मक कॉलम में "8" (संख्या से पहले एक स्थान दर्ज किया था, इसलिए Excel ने उस सेल के लिए एक स्ट्रिंग में परिवर्तित किया)। यह मुझे समझ में आता है कि यह नेट पार्स विधियों को और अधिक मजबूत बनाने की कोशिश करेगा, लेकिन मुझे लगता है कि एक्सेल ड्राइवर कैसे काम करता है।

हमारा फ़िक्स, चूंकि हम डेटाबेस आयात सेवाओं का उपयोग कर रहे थे, इस तरह से 'असफल' सभी पंक्तियों को लॉग करना था। फिर, हम एक्सएलएस दस्तावेज़ पर वापस गए और अंतर्निहित प्रकार सही था यह सुनिश्चित करने के लिए, उन कोशिकाओं को दोबारा टाइप किया। (हमने पाया कि अंतरिक्ष को हटाने से यह ठीक नहीं हुआ - हमें '8' को दोबारा टाइप करने से पहले पूरे सेल को साफ़ करना पड़ा।) हैकी महसूस करता है और यह अजीब नहीं है, लेकिन यह हमें मिला सबसे अच्छा तरीका था। यदि एक्सेल ड्राइवर इसे स्वयं से सही तरीके से नहीं पढ़ सकता है, तो आप उस डेटा को प्राप्त करने के लिए कुछ भी नहीं कर सकते हैं। नेट।

बस एक और मामला जहां कार्यालय सादगी के नाम पर उपयोगकर्ताओं से महत्वपूर्ण विवरण छुपाता है, और इसलिए जब आप बिजली के उपयोग के लिए सटीक होते हैं तो इसे और अधिक कठिन बनाते हैं।

+1

इस पर डिट्टो, और यदि एक्सेल अविश्वसनीय रूप से पिक्य हो रहा है, तो आप केवल एक ही सेल तक पहुंचने का प्रयास कर सकते हैं: [FW से चुनें F1] MyWorksheet $ B12: B12] – Mxyzptlk

+0

@ABHI द्वारा उत्तर में IMEX = 1 का विकल्प हमारे लिए काम करता है कुछ स्थितियों में। –

25

समाधान:

कनेक्शन स्ट्रिंग:

प्रदाता = Microsoft.Jet.OLEDB.4।0; डेटा स्रोत = फ़ाइलपाथ; विस्तारित गुण = "एक्सेल 8.0; एचडीआर = हाँ; IMEX = 1";

  1. HDR=Yes; इंगित करता है कि पहली पंक्ति COLUMNNAMES, नहीं डेटा होता है। HDR=No; विपरीत इंगित करता है।

  2. IMEX=1; चालक को हमेशा "इंटरमीस्ड" (संख्याएं, तिथियां, तार आदि) डेटा कॉलम को पाठ के रूप में पढ़ने के लिए कहता है। ध्यान दें कि यह विकल्प एक्सेल शीट लिखने के नकारात्मक को प्रभावित कर सकता है।

एसक्यूएल सिंटैक्स SELECT * FROM [sheet1$]। अर्थात। एक्सेल वर्कशीट नाम $ के बाद और [] ब्रैकेट में लपेटा गया।

महत्वपूर्ण:

  • चेक बाहर [HKEY_LOCAL_MACHINE \ SOFTWARE Microsoft \ जेट \ 4.0 \ इंजन \ एक्सेल \] स्थित रजिस्ट्री REG_DWORD "TypeGuessRows"। कॉलम डेटा प्रकार का अनुमान लगाने के लिए एक्सेल को केवल पहली 8 पंक्तियों का उपयोग करने की अनुमति नहीं है। सभी पंक्तियों को स्कैन करने के लिए इस मान को 0 पर सेट करें। यह प्रदर्शन को चोट पहुंचा सकता है।

  • Excel कार्यपुस्तिका एक पासवर्ड से सुरक्षित है, तो आप डेटा का उपयोग के लिए खोल नहीं सकते, यहां तक ​​कि अपने कनेक्शन स्ट्रिंग के साथ सही पासवर्ड की आपूर्ति करके। यदि आप कोशिश करते हैं, तो आपको निम्न त्रुटि संदेश प्राप्त होता है: "फ़ाइल को डिक्रिप्ट नहीं कर सका।"

+2

बिल्कुल सही! मुझे एक ही समस्या के साथ मदद की। चारों ओर दोहरे उद्धरण एस्केप: विस्तारित गुण = "एक्सेल 8.0; एचडीआर = हाँ, इ एक्स = 1" हो जाता है विस्तारित गुण = \ "एक्सेल 8.0; एचडीआर = हाँ, इ एक्स = 1 \" और यह सब अपनी समस्याओं हो जाएगा ठीक! –

+0

रजिस्ट्री कुंजी एसीई एक्सेल ड्राइवर के लिए अलग है: एक्सेल 2007: HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Office \ 12.0 \ एक्सेस कनेक्टिविटी इंजन \ इंजन \ Excel \ TypeGuessRows एक्सेल 2010: HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Office \ 14.0 \ एक्सेस कनेक्टिविटी इंजन \ इंजन \ एक्सेल \ TypeGuessRows एक्सेल 2013: HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Office \ 15.0 \ एक्सेस कनेक्टिविटी इंजन \ इंजन \ Excel \ TypeGuessRows [स्रोत] (https://social.msdn.microsoft.com/ मंच/sqlserver/en-US/41222f92-b079-4e6c-ae17-3aa3534a45a7/सेटिंग TypeGuessRows के लिए एक्सेल-इक्का चालक? मंच = sqlintegrationservices) –

1

समाधान:

  1. आप एचडीआर डाल = नहीं तो यह है कि पहली पंक्ति कॉलम हेडर नहीं माना जाता। कनेक्शन स्ट्रिंग: प्रदाता = Microsoft.Jet.OLEDB.4.0; डेटा स्रोत = FilePath; विस्तारित गुण = "एक्सेल 8.0; एचडीआर = नहीं; इ एक्स = 1";
  2. आप पहली पंक्ति पर ध्यान न दें और आप डेटा acces किसी भी तरह से आप चाहते हैं (DataTable, DataReader ect)। आप कॉलम नामों के बजाय, संख्यात्मक अनुक्रमणिका द्वारा स्तंभों को acces।

यह मेरे लिए काम करता है। इस तरह आपको रजिस्टरों को संशोधित करने की आवश्यकता नहीं है!

1

मैंने एक समान प्रश्न here का उत्तर दिया। यहाँ मैं नकल की और आपकी सुविधा के लिए एक ही जवाब चिपकाया है:

मैं इस एक ही समस्या थी, लेकिन एक्सेल COM इंटरफेस या 3 पार्टी सॉफ्टवेयर का सहारा के बिना यह आस-पास काम कर रहा था। इसमें थोड़ा प्रसंस्करण ओवरहेड शामिल है, लेकिन मेरे लिए काम कर रहा है।

  1. डेटा में पहले पढ़ा तो इन स्तंभों में से प्रत्येक के साथ एक नया डेटासेट बनाने स्तंभ नाम
  2. प्राप्त करने के लिए, स्ट्रिंग के लिए अपनी डेटाटाइप्स में से प्रत्येक की स्थापना।
  3. इस नए डाटासेट में फिर से डेटा पढ़ें। वोला - वैज्ञानिक नोटेशन अब चला गया है और सब कुछ एक स्ट्रिंग के रूप में पढ़ा जाता है।

यहां कुछ कोड है जो इसे दिखाता है, और एक अतिरिक्त बोनस के रूप में, यह स्टाइलकॉप्ड भी है!

public void ImportSpreadsheet(string path) 
{ 
    string extendedProperties = "Excel 12.0;HDR=YES;IMEX=1"; 
    string connectionString = string.Format(
     CultureInfo.CurrentCulture, 
     "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"{1}\"", 
     path, 
     extendedProperties); 

    using (OleDbConnection connection = new OleDbConnection(connectionString)) 
    { 
     using (OleDbCommand command = connection.CreateCommand()) 
     { 
      command.CommandText = "SELECT * FROM [Worksheet1$]"; 
      connection.Open(); 

      using (OleDbDataAdapter adapter = new OleDbDataAdapter(command)) 
      using (DataSet columnDataSet = new DataSet()) 
      using (DataSet dataSet = new DataSet()) 
      { 
       columnDataSet.Locale = CultureInfo.CurrentCulture; 
       adapter.Fill(columnDataSet); 

       if (columnDataSet.Tables.Count == 1) 
       { 
        var worksheet = columnDataSet.Tables[0]; 

        // Now that we have a valid worksheet read in, with column names, we can create a 
        // new DataSet with a table that has preset columns that are all of type string. 
        // This fixes a problem where the OLEDB provider is trying to guess the data types 
        // of the cells and strange data appears, such as scientific notation on some cells. 
        dataSet.Tables.Add("WorksheetData"); 
        DataTable tempTable = dataSet.Tables[0]; 

        foreach (DataColumn column in worksheet.Columns) 
        { 
         tempTable.Columns.Add(column.ColumnName, typeof(string)); 
        } 

        adapter.Fill(dataSet, "WorksheetData"); 

        if (dataSet.Tables.Count == 1) 
        { 
         worksheet = dataSet.Tables[0]; 

         foreach (var row in worksheet.Rows) 
         { 
          // TODO: Consume some data. 
         } 
        } 
       } 
      } 
     } 
    } 
} 
0

हाय सब इस कोड है अक्षरांकीय मान भी हो जाता है

using System.Data.OleDb; 

string ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filepath + ";" + "Extended Properties="+(char)34+"Excel 8.0;IMEX=1;"+(char)34; 

string CommandText = "select * from [Sheet1$]"; 

OleDbConnection myConnection = new OleDbConnection(ConnectionString); 
myConnection.Open(); 

OleDbDataAdapter myAdapter = new OleDbDataAdapter(CommandText, myConnection); 

ds = null; 
ds = new DataSet(); 
myAdapter.Fill(ds); 
1

ताकि अक्षरांकीय क्षेत्रों शीर्षक के नीचे शीर्ष पर दिखाई देगा अवरोही क्रम में आदेश ascii कोड से xls फ़ाइल में रिकॉर्ड पंक्ति। यह सुनिश्चित करता है कि डेटा पढ़ने की पहली पंक्ति डेटा प्रकार को "वर्कर" या "nvarchar"

0

के रूप में परिभाषित करेगी यह बिल्कुल सही नहीं है! जाहिर है, जेट/एसीई हमेशा IMEX = 1 की परवाह किए बिना, पहली 8 पंक्तियों को रिक्त होने पर स्ट्रिंग प्रकार मानता है। यहां तक ​​कि जब मैंने पंक्तियों को रजिस्ट्री में 0 तक पढ़ा, तब भी मुझे एक ही समस्या थी। यह काम करने के लिए यह एकमात्र निश्चित तरीका था:

try 
{ 
    Console.Write(wsReader.GetDouble(j).ToString()); 
} 
catch //Lame unfixable bug 
{ 
    Console.Write(wsReader.GetString(j)); 
} 

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

  • कोई संबंधित समस्या नहीं^_^