में दिखाए गए गैर-वर्कशीट को फ़िल्टर करें मुझे 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
इससे पहले कि किसी को भी पूछता है, मैं भी कहने के लिए मैं वास्तव में क्या सुविधाओं स्प्रेडशीट में उपयोग किया जाता है पर नियंत्रण की जरूरत नहीं है कि चाहते हैं, इसलिए मैं सिर्फ उन्हें नहीं बता सकता "चालू न करें फ़िल्टरिंग पर "या" प्रिंट टेबल का उपयोग न करें "।
किसी भी विचार की बहुत सराहना की जाती है। धन्यवाद!
बस कुछ भी फ़िल्टर करें जो "$" के साथ नहीं है। मैं थोड़ी देर के लिए इसका उपयोग कर रहा हूं और यह कभी विफल नहीं हुआ है, यहां तक कि जब पिवोट टेबल, फ़िल्टर की गई सूचियां आदि हैं, तब भी –
धन्यवाद; वह में स्वयं कर लूँगा। जैसा कि मैंने नीचे अपनी टिप्पणी में कहा है, यह आदर्श से कम है क्योंकि यह कार्यान्वयन के विवरण पर निर्भर करता है, लेकिन अगर मुझे ऐसा करना है, तो ऐसा ही हो। – Jim
ऊपर दिए गए प्रश्न का मेरा जवाब दिखाता है कि आप डीएओ का उपयोग करके इसे कैसे कर सकते हैं, लेकिन यदि आप COM का उपयोग नहीं करना चाहते हैं तो यह एक विकल्प नहीं है। हालांकि एसेन द्वारा दिए गए जवाब में अनुपूरक .xlsx को .zip का नाम बदलकर, ज़िप फ़ाइल सामग्री खोलने और शीट नामों में उसमें से एक XML फ़ाइलों को पढ़ने का एक और तरीका दिखाता है। मैंने यह देखने के लिए परीक्षण नहीं किया है कि छिपी चादरें वहां दिखाई देती हैं और यह केवल 2007 (.xlsx) फ़ाइलों पर काम करेगी, लेकिन यह एक शॉट के लायक हो सकती है। –