使用列名从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表中的主要内容,如果未能解决你的问题,请参考以下文章

C#读取EXCEL中的信息,并保存到数据库

从 excel 中读取数据并插入 HIVE

c#操作EXCEL

如何从 excel 中读取数据并推入 asp.net 中的数组?

在 C# 中以编程方式从 Excel 文件中大量导入数据到 Access

无法从 C# 中的 excel 文件中读取数值