C# 利用 OleDb 组件操作 Excel 进行文件读写操作
OleDb 是微软开发用于连接 Excel 工作簿,将 Excel 文件作为数据源进行读写操作的组件,在使用时执行语句语法规则与 SQL 一样。
1. 下载支持插件
在使用 OleDb 组件之前,需要先下载支持 OledDb 的插件 Microsoft Access Database Engine 2010 Redistributable
,否则程序在对 Excel 文件进行读写操作时会出现如下异常
引发的异常:“System.InvalidOperationException”(位于 System.Data.dll 中)
引发的异常:“System.InvalidOperationException”(位于 System.Data.dll 中)
引发的异常:“System.InvalidOperationException”(位于 System.Data.dll 中)
从异常信息中可以发现,异常是由于缺少 System.Data.dll
导致的,这时就需要下载插件 Microsoft Access Database Engine 2010 Redistributable
来解决问题。该插件是由微软提供,下载地址也在微软的官网上,下载地址如下:
https://www.microsoft.com/en-us/download/details.aspx?id=13255
下载之后直接按照默认选择安装即可,不要去更改它的安装路径,避免找不到动态链接库。
2. 使用组件功能
2.1 在程序中引入命名空间
using System.Data;
using System.Data.OleDb;
2.2 查询操作
// 查询学生信息
private DataRowCollection findStudentById() {
// 获取 id
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;
}
}
2.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;
}
2.4 测试查询以及插入功能,仅展示部分代码段
// 调用查询函数,返回数据行集合
DataRowCollection drc = findStudentById();
// 查询到了记录
if (drc.Count > 0) {
// 获取 excel 中 Sheet 第 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("登记失败,请放入下一张卡!");
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/157082.html