使用列名从excel中读取数据并插入到C#中的SQL表中
Posted
技术标签:
【中文标题】使用列名从excel中读取数据并插入到C#中的SQL表中【英文标题】:Read data from excel using column name and insert in to SQL table in C# 【发布时间】:2021-02-10 21:57:31 【问题描述】:我正在实施一个使用 Excel 表格上传考试成绩的系统。 Excel 表格内容包括学生索引号、姓名和成绩以及他们参加的考试(通过/失败状态)。考试名称和需要参加的考试数量可能因学生而异。
[Excel工作表格式]
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
我需要将这些数据以这种格式保存到 SQL 表中
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.
我设法从 excel 表中读取列名,并使用此代码将其添加到列表中。
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);
现在我需要使用该列名逐行读取 Excel 工作表中的数据。 谁能帮帮我?
【问题讨论】:
【参考方案1】:你可以试试这个:
对于这个例子,我创建了一个类来按行收集结果,这些行将被发送到 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;
以及读取 Excel 文件的代码:
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);
【讨论】:
感谢您的回答。但就我而言,考试名称可能是科学、艺术、历史、数学等。 但是您的 excel 文件是否总是包含考试的列数?或者有时有 4、10、15 个考试(列)? 是的,前三列是固定的,但考试列的数量可能会有所不同,例如每个 excel 表有 5、8、10 个考试。 我修改了代码从第三列到最后一列,动态取考试名以上是关于使用列名从excel中读取数据并插入到C#中的SQL表中的主要内容,如果未能解决你的问题,请参考以下文章
如何从 excel 中读取数据并推入 asp.net 中的数组?