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]
x
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);