Read Excel File with .NET

Introduction

 
It is possible that we need to read Excel files when developing. In this article, I will show one method to read Excel file contents with .NET.
 
As is known, there are three types of Excel file.
  1. .xls format Office 2003 and the older version
  2. .xlsx format Office 2007 and the last version
  3. .csv format String text by separating with comma (the above two format can be saved as this format.)
We need to use different ways to read the first, second format files and the third format files.
 
Using the Code
 
Foreground
  1. <div>  
  2.        <%-- file upload control, using to upload the file which will be read and get file information--%>  
  3.        <asp:FileUpload ID="fileSelect" runat="server" />    
  4.        <%-- click this button to run read method--%>  
  5.        <asp:Button ID="btnRead" runat="server" Text="ReadStart" />  
  6. </div> 
Background
  1. //Declare Variable (property)  
  2. string currFilePath = string.Empty; //File Full Path  
  3. string currFileExtension = string.Empty; //File Extension  
  4.   
  5. //Page_Load Event, Register Button Click Event  
  6. protected void Page_Load(object sender, EventArgs e) {  
  7.   this.btnRead.Click += new EventHandler(btnRead_Click);  
  8. }  
  9.   
  10. //Button Click Event   
  11. protected void btnRead_Click(object sender, EventArgs e) {  
  12.   Upload(); //Upload File Method  
  13.   if (this.currFileExtension == ".xlsx" || this.currFileExtension == ".xls") {  
  14.     DataTable dt = ReadExcelToTable(currFilePath); //Read Excel File (.XLS and .XLSX Format)  
  15.   } else if (this.currFileExtension == ".csv") {  
  16.     DataTable dt = ReadExcelWidthStream(currFilePath); //Read .CSV File  
  17.   }  
The following shows three methods in button click event.
  1. ///<summary>  
  2. ///Upload File to Temporary Category  
  3. ///</summary>  
  4. private void Upload() {  
  5.   HttpPostedFile file = this.fileSelect.PostedFile;  
  6.   string fileName = file.FileName;  
  7.   string tempPath = System.IO.Path.GetTempPath(); //Get Temporary File Path  
  8.   fileName = System.IO.Path.GetFileName(fileName); //Get File Name (not including path)  
  9.   this.currFileExtension = System.IO.Path.GetExtension(fileName); //Get File Extension  
  10.   this.currFilePath = tempPath + fileName; //Get File Path after Uploading and Record to Former Declared Global Variable  
  11.   file.SaveAs(this.currFilePath); //Upload  
  12. }  
  13.   
  14. ///<summary>  
  15. ///Method to Read XLS/XLSX File  
  16. ///</summary>  
  17. ///<param name="path">Excel File Full Path</param>  
  18. ///<returns></returns>  
  19. private DataTable ReadExcelToTable(string path) {  
  20.   //Connection String  
  21.   string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"// Extra blank space cannot appear in Office 2007 and the last version. And we need to pay attention on semicolon.  
  22.   string connstring = Provider = Microsoft.JET.OLEDB .4 .0;  
  23.   Data Source = " + path + ";  
  24.   Extended Properties = " 'Excel 8.0;HDR=NO;IMEX=1';"//This connection string is appropriate for Office 2007 and the older version. We can select the most suitable connection string according to Office version or our program.  
  25.   using(OleDbConnection conn = new OleDbConnection(connstring)) {  
  26.     conn.Open();  
  27.     DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { nullnullnull"Table" }); //Get All Sheets Name  
  28.     string firstSheetName = sheetsName.Rows[0][2].ToString(); //Get the First Sheet Name  
  29.     string sql = string.Format("SELECT * FROM [{0}],firstSheetName"); //Query String  
  30.     OleDbDataAdapter ada = new OleDbDataAdapter(sql, connstring);  
  31.     DataSet set = new DataSet();  
  32.     ada.Fill(set);  
  33.     return set.Tables[0];  
  34.   }  
  35. }  
  36. ///<summary>  
  37. ///Method to Read CSV Format  
  38. ///</summary>  
  39. ///<param name="path">Read File Full Path</param>  
  40. ///<returns></returns>  
  41. private DataTable ReadExcelWithStream(string path) {  
  42.   DataTable dt = new DataTable();  
  43.   bool isDtHasColumn = false//Mark if DataTable Generates Column  
  44.   StreamReader reader = new StreamReader(path, System.Text.Encoding.Default); //Data Stream  
  45.   while (!reader.EndOfStream) {  
  46.     string meaage = reader.ReadLine();  
  47.     string[] splitResult = message.Split(new char[] { ',' }, StringSplitOption.None); //Read One Row and Separate by Comma, Save to Array  
  48.     DataRow row = dt.NewRow();  
  49.     for (int i = 0; i < splitResult.Length; i++) {  
  50.       if (!isDtHasColumn) //If not Generate Column  
  51.       {  
  52.         dt.Columns.Add("column" + i, typeof(string));  
  53.       }  
  54.       row[i] = splitResult[i];  
  55.     }  
  56.     dt.Rows.Add(row); //Add Row  
  57.     isDtHasColumn = true//Mark the Existed Column after Read the First Row, Not Generate Column after Reading Later Rows  
  58.   }  
  59.   return dt;  

Conclusion

 
This article is just used for reference and studying easily. Therefore, there are not complicated situations considered in this method.
 
In addition, I want to recommand two articles about operating Excel for you.
 
http://www.codeproject.com/KB/aspnet/coolcode2_aspx.aspx
 
http://www.codeproject.com/KB/cs/csharpexcel.aspx