This is my first article. In this article we will learn how to read an
excel file. We will make a windows application using C#. Let’s start.
- Open Visual Studio. Select New Project, then Windows Form Application.
- Name it as you want. My applications name is ReadExcelFileApp.
- First of all add Reference of Excel library. Right click on the Reference in the solution explorer.
Assemblies, Extensions, then Microsoft.Office.Interop.Excel.
If you are using Visual Studio 2010, then you can add Reference using two ways:
Right click on References then select Add Reference. After that a dialog appears,
- Browse, C drive, Microsoft Office, Office12, then open EXCEL.EXE.
- Select .NET tab then choose Microsoft.Office.Interop.Excel.
- After adding Reference add namespace using Excel = Microsoft.Office.Interop.Excel; and other namespaces as shown in the figure.
- Add two buttons Choose and Read File and Close.
- Add a DataGridView to see the result (excel data).
- Create a method ReadExcel who returns a datatable using the following logic.
- public DataTable ReadExcel(string fileName, string fileExt) {
- string conn = string.Empty;
- DataTable dtexcel = new DataTable();
- if (fileExt.CompareTo(".xls") == 0)
- conn = @"provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties='Excel 8.0;HRD=Yes;IMEX=1';";
- else
- conn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties='Excel 12.0;HDR=NO';";
- using(OleDbConnection con = new OleDbConnection(conn)) {
- try {
- OleDbDataAdapter oleAdpt = new OleDbDataAdapter("select * from [Sheet1$]", con);
- oleAdpt.Fill(dtexcel);
- } catch {}
- }
- return dtexcel;
- }
Let's discuss something about ReadExcel() method.
Firstly, we will decide whether the file has extension .xls or .xlsx because there is a difference between the connection strings of both the files.
If the file has extension .xls, then the connection string will be the following:
provider=Microsoft.Jet.OLEDB.4.0;Data Source='fileName';Extended Properties='Excel 8.0;HRD=Yes;IMEX=1';
Otherwise
Provider=Microsoft.ACE.OLEDB.12.0;Data Source='FileName';Extended Properties='Excel 12.0;HDR=NO';"
Here HDR is the header field ,depend upon you,whether you want to add or not,
IMEX=1 is used to retrieve the mixed data from the columns.
Now by using the OleDbConnection define an OleDbDataAdapter.
- OleDbDataAdapter oleAdpt = new OleDbDataAdapter("select * from [Sheet1$]", con);
Here Sheet1 is the sheet number that you want to select, you can select any sheet e.g. Sheet2, Sheet3, etc. If you want to choose some specific columns, then you can. For example, you want to read just 2 columns say Name and Salary from the excel file then your query be like the following:
Select Name,Salary from [Sheet1$]
If there are no headers in complex excel files then you can select columns like F1, F20 etc. In that case the query be like the following:
Select F11,F41,F70 from [Sheet1$]
- Add the following logic in button click events.
- private void btnChooseFile_Click(object sender, EventArgs e) {
- string filePath = string.Empty;
- string fileExt = string.Empty;
- OpenFileDialog file = new OpenFileDialog();
- if (file.ShowDialog() == System.Windows.Forms.DialogResult.OK)
- {
- filePath = file.FileName;
- fileExt = Path.GetExtension(filePath);
- if (fileExt.CompareTo(".xls") == 0 || fileExt.CompareTo(".xlsx") == 0) {
- try {
- DataTable dtExcel = new DataTable();
- dtExcel = ReadExcel(filePath, fileExt);
- dataGridView1.Visible = true;
- dataGridView1.DataSource = dtExcel;
- } catch (Exception ex) {
- MessageBox.Show(ex.Message.ToString());
- }
- } else {
- MessageBox.Show("Please choose .xls or .xlsx file only.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- }
- }
-
- private void btnClose_Click(object sender, EventArgs e) {
- this.Close();
- }
After choosing the file Result will be like the following whether you upload .xls or .xlsx file.