I am implementing a system to upload exam marks using Excel sheet. Excel sheet content the student Index number, Name and Grade and the Exams they have taken with Pass/Fail status. Names of the exams and number of exams need to face may vary from student to student.
[Excel sheet format]
Index# | Name | Grade | Exam 1 | Exam 2 | Exam 3 | Exam 4 1 | John | 5 | Pass | Fail | N/A | Pass 2 | Tom | 6 | Pass | Pass | Pass | N/A 3 | Bob | 8 | N/A | Fail | Pass | Pass 4 | Harry | 7 | Pass | Pass | Pass | Pass
I need to save this data into a SQL table in this format
Index# | Name | Grade | Exam_Name | Status 1 | John | 5 | Exam 1 | Pass 1 | John | 5 | Exam 2 | Fail 1 | John | 5 | Exam 4 | Pass 2 | Tom | 6 | Exam 1 | Pass 2 | Tom | 6 | Exam 2 | Pass 2 | Tom | 6 | Exam 3 | Pass etc.
I manage to read the column name from the excel sheet and add it to a list using this code.
System.Data.OleDb.OleDbConnection Sconn = new System.Data.OleDb.OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Savelocation + ("" + FileName + "") + ";Extended Properties=Excel 8.0"); var adapter = new OleDbDataAdapter("SELECT * FROM [Marks$]", Sconn); var ds = new DataSet(); adapter.Fill(ds, "myTable"); DataTable data = ds.Tables["myTable"]; List<string> ColumnList = new List<string>(); foreach (DataColumn dc in data.Columns) { ColumnList.Add(dc.ColumnName); }
Now I need to read the data row by row in the excel sheet using this column names. Can anyone help me please ?
Advertisement
Answer
You can try this:
For this example I have created a class to collect the results by rows that will be destined to SQL:
C#
public class Result { public string Index { get; set; } public string Name { get; set; } public string Grade { get; set; } public string Exam_Name { get; set; } public string Status { get; set; } }
And the code for read the Excel file:
C#
System.Data.OleDb.OleDbConnection Sconn = new System.Data.OleDb.OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Savelocation + ("" + FileName + "") + ";Extended Properties=Excel 8.0"); var adapter = new OleDbDataAdapter("SELECT * FROM [Marks$]", Sconn); var ds = new DataSet(); adapter.Fill(ds, "myTable"); DataTable data = ds.Tables["myTable"]; List<Result> r = new List<Result>(); foreach (DataRow row in data.Rows) { for (int i = 3; i < data.Columns.Count; i++) { string indexCell = (string)row["Index"], nameCell = (string)row["Name"], gradeCell = (string)row["Grade"], examCell = data.Columns[i].ColumnName, passCell = (string)row[i]; r.Add(new Result() { Index = indexCell, Name = nameCell, Grade = gradeCell, Exam_Name = examCell, Status = passCell }); // Or call your logic for send this data to SQL and INSERT the data } } Console.Write(r);