2012-05-18 13 views
9

में दिखाए गए गैर-वर्कशीट को फ़िल्टर करें मुझे OLEDB का उपयोग कर Excel स्प्रेडशीट से वर्कशीट नाम प्राप्त करने में कोई समस्या है। समस्या यह है कि जब मैं GetOleDbSchemaTable का उपयोग करता हूं, परिणामी डेटाटेबल केवल वास्तविक वर्कशीट नामों से अधिक है; इसमें "टेबल्स" के लिए अतिरिक्त पंक्तियां हैं जिन्हें मैं केवल एक्सेल द्वारा आंतरिक रूप से उपयोग कर सकता हूं।OLEDB का उपयोग कर एक्सेल में केवल एक्सेल वर्कशीट नामों की सूची कैसे प्राप्त करें; मेटाडेटा

तो उदाहरण के लिए, यदि मेरे पास वर्कशीट नामक वर्कशीट है, तो नीचे दिया गया कोड उस सूची के साथ समाप्त हो सकता है जिसमें मेरी वर्कशीट $, MyWorksheet $ PrintTable और myWorksheet $ _ शामिल है। वास्तविक वर्कशीट के लिए केवल पहला myWorksheet $ रिकॉर्ड है। दूसरों को सिर्फ कचरा है जिसकी मुझे आवश्यकता नहीं है। जब आप उन्हें मेटाडेटा में देखते हैं तो वे टेबल के प्रकार के साथ भी नियमित टेबल की तरह दिखते हैं।

अभी के लिए मैंने नाम में मैन्युअल रूप से "$ _" या "$ प्रिंट" के साथ कुछ भी फ़िल्टर किया है, लेकिन कौन जानता है कि अन्य एक्सेल सुविधा इन अतिरिक्त रिकॉर्ड को एक अलग प्रारूप में कैसे बदल सकती है।

क्या कोई भी वास्तविक वर्कशीट नाम प्राप्त करने का सबसे अच्छा तरीका जानता है, न कि इन आंतरिक सारणी जो वर्कशीट नहीं हैं? क्या मेटाडेटा में कुछ ऐसा है जो उन्हें अलग करेगा?

private ArrayList getXlsWorksheetNames(OleDb.OleDbConnection conn) 
    { 
     ArrayList wsList = new ArrayList(); 
     DataTable schemaTable; 

     try 
     { 
      conn.Open(); 
      schemaTable = conn.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, null); 

      foreach (DataRow row in schemaTable.Rows) 
      { 
       //form.appendToResultsTxt("Adding worksheet to list: " + Environment.NewLine + 
       // "Name = " + row.Field<string>("TABLE_NAME") + "," + Environment.NewLine + 
       // "Type = " + row.Field<string>("TABLE_TYPE") + "," + Environment.NewLine + Environment.NewLine); 
       wsList.Add(row.Field<string>("TABLE_NAME")); 
      } 
      conn.Close(); 
     } 
     catch (Exception ex) 
     { 
      if (this.mode == Cps2TxtUtilModes.GUI_MODE) 
      { 
       this.form.appendToResultsTxt(ex.ToString()); 
      } 
      throw; 
     } 

     return wsList; 
    } 

मैं इस लिंक पर लेख के माध्यम से पढ़ते हैं, लेकिन वे अलग तरह से कुछ भी करने जा करने के लिए की तुलना में मैं कर रहा हूँ नहीं है, और मैं अतिरिक्त गैर कार्यपत्रक टेबल से बाहर किसी भी छानने नहीं दिख रहा है, तो माइक्रोसॉफ्ट नहीं करता है ऐसा लगता है कि सही जवाब नहीं दिया गया है।

http://support.microsoft.com/kb/318452

और मैं भी चारों ओर StackOverflow की बहुत, जैसे लिंक से धागा जो नीचे मददगार था, लेकिन यह एक समस्या का समाधान नहीं है देखा है।

Using Excel OleDb to get sheet names IN SHEET ORDER

इससे पहले कि किसी को भी पूछता है, मैं भी कहने के लिए मैं वास्तव में क्या सुविधाओं स्प्रेडशीट में उपयोग किया जाता है पर नियंत्रण की जरूरत नहीं है कि चाहते हैं, इसलिए मैं सिर्फ उन्हें नहीं बता सकता "चालू न करें फ़िल्टरिंग पर "या" प्रिंट टेबल का उपयोग न करें "।

