OLEDB 组件是微软开发的用于连接 Excel 工作簿,将 Excel 文件作为数据源进行读写,在使用时与 SQL 几乎一样。
1 引入命名空间
using System.Data.OleDb; // 使用命名空间
2 查询操作
// 查询学生信息 private DataRowCollection findStudentById() { string id = textNumber.Text; // 查询语句,Sheet1 是工作簿中的表名,后面的$是语法要求,必须加上 string SqlText = "select * from [Sheet1$] where 证件号 = '" + id + "'"; // 使用 LoadDataFromExcel 函数从 excel_File_Path 给定的路径读取工作簿内容,SqlText 作为查询语句,返回一个 DataSet 类型 DataSet ds = LoadDataFromExcel(excel_File_Path, SqlText); // 得到一个数据表的集合,存放了所有的 Sheet DataTableCollection datatable_collection = ds.Tables; // 取出 数据表集合的第 1 个值,返回一个 DataTable 对象 DataTable dt = datatable_collection[0]; // 第一张表就是我们的数据 // 返回该 Sheet 的所有行记录 return dt.Rows; } // 从Excel中加载数据 private DataSet LoadDataFromExcel(string DataFileName, string SqlText) { try { // 连接语句,指定读取的文件名 string strConn = "Provider=microsoft.ace.oledb.12.0;Extended Properties=Excel 8.0;Data Source=" + DataFileName; // 新建 OleDbConnection 连接对象 OleDbConnection Conn = new OleDbConnection(strConn); Conn.Open(); // 打开连接 OleDbCommand Cmd = new OleDbCommand(SqlText, Conn); OleDbDataAdapter oda = new OleDbDataAdapter(); oda.SelectCommand = Cmd; DataSet ds = new DataSet(); oda.Fill(ds); Conn.Close(); // 关闭连接 return ds; } catch { MessageBox.Show("请先导入表格!"); return null; } }
3 插入操作
// 登记来访学生信息 private int InsertDetectedStudentInfo(string xh, string xm, string sex, string id_Card, string xznj, string xy, string zy, string bj, string sfzj, string xszt, string syd, string mz, string xslb) { // 获取需要执行插入操作的 excel 文件名 string DataFileName = create_excel_path; string strConn = "Provider=microsoft.ace.oledb.12.0;Extended Properties=Excel 8.0;Data Source=" + DataFileName; OleDbConnection Conn = new OleDbConnection(strConn); Conn.Open(); // 插入语句 insert into [Sheet1$] (字段名1,字段名2,...,字段名n) values (?,?,...,?) OleDbCommand top = new OleDbCommand("insert into [Sheet1$] (学号,姓名,性别,证件号,现在年级,学院,专业,班级,是否在籍,学生状态,生源地,民族,学生类别) values(?,?,?,?,?,?,?,?,?,?,?,?,?)", Conn); // top.Parameters.AddWithValue("?", 变量名) 这种写法较优,推荐使用 top.Parameters.AddWithValue("?", xh); top.Parameters.AddWithValue("?", xm); top.Parameters.AddWithValue("?", sex); top.Parameters.AddWithValue("?", id_Card); top.Parameters.AddWithValue("?", xznj); top.Parameters.AddWithValue("?", xy); top.Parameters.AddWithValue("?", zy); top.Parameters.AddWithValue("?", bj); top.Parameters.AddWithValue("?", sfzj); top.Parameters.AddWithValue("?", xszt); top.Parameters.AddWithValue("?", syd); top.Parameters.AddWithValue("?", mz); top.Parameters.AddWithValue("?", xslb); // 如果执行成功,返回受到影响的行数,应该是一个非0数字 int res = top.ExecuteNonQuery(); Conn.Close(); return res; }
4 测试查询以及插入函数,仅展示部分代码段
// 调用查询函数,返回数据行集合 DataRowCollection drc = findStudentById(); // 查询到了记录 if (drc.Count > 0) { // 获取第 0 行 第 0 列数据值 string xh = drc[0][0].ToString(); string xm = drc[0][1].ToString(); string sex = drc[0][2].ToString(); string id_Card = drc[0][3].ToString(); string xznj = drc[0][4].ToString(); string xy = drc[0][5].ToString(); string zy = drc[0][6].ToString(); string bj = drc[0][7].ToString(); string sfzj = drc[0][8].ToString(); string xszt = drc[0][9].ToString(); string syd = drc[0][10].ToString(); string mz = drc[0][11].ToString(); string xslb = drc[0][12].ToString(); // 将这些数据值插入到 excel 文件中 int res = InsertDetectedStudentInfo(xh, xm, sex, id_Card, xznj, xy, zy, bj, sfzj, xszt, syd, mz, xslb); if (res > 0) { MessageBox.Show("核酸检测完成,已将该生信息登记入表!"); } else { MessageBox.Show("登记失败,请放入下一张卡!"); }