700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > C# 利用 OleDb 组件操作 Excel 进行文件读写操作

C# 利用 OleDb 组件操作 Excel 进行文件读写操作

时间:2018-07-25 08:18:36

相关推荐

C# 利用 OleDb 组件操作 Excel 进行文件读写操作

C# 利用 OleDb 组件操作 Excel 进行文件读写操作

1. 下载支持插件2. 使用组件功能2.1 在程序中引入命名空间2.2 查询操作2.3 插入操作2.4 测试查询以及插入功能,仅展示部分代码段

OleDb 是微软开发用于连接 Excel 工作簿,将 Excel 文件作为数据源进行读写操作的组件,在使用时执行语句语法规则与 SQL 一样。

1. 下载支持插件

在使用 OleDb 组件之前,需要先下载支持 OledDb 的插件Microsoft Access Database Engine Redistributable,否则程序在对 Excel 文件进行读写操作时会出现如下异常

引发的异常:“System.InvalidOperationException”(位于 System.Data.dll 中)引发的异常:“System.InvalidOperationException”(位于 System.Data.dll 中)引发的异常:“System.InvalidOperationException”(位于 System.Data.dll 中)

从异常信息中可以发现,异常是由于缺少System.Data.dll导致的,这时就需要下载插件Microsoft Access Database Engine Redistributable来解决问题。该插件是由微软提供,下载地址也在微软的官网上,下载地址如下:

/en-us/download/details.aspx?id=13255

下载之后直接按照默认选择安装即可,不要去更改它的安装路径,避免找不到动态链接库。

2. 使用组件功能

2.1 在程序中引入命名空间

using System.Data;using System.Data.OleDb;

2.2 查询操作

// 查询学生信息private DataRowCollection findStudentById() {// 获取 idstring id = textNumber.Text;// 构建查询语句, Sheet1 是工作簿中的表名,[]和$是语法要求,必须加上string SqlText = "select * from [Sheet1$] where 证件号 = '" + id + "'";// 使用自定义LoadDataFromExcel 函数从 excel_File_Path 给定的路径读取工作簿内容,SqlText 作为查询语句,返回一个 DataSet 类型DataSet ds = LoadDataFromExcel(excel_File_Path, SqlText);// 得到一个数据表的集合,存放了所有的 SheetDataTableCollection 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("登记失败,请放入下一张卡!");}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。