किसी भी विचार की बहुत सराहना की जाती है। धन्यवाद!

+1

बस कुछ भी फ़िल्टर करें जो "$" के साथ नहीं है। मैं थोड़ी देर के लिए इसका उपयोग कर रहा हूं और यह कभी विफल नहीं हुआ है, यहां तक ​​कि जब पिवोट टेबल, फ़िल्टर की गई सूचियां आदि हैं, तब भी –

+0

धन्यवाद; वह में स्वयं कर लूँगा। जैसा कि मैंने नीचे अपनी टिप्पणी में कहा है, यह आदर्श से कम है क्योंकि यह कार्यान्वयन के विवरण पर निर्भर करता है, लेकिन अगर मुझे ऐसा करना है, तो ऐसा ही हो। – Jim

+0

ऊपर दिए गए प्रश्न का मेरा जवाब दिखाता है कि आप डीएओ का उपयोग करके इसे कैसे कर सकते हैं, लेकिन यदि आप COM का उपयोग नहीं करना चाहते हैं तो यह एक विकल्प नहीं है। हालांकि एसेन द्वारा दिए गए जवाब में अनुपूरक .xlsx को .zip का नाम बदलकर, ज़िप फ़ाइल सामग्री खोलने और शीट नामों में उसमें से एक XML फ़ाइलों को पढ़ने का एक और तरीका दिखाता है। मैंने यह देखने के लिए परीक्षण नहीं किया है कि छिपी चादरें वहां दिखाई देती हैं और यह केवल 2007 (.xlsx) फ़ाइलों पर काम करेगी, लेकिन यह एक शॉट के लायक हो सकती है। –

उत्तर

2

अनुभव से, ऐसा लगता है कि उनका नाम डॉलर के चिह्न में समाप्त होता है। मैं उन ग्राहकों से परिदृश्य में आया हूं जहां अतिरिक्त वर्कशीट दिखाई दे रही थीं जो डेटा में मौजूद नहीं थीं - ये बाद में एक्सेल में छिपी हुई वर्कशीट्स बन गईं!

+0

हां, ये "छिपी हुई" सारणी समस्याएं पैदा करने वाली चीजें हैं। आप शायद सही हैं कि मैं सिर्फ '$' को नाम के आखिरी चरित्र के रूप में देख सकता हूं। हालांकि, इनमें से कुछ "छिपी हुई" तालिकाओं में नामों में $ है, और यदि मैं "टेबल" वर्कशीट है, या यदि यह किसी अन्य प्रकार का आंतरिक रूप से उपयोग किया गया एक्सेल है, तो मैं कुछ मेटाडेटा प्रॉपर्टी से बताने के लिए एक निश्चित तरीका ढूंढ रहा था। तालिका। वैसे भी जवाब के लिए धन्यवाद। किसी और को एक्सेल मेटाडेटा में अंतर करने के लिए कुछ भी पता है? – Jim

+0

मुझे यह देखने का कोई तरीका नहीं मिला है कि अभी तक कौन सी टेबल दिखाई दे रही हैं, मुझे लगता है कि हमें इस तरह के कुछ के लिए इंटरऑप का उपयोग करने की आवश्यकता होगी। GetOleDbSchemaTable तालिका में उन्हें अलग करने के लिए कुछ भी नहीं है। अगर आपको कुछ मिलता है, तो कृपया साझा करें और मैं भी अपना प्रोग्राम अपडेट करूंगा! – Bridge

+0

निश्चित रूप से इंटरऑप का उपयोग नहीं करना चाहते हैं! हालांकि जानकारी के लिए धन्यवाद।मैं अभी सावधान रहा हूं कि शायद कुछ ऐसी विशेषता है जिसे मैं नहीं जानता जिसके परिणामस्वरूप एक गैर-वर्कशीट "टेबल" होगी जिसके नाम पर $ एक है, लेकिन मुझे लगता है कि यह अभी के लिए पर्याप्त है मान लीजिए कि मामला नहीं है। कार्यान्वयन विवरण पर निर्भर हालांकि यद्यपि बेकार है। – Jim

