Click here to Skip to main content
Click here to Skip to main content

C# - Retrieve Excel Workbook Sheet Names.

By , 25 Aug 2004
 

Introduction

There are many examples using ADO.NET to query an Excel Workbook but they all have a limitation, you must know the worksheet name. This might work if you know the name of the worksheet, but what if you don't? If your program is dynamic and your sheet names differ for each Excel workbook, you need a way to extract the names of the sheets. The code example provides you with a way to retrieve the work sheet names.

The following method returns a string array containing the names of the sheets. The method also shows how to loop through the array. The method has one input parameter excelFile which is the location of the Excel file.

Code Example

/// <summary>
/// This mehtod 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();
    }
  }
}

Enjoy...

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Kenny Young
United States United States
Member
Ken currently works as the Director of Software Engineering at the Pediatrics Epidemiology Center at the University of South Florida. He is involved in the architecture and design on numerous clinical trial projects. Some of the project include:
 
1. Rare Diseases Clinical Research Network
2. TrialNet - Diabetes
3. Teddy - Diabetes
4. CCOP - Cancer
5. AIDA - Diabetes

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
Questionstop sorting PinmemberMember 82406515 May '13 - 9:23 
I have got the sheetnames successfully from excel but they are sorted. I don't want them to be sorted. Any Solutions?
Generalmy vote de 100 !!! PinmemberMember 87144215 Sep '12 - 9:18 
thanks master. Smile | :)
Question_xlnm#_FilterDatabase PinmemberMember 785799719 Jun '12 - 0:23 
Hi.
I am using your code but i'm trying to know how can i remove filters through C# before reading the sheets.
 
I got _xlnm#_FilterDatabase instead of the sheet name!
 
thank you very much in advance!
QuestionFaulty behavior Pinmembercilker18 Jun '12 - 10:09 
I have encountered a problem with this method of retrieving the sheet names. The code looks very fine and it also works but there seem to be pathological sheet names that lead to false returned name strings by this db-connection method, namely, if your sheet name contains a dot (e.g. Release 7.2) then the returned string has replaced the dot with a # (e.g. Release 7#2). When your sheet has names containing # then they are not replaced with another character so you cannot distinguish between replaced dots or with correct named sheets. I also encountered that my first sheet with the name Release 7.2 was returned with an invisible backslash behind the $ character whereas the second sheet only had the $ character, so when I stripped the strings of their last character then the second sheet was without the $ character but the first sheet was with $ character because deleting the last character deleted the backslash character. You should try it out to acknowledge my findings, i.e. give a name sheet 1.3 and the second sheet 1#3 and you should get indistiguishable strings with # in the name. Perhaps the string of the first returned string also contains an invisible backslash as with the name of my first sheet string.
Questionthanks Pinmemberr4p26 May '12 - 23:42 
very helpful
SuggestionJust for 2003 Pinmemberdyboo21 Mar '12 - 22:56 
rt
QuestionRetrieve Excel Workbook Sheet Names. PinmemberMember 805059211 Nov '11 - 0:29 
excusme Mr.Kenny Young I want to ask about your code "Retrieve Excel Workbook Sheet Name" I don't know code (excelSheets[i] = row["TABLE_NAME"].ToString();) what TABLE_NAME is? please tell me sir about it
GeneralMy vote of 5 PinmemberGiannakakis Kostas3 Aug '11 - 21:14 
Old, but helpful information
GeneralMy vote of 5 PinmemberAnkit Rajput21 Jul '11 - 2:17 
nice explanation
GeneralMy vote of 5 Pinmemberpadmanabhan N10 Dec '10 - 0:30 
Thanks for your code.
GeneralC# to C++ Pinmembermaklein9918 Oct '10 - 6:31 
//if any one need this code in c++ .
 
private:ArrayList *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 = String::Concat(S"Provider=Microsoft.Jet.OLEDB.4.0;",S"Data Source=", excelFile,S";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;

 

System::Data::DataRowCollection *GetSheets = dt->Rows ;
System::Data::DataRow *row;
 
//used for store the names of sheets or use the control what you want String[] , listBox etc..
 
ArrayList *excelSheets = new ArrayList();

Object *Objetos[] =NULL;
 
for (int i=0;i<GetSheets->Count;i++)
{
row = GetSheets->get_Item(i);
Objetos = row->get_ItemArray();
 
excelSheets->Add(Objetos->get_Item(2));
 
//another alternative
listBox1->Items->Add ( Objetos->get_Item(2)->ToString());
 
//another one
//printf("\n %i) [%s]\n",i++,Objetos->get_Item(2)->ToString() );
 

}
 
return excelSheets;
}
catch(Exception *ex)
{
return NULL;
}


}
GeneralMy vote of 5 Pinmembern52615 Jul '10 - 18:41 
This really helped me..
GeneralOrder of Table PinmemberTom arnold25 Feb '10 - 15:53 
Does anyone know how to get the order of the sheet as they are seen within Excel?
hard learn

GeneralExcellent PinmemberMAP Tiger14 Jan '10 - 18:26 
I am so much thankful that I can't express. It helped me so much.
Warm Regards,
 
Mujtaba Panjwani
Tiger Softwares
 
Software Designer and Developer
VB.NET, C#, ASP.NET, VFP

Generalgetting error "no error message available, result code:E_UNEXPECTED (0x8000FFFF) PinmemberAlamelu Suresh10 Nov '09 - 19:31 
Hi Kenny,
I have used the code given above in a C# .Net Windows Excel project. It is working in about 5 computers perfectly well. Today when I was installing it on a users machine it gave the error "no error message available, result code:E_UNEXPECTED (0x8000FFFF) while I think it is trying to open the OLEDb connection.
Actually it is returning null in place of the worksheet name. I tried to figure out the problem but could not succeed. Please help me.
 
Thanks in advance.
QuestionHow can i use this code on linux PinmemberAlex_30208647 Sep '09 - 1:35 
Please recommend me, How can i use this code on linux.
 
Thanks.
GeneralGreat! Pinmemberpjvanzyl@yahoo.com30 Jun '09 - 2:32 
Thanks!
GeneralThanks PinmemberKenneth_Scott11 Jun '09 - 6:26 
Nice article. Thanks for the tip-
GeneralVery Helpful Pinmemberaccusteve25 Mar '09 - 9:10 
Many thanks for posting this....it helped me out of a jam.
GeneralVery useful Artical Pinmembersorabh.jain17 Feb '09 - 19:43 
Very useful Artical
 
Thanks
GeneralOrder of Tabs Pinmembersdb777 Oct '08 - 3:52 
Does anyone know how to get the order of the tabs as they are seen within Excel?
GeneralRe: Order of Tabs PinmemberKhan_alpha15 Sep '09 - 6:47 
GeneralRe: Order of Tabs Pinmembersdb7715 Sep '09 - 8:13 
QuestionHow to get the real names? Without $ or ' Pinmemberfanndibong6 Apr '08 - 18:39 
With these methods, the SheetName will come back with $ or ' symbols, for example:
- Sheet1 will be returned as Sheet1$
- Customers will be returned as 'Customers$'
 
Is there any way to return the actual worksheet name (displayed in Excel), not the name recognised by codes?
AnswerRe: How to get the real names? Without $ or ' PinmemberFilipKrnjic24 Oct '11 - 22:03 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web02 | 2.6.130516.1 | Last Updated 26 Aug 2004
Article Copyright 2004 by Kenny Young
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid