C# 操作 Excel 进行文件读写操作

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("登记失败,请放入下一张卡!");
	                             }
上一篇:P3017 [USACO11MAR]Brownie Slicing G 题解


下一篇:小学生都看得懂的C语言入门(5): 指针