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("登记失败,请放入下一张卡!");
	}
}
  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C是一种非常重要的计算机编程语言。它最初由美国贝尔实验室的Dennis Ritchie在20世纪70年代末和80年代初开发,是一种基于程序和数据结构的高级语言。 C语言的设计目标是提供一种简单高效的编程语言,以便开发底层操作系统和嵌入式系统。相比其他编程语言,C语言的语法相对简单,但功能强大。正因为如此,C成为了许多计算机科学教育中的基础课程。 C语言的特点是它的移植性和高效性。它可以编写与硬件平台无关的程序,因此可以在不同的操作系统和处理器上运行。此外,通过使用低级的内存管理和指针操作,C语言可以实现对计算机资源的精细控制,从而实现高效的程序执行。 C语言提供了丰富的标准库,其中包括各种各样的函数和数据结构,以帮助程序员快速开发各种应用程序。除了标准库外,C语言还支持使用自定义的库,可以根据具体需求进行扩展和重用。 虽然C语言具有许多优势,但也有一些缺点。例如,由于C语言没有内置的面向对象编程特性,因此实现复杂的数据结构和算法可能需要更多的代码和工作。此外,C语言对错误处理的支持相对较弱,需要程序员自行处理异常和错误情况。 总之,C语言是一种功能强大的编程语言,被广泛用于底层系统开发和嵌入式系统。它的简单性和高效性使得它成为学习编程的好选择,并且在许多行业中仍然持续使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ReadThroughLife

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值