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.
- .xls format Office 2003 and the older version
- .xlsx format Office 2007 and the last version
- .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
<div>
<%-- file upload control, using to upload the file which will be read
and get file information--%>
<asp:FileUpload ID="fileSelect" runat="server" />
<%-- click this button to run read method--%>
<asp:Button ID="btnRead" runat="server" Text="ReadStart" />
</div>
Background
//Declare Variable (property)
string currFilePath = string.Empty; //File Full Path
string currFileExtension = string.Empty; //File Extension
//Page_Load Event, Register Button Click Event
protected void Page_Load(object sender,EventArgs e)
{
this.btnRead.Click += new EventHandler(btnRead_Click);
}
//Button Click Event
protected void btnRead_Click(object sender,EventArgs e)
{
Upload(); //Upload File Method
if(this.currFileExtension ==".xlsx" || this.currFileExtension ==".xls")
{
DataTable dt = ReadExcelToTable(currFilePath); //Read Excel File (.XLS
and .XLSX Format)
}
else if(this.currFileExtension == ".csv")
{
DataTable dt = ReadExcelWidthStream(currFilePath); //Read .CSV
File
}
}
The following shows three
methods in button click event.
///<summary>
///Upload File to Temporary Category
///</summary>
private void Upload()
{
HttpPostedFile file = this.fileSelect.PostedFile;
string fileName = file.FileName;
string tempPath = System.IO.Path.GetTempPath(); //Get Temporary File Path
fileName = System.IO.Path.GetFileName(fileName); //Get File Name (not
including path)
this.currFileExtension = System.IO.Path.GetExtension(fileName); //Get
File Extension
this.currFilePath = tempPath + fileName; //Get File Path after Uploading
and Record to Former Declared Global Variable
file.SaveAs(this.currFilePath); //Upload
}
///<summary>
///Method to Read XLS/XLSX File
///</summary>
///<param name="path">Excel File Full Path</param>
///<returns></returns>
private DataTable ReadExcelToTable(string path)
{
//Connection String
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.
string connstring = Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + path +
";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.
using(OleDbConnection conn = new OleDbConnection(connstring))
{
conn.Open();
DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new
object[]{null,null,null,"Table"}); //Get All Sheets Name
string firstSheetName = sheetsName.Rows[0][2].ToString(); //Get the First
Sheet Name
string sql = string.Format("SELECT * FROM [{0}],firstSheetName); //Query
String
OleDbDataAdapter ada =new OleDbDataAdapter(sql,connstring);
DataSet set = new DataSet();
ada.Fill(set);
return set.Tables[0];
}
}
///<summary>
///Method to Read CSV Format
///</summary>
///<param name="path">Read File Full Path</param>
///<returns></returns>
private DataTable ReadExcelWithStream(string path)
{
DataTable dt = new DataTable();
bool isDtHasColumn = false; //Mark if DataTable Generates Column
StreamReader reader = new StreamReader(path,System.Text.Encoding.Default);
//Data Stream
while(!reader.EndOfStream)
{
string meaage = reader.ReadLine();
string[] splitResult = message.Split(new char[]{','},StringSplitOption.None);
//Read One Row and Separate by Comma, Save to Array
DataRow row = dt.NewRow();
for(int i = 0;i<splitResult.Length;i++)
{
if(!isDtHasColumn) //If not Generate Column
{
dt.Columns.Add("column" + i,typeof(string));
}
row[i] = splitResult[i];
}
dt.Rows.Add(row); //Add Row
isDtHasColumn = true; //Mark the Existed Column after Read the
First Row, Not Generate Column after Reading Later Rows
}
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