दिलचस्प पोस्ट
मैं बास में पथ स्ट्रिंग से फ़ाइल प्रत्यय और पथ भाग कैसे निकालूं? लचीलाशर्क में शार्ड्स और प्रतिकृतियां स्विफ्ट में तुरंत लौटें क्या जावा का स्ट्रिंग.फोर्मेट () का उपयोग करना चाहिए यदि प्रदर्शन महत्वपूर्ण है? मोनोग्रोड सॉर्ट आंतरिक सरणी $ (एसएल) के बीच महत्वपूर्ण अंतर क्या हैं .बिंड ("क्लिक करें", $ (एसएल)। क्लिक करें (, $ (sel) .live ("click", $ (sel) .on ("click"? गीट पुश त्रुटि: ऑब्जेक्ट को रिपॉज़िटरी डेटाबेस में जोड़ने के लिए अपर्याप्त अनुमति क्यों मेरे खेतों को शून्य या डिफ़ॉल्ट मान के शून्य के लिए शुरू किया जाता है, जब मैंने उन्हें घोषित किया और उन्हें अपने वर्ग के निर्माता में आरम्भ किया? HTML बटन या जावास्क्रिप्ट पर क्लिक करते समय फ़ाइल डाउनलोड ट्रिगर कैसे करें एक HTML कंटेनर में एकाधिक वर्ग कैसे असाइन करें? सी ++ में दो वर्ग कैसे बनायें जो एक दूसरे को डेटा के रूप में उपयोग करते हैं? पढ़ना विफल: फ़ायरबेज में अनुमति अस्वीकृत त्रुटि क्यों नहीं PyCharm के स्वत: पूर्ण पुस्तकालयों मैं स्थापित करने के लिए काम कर रहा है? आंकड़ा टिक में घातीय स्वरूपण को दबाएं इस जावा विधि में दो रिटर्न प्रकार क्यों दिखाई देते हैं?

शीट आदेश में शीट नाम प्राप्त करने के लिए एक्सेल ऑलेडीबी का उपयोग करना

मैं कई शीट्स के साथ एक्सेल वर्कबुक से ओलेडीबी का इस्तेमाल कर रहा हूं

मुझे शीट नामों को पढ़ने की ज़रूरत है, लेकिन मुझे उनकी आवश्यकता स्प्रेडशीट में परिभाषित क्रम में है; इसलिए यदि मेरे पास एक ऐसी फाइल है जो इस तरह दिखती है;

|_____|_____|____|____|____|____|____|____|____| |_____|_____|____|____|____|____|____|____|____| |_____|_____|____|____|____|____|____|____|____| \__GERMANY__/\__UK__/\__IRELAND__/ 

फिर मुझे शब्दकोश प्राप्त करने की आवश्यकता है

 1="GERMANY", 2="UK", 3="IRELAND" 

मैंने OleDbConnection.GetOleDbSchemaTable() का उपयोग करने की कोशिश की है, और वह मुझे नामों की सूची देता है, लेकिन यह वर्णानुक्रमिक रूप से उन्हें क्रमबद्ध करता है अल्फ़ा सॉर्ट का मतलब है मुझे नहीं पता है कि कौन सा शीट नंबर एक विशेष नाम से मेल खाती है। तो मुझे मिल गया;

 GERMANY, IRELAND, UK 

जिसने UK और IRELAND का क्रम बदल दिया है।

मुझे सॉर्ट करने के लिए इसकी ज़रूरत इसलिए है कि मुझे उपयोगकर्ता को नाम या सूचकांक से कई प्रकार का डेटा चुनना पड़ता है; वे 'जर्मनी से आइरलैंड के सभी आंकड़ों' या 'शीट 1 से शीट 3' डेटा के लिए पूछ सकते हैं

किसी भी विचार की बहुत प्रशंसा की जाएगी।

अगर मैं कार्यालय इंटरॉप कक्षाओं का इस्तेमाल कर सकता हूं, तो यह सीधा होगा। दुर्भाग्यवश, मैं नहीं कर सकता क्योंकि इंटरॉप कक्षाएं गैर-इंटरैक्टिव वातावरणों जैसे कि विंडोज सेवाओं और एएसपी.नेट साइट्स में मज़बूती से काम नहीं करती हैं, इसलिए मुझे ओएलईडीबी का उपयोग करने की आवश्यकता थी।

वेब के समाधान से एकत्रित समाधान "शीट आदेश में शीट नाम प्राप्त करने के लिए एक्सेल ऑलेडीबी का उपयोग करना"

यह वास्तविक एमएसडीएन प्रलेखन में नहीं मिल सकता है, लेकिन फ़ोरम में एक मध्यस्थ ने कहा

मुझे डर है कि OLEDB शीट ऑर्डर को संरक्षित नहीं करता क्योंकि वे Excel में थे

शीट ऑर्डर में एक्सेल शीट नेम

ऐसा लगता है कि यह एक सामान्य पर्याप्त आवश्यकता होगी कि एक सभ्य समाधान होगा।

क्या आप न केवल शीट्स के माध्यम से 0 से नाम 1 की गणना कर सकते हैं? इस तरह आपको सही क्रम में उन्हें मिलना चाहिए।

संपादित करें

मैंने टिप्पणियों के माध्यम से देखा कि शीट नामों को पुनः प्राप्त करने के लिए इंटरॉप कक्षाओं का उपयोग करने के बारे में कई चिंताएं हैं। इसलिए ये उन्हें पुनः प्राप्त करने के लिए OLEDB का उपयोग करने का एक उदाहरण है:

 /// <summary> /// This method retrieves the excel sheet names from /// an excel workbook. /// </summary> /// <param name="excelFile">The excel file.</param> /// <returns>String[]</returns> private String[] GetExcelSheetNames(string excelFile) { OleDbConnection objConn = null; System.Data.DataTable dt = null; try { // Connection String. Change the excel file to the file you // will search. String connString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + excelFile + ";Extended Properties=Excel 8.0;"; // Create connection object by using the preceding connection string. objConn = new OleDbConnection(connString); // Open connection with the database. objConn.Open(); // Get the data table containg the schema guid. dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); if(dt == null) { return null; } String[] excelSheets = new String[dt.Rows.Count]; int i = 0; // Add the sheet name to the string array. foreach(DataRow row in dt.Rows) { excelSheets[i] = row["TABLE_NAME"].ToString(); i++; } // Loop through all of the sheets if you want too... for(int j=0; j < excelSheets.Length; j++) { // Query each excel sheet. } return excelSheets; } catch(Exception ex) { return null; } finally { // Clean up. if(objConn != null) { objConn.Close(); objConn.Dispose(); } if(dt != null) { dt.Dispose(); } } } 

CodeProject पर आलेख से निकाले गए

चूंकि उपरोक्त कोड Excel 2007 के लिए शीट नाम सूची को निकालने के लिए प्रक्रियाओं को शामिल नहीं करता है, इसलिए निम्न कोड Excel (97-2003) और Excel 2007 दोनों के लिए भी लागू होगा:

 public List<string> ListSheetInExcel(string filePath) { OleDbConnectionStringBuilder sbConnection = new OleDbConnectionStringBuilder(); String strExtendedProperties = String.Empty; sbConnection.DataSource = filePath; if (Path.GetExtension(filePath).Equals(".xls"))//for 97-03 Excel file { sbConnection.Provider = "Microsoft.Jet.OLEDB.4.0"; strExtendedProperties = "Excel 8.0;HDR=Yes;IMEX=1";//HDR=ColumnHeader,IMEX=InterMixed } else if (Path.GetExtension(filePath).Equals(".xlsx")) //for 2007 Excel file { sbConnection.Provider = "Microsoft.ACE.OLEDB.12.0"; strExtendedProperties = "Excel 12.0;HDR=Yes;IMEX=1"; } sbConnection.Add("Extended Properties",strExtendedProperties); List<string> listSheet = new List<string>(); using (OleDbConnection conn = new OleDbConnection(sbConnection.ToString())) { conn.Open(); DataTable dtSheet = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); foreach (DataRow drSheet in dtSheet.Rows) { if (drSheet["TABLE_NAME"].ToString().Contains("$"))//checks whether row contains '_xlnm#_FilterDatabase' or sheet name(ie sheet name always ends with $ sign) { listSheet.Add(drSheet["TABLE_NAME"].ToString()); } } } return listSheet; } 

एक्सेल टाइप (97,2003,2007) दोनों के लिए विशेष रूप से एक्सेल फ़ाइल में शीट की फ़ंक्शन रिटर्न सूची।

दूसरा रास्ता:

एक xls (x) फ़ाइल * .zip कंटेनर में संग्रहीत * .xml फ़ाइलों का सिर्फ एक संग्रह है फ़ाइल डॉकप्रॉप में "app.xml" फाइल को अनझिप करें

 <?xml version="1.0" encoding="UTF-8" standalone="true"?> -<Properties xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes" xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"> <TotalTime>0</TotalTime> <Application>Microsoft Excel</Application> <DocSecurity>0</DocSecurity> <ScaleCrop>false</ScaleCrop> -<HeadingPairs> -<vt:vector baseType="variant" size="2"> -<vt:variant> <vt:lpstr>Arbeitsblätter</vt:lpstr> </vt:variant> -<vt:variant> <vt:i4>4</vt:i4> </vt:variant> </vt:vector> </HeadingPairs> -<TitlesOfParts> -<vt:vector baseType="lpstr" size="4"> <vt:lpstr>Tabelle3</vt:lpstr> <vt:lpstr>Tabelle4</vt:lpstr> <vt:lpstr>Tabelle1</vt:lpstr> <vt:lpstr>Tabelle2</vt:lpstr> </vt:vector> </TitlesOfParts> <Company/> <LinksUpToDate>false</LinksUpToDate> <SharedDoc>false</SharedDoc> <HyperlinksChanged>false</HyperlinksChanged> <AppVersion>14.0300</AppVersion> </Properties> 

फ़ाइल एक जर्मन फ़ाइल है (अर्बिट्सबैटर = वर्कशीट्स) तालिका नाम (Tabelle3 आदि) सही क्रम में हैं। आपको ये टैग पढ़ने की ज़रूरत है;)

सादर

मैंने @ क्रैपी ( https://stackoverflow.com/a/19930386/2617732 ) से दिए गए उत्तर में दी गई जानकारी का उपयोग करके निम्न फ़ंक्शन का निर्माण किया है। इसका इस्तेमाल करने के लिए नेट फ्रेमवर्क v4.5 की आवश्यकता होती है और सिस्टम। आईओ कॉम्प्रेशन के संदर्भ की आवश्यकता होती है। यह केवल xlsx फ़ाइलों के लिए काम करता है और पुरानी xls फ़ाइलों के लिए नहीं।

  using System.IO.Compression; using System.Xml; using System.Xml.Linq; static IEnumerable<string> GetWorksheetNamesOrdered(string fileName) { //open the excel file using (FileStream data = new FileStream(fileName, FileMode.Open)) { //unzip ZipArchive archive = new ZipArchive(data); //select the correct file from the archive ZipArchiveEntry appxmlFile = archive.Entries.SingleOrDefault(e => e.FullName == "docProps/app.xml"); //read the xml XDocument xdoc = XDocument.Load(appxmlFile.Open()); //find the titles element XElement titlesElement = xdoc.Descendants().Where(e => e.Name.LocalName == "TitlesOfParts").Single(); //extract the worksheet names return titlesElement .Elements().Where(e => e.Name.LocalName == "vector").Single() .Elements().Where(e => e.Name.LocalName == "lpstr") .Select(e => e.Value); } } 

मुझे शीट्स का नाम 1_जेर्नी, 2_यूके, 3_IRELAND के नाम पर @ एथ एपरिल के विचार पसंद आया। मुझे सैकड़ों शीट्स के लिए यह नाम बदलने के लिए आपका मुद्दा मिला है यदि आपको पत्रक के नाम का नाम बदलने में कोई समस्या नहीं है तो आप इस मैक्रो का इस्तेमाल आपके लिए कर सकते हैं। सभी शीट नामों के नाम बदलने के लिए सेकंड से कम समय लगेगा दुर्भाग्य से ओडीबीसी, ओएलईडीबी ने एसीसी द्वारा शीट का नाम क्रम वापस किया इसके लिए कोई जगह नहीं है आपको या तो COM का उपयोग करना होगा या अपने नाम को क्रम में होना चाहिए।

 Sub Macro1() ' ' Macro1 Macro ' ' Dim i As Integer For i = 1 To Sheets.Count Dim prefix As String prefix = i If Len(prefix) < 4 Then prefix = "000" ElseIf Len(prefix) < 3 Then prefix = "00" ElseIf Len(prefix) < 2 Then prefix = "0" End If Dim sheetName As String sheetName = Sheets(i).Name Dim names names = Split(sheetName, "-") If (UBound(names) > 0) And IsNumeric(names(0)) Then 'do nothing Else Sheets(i).Name = prefix & i & "-" & Sheets(i).Name End If Next End Sub 

अद्यतनः बीआईएफएफ के बारे में सिडहॉलैंड की टिप्पणी को पढ़ने के बाद एक विचार लगीं। निम्नलिखित कदम कोड के माध्यम से किया जा सकता है पता नहीं कि क्या आप वास्तव में ऐसा ही करना चाहते हैं ताकि शीट नाम एक ही क्रम में प्राप्त कर सकें मुझे बताएं कि आपको कोड के माध्यम से ऐसा करने में मदद की ज़रूरत है

 1. Consider XLSX as a zip file. Rename *.xlsx into *.zip 2. Unzip 3. Go to unzipped folder root and open /docprops/app.xml 4. This xml contains the sheet name in the same order of what you see. 5. Parse the xml and get the sheet names 

अद्यतनः एक और समाधान – एनपीओआई यहां उपयोगी हो सकता है http://npoi.codeplex.com/

  FileStream file = new FileStream(@"yourexcelfilename", FileMode.Open, FileAccess.Read); HSSFWorkbook hssfworkbook = new HSSFWorkbook(file); for (int i = 0; i < hssfworkbook.NumberOfSheets; i++) { Console.WriteLine(hssfworkbook.GetSheetName(i)); } file.Close(); 

यह समाधान एक्सएलएस के लिए काम करता है। मैंने एक्सएलएसएक्स की कोशिश नहीं की।

धन्यवाद,

Esen

यह मेरे लिए काम किया यहां से चोरी हो गई: आप एक्सेल वर्कबुक के प्रथम पृष्ठ का नाम कैसे प्राप्त करते हैं?

  object opt = System.Reflection.Missing.Value; Excel.Application app = new Microsoft.Office.Interop.Excel.Application(); Excel.Workbook workbook = app.Workbooks.Open(WorkBookToOpen, opt, opt, opt, opt, opt, opt, opt, opt, opt, opt, opt, opt, opt, opt); Excel.Worksheet worksheet = workbook.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet; string firstSheetName = worksheet.Name; 

इसे इस्तेमाल करे। शीट नामों को क्रम में प्राप्त करने के लिए यहां कोड दिया गया है

  private Dictionary<int,string> GetExcelSheetNames(string fileName) { Excel.Application _excel = null; Excel.Workbook _workBook = null; Dictionary<int,string> excelSheets = new Dictionary<int,string>(); try { object missing = Type.Missing; object readOnly = true; Excel.XlFileFormat.xlWorkbookNormal _excel = new Excel.ApplicationClass(); _excel.Visible = false; _workBook = _excel.Workbooks.Open(fileName, 0, readOnly, 5, missing, missing, true, Excel.XlPlatform.xlWindows, "\\t", false, false, 0, true, true, missing); if (_workBook != null) { int index = 0; foreach (Excel.Worksheet sheet in _workBook.Sheets) { // Can get sheet names in order they are in workbook excelSheets.Add(++index, sheet.Name); } } } catch (Exception e) { return null; } finally { if (_excel != null) { if (_workBook != null) { _workBook.Close(false, Type.Missing, Type.Missing); } _excel.Application.Quit(); } _excel = null; _workBook = null; } return excelSheets; } 

एमएसडीएन के अनुसार, एक्सेल के अंदर स्प्रेडशीट के मामले में यह काम नहीं करेगा क्योंकि एक्सेल फाइल असली डेटाबेस नहीं हैं तो आप कार्यपुस्तिका में उनके विज़ुअलाइज़ेशन के क्रम में शीट नाम प्राप्त करने में सक्षम नहीं होंगे।

इंटरॉप का उपयोग करते हुए उनके दृश्य उपस्थिति के अनुसार पत्रक नाम प्राप्त करने के लिए कोड:

Microsoft Excel 12.0 ऑब्जेक्ट लायब्रेरी का संदर्भ जोड़ें।

निम्न कोड कार्यपुस्तिका में संग्रहीत वास्तविक क्रम में शीट नाम देगा, सॉर्ट किए गए नाम नहीं।

नमूना कोड:

 using Microsoft.Office.Interop.Excel; string filename = "C:\\romil.xlsx"; object missing = System.Reflection.Missing.Value; Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel.Workbook wb =excel.Workbooks.Open(filename, missing, missing, missing, missing,missing, missing, missing, missing, missing, missing, missing, missing, missing, missing); ArrayList sheetname = new ArrayList(); foreach (Microsoft.Office.Interop.Excel.Worksheet sheet in wb.Sheets) { sheetname.Add(sheet.Name); } 

मुझे कोई भी दस्तावेज़ नहीं दिखाई देता है जो कहता है कि ऐप.एक्सएमएल में आदेश शीट्स का ऑर्डर होने की गारंटी है। यह संभवतः है, लेकिन ओओएक्सएमएल विनिर्देश के अनुसार नहीं है।

दूसरी ओर कार्यपुस्तिका.एक्सएमएल फ़ाइल, शीटआईडी विशेषता को शामिल करती है, जो क्रम को निर्धारित करती है – 1 से शीट की संख्या तक। यह ओओएक्सएमएल विनिर्देश के अनुसार है वर्कबुक.एक्सएमएल को उस स्थान के रूप में वर्णित किया गया है जहां शीट्स का अनुक्रम रखा जाता है।

तो वर्कबुक एक्सएमएल पढ़ने के बाद एक्सएलएसएक्स की मेरी सिफारिश होगी। नहीं app.xml DocProps / app.xml के बजाय, xl / workbook.xml का उपयोग करें और तत्व को देखो, जैसा कि यहां दिखाया गया है –

`

 <workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"> <fileVersion appName="xl" lastEdited="5" lowestEdited="5" rupBuild="9303" /> <workbookPr defaultThemeVersion="124226" /> - <bookViews> <workbookView xWindow="120" yWindow="135" windowWidth="19035" windowHeight="8445" /> </bookViews> - <sheets> <sheet name="By song" sheetId="1" r:id="rId1" /> <sheet name="By actors" sheetId="2" r:id="rId2" /> <sheet name="By pit" sheetId="3" r:id="rId3" /> </sheets> - <definedNames> <definedName name="_xlnm._FilterDatabase" localSheetId="0" hidden="1">'By song'!$A$1:$O$59</definedName> </definedNames> <calcPr calcId="145621" /> </workbook> 

`