0

मेरे दिमाग में आने वाला पहला तरीका उसी तरह से है जो आपके लिंक में Using Excel OleDb to get sheet names IN SHEET ORDER लिंक से सूचीबद्ध है।

आप akash88 के दृष्टिकोण ले सकते हैं और इसे थोड़ा साफ कर सकते हैं ताकि कोड पढ़ने के लिए अच्छा हो।

 var wsList = from s in schemaTable 
        where s.Field<string>("TABLE_NAME").Contains("$") 
        select s.Field<string>("TABLE_NAME"); 
+2

कृपया संपूर्ण पोस्ट और टिप्पणियां पढ़ें, और आप देखेंगे कि आपका उत्तर वास्तव में पर्याप्त नहीं है; यह एक्सेल आंतरिक सारणी जैसे फ़िल्टर टेबल्स के लिए अतिरिक्त रिकॉर्ड वापस कर देगा। मूल पोस्ट ने विशेष रूप से इसका उल्लेख किया और विशेष रूप से मेटाडेटा से केवल वास्तविक उपयोगकर्ता वर्कशीट प्राप्त करने के लिए एक तरीका मांगा। मुझे यह पोस्ट करने के बाद से पता चला है कि कार्यान्वयन विस्तार पर भरोसा करते हुए मेटाडेटा से बताने का कोई मानक तरीका नहीं है कि सभी उपयोगकर्ता वर्कशीट्स के पास या तो अंतिम चरित्र के रूप में $ या दूसरे के पास दूसरा होता है यदि नाम में कोई स्थान है और इस प्रकार डबल कोट्स से घिरा हुआ है। – Jim

0

आप EndsWith("$") बजाय Contains("$") नीचे की तरह का परीक्षण कर सकते हैं:

List<String> lstsheetNames = new List<String>(); 
String sheetName; 
foreach (DataRow row in schemaTable.Rows) 
{ 
    sheetName = row.Field<string>("TABLE_NAME"); 
    String strTemp = sheetName.Split(' '); 

    if(strTemp.Length == 1 && sheetName.EndsWith("$")) 
     lstsheetNames.Add(sheetName.Substring(0, sheetName.Length - 1)); 

    else if(strTemp.Length > 1 && strTemp.GetValue(strTemp.Length - 1).ToString().EndsWith("$'")) 
     lstsheetNames.Add(sheetName.Substring(1, sheetName.Length - 3)); 
} 

मैं एक ही समस्या में इस कोड का इस्तेमाल किया है और यह ठीक काम करता है।

संपादित करें: क्षमा करें, मैंने इस पर ध्यान नहीं दिया। मैंने अब कोड बदल दिया। यह सबसे अच्छा या सबसे छोटा तरीका नहीं हो सकता है लेकिन यह काम करता है।

+2

क्या कोई भी वास्तविक पोस्ट नहीं पढ़ता है? मैंने कई बार उल्लेख किया है कि तालिका के नाम की जगह होने पर यह काम नहीं करता है, क्योंकि यह $ के बजाय उद्धरण के साथ समाप्त हो जाएगा, और मैंने विशेष रूप से एक वास्तविक समाधान के लिए भी कहा जहां मेटाडाटा उपयोगकर्ता तालिका इंगित करता है और नहीं एक आंतरिक तालिका, केवल एक कार्यान्वयन विस्तार पर भरोसा करने के बजाय कि मैं पहले से ही स्पष्ट रूप से जानता हूं क्योंकि यह मेरे ओपी में है। – Jim

4

सवाल पुराना है, लेकिन जो लोग पाया यह अब, लंघन के रूप में जिम पाया किया जा सकता है के लिए ...

 // skip those that do not end correctly 
     foreach (DataRow row in schemTable.Rows) 
     { 
      string sheetName = row["TABLE_NAME"].ToString(); 
      if (!sheetName.EndsWith("$") && !sheetName.EndsWith("$'")) 
       continue; 
      Console.WriteLine(sheetName); 
     } 

यही चाहता था है या उन है कि $ के साथ समाप्त या उन है कि अंत $' के साथ।

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