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() {
string id = textNumber.Text;
string SqlText = "select * from [Sheet1$] where 证件号 = '" + id + "'";
DataSet ds = LoadDataFromExcel(excel_File_Path, SqlText);
DataTableCollection datatable_collection = ds.Tables;
DataTable dt = datatable_collection[0];
return dt.Rows;
}
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 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) {
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();
OleDbCommand top = new OleDbCommand("insert into [Sheet1$] (学号,姓名,性别,证件号,现在年级,学院,专业,班级,是否在籍,学生状态,生源地,民族,学生类别) values(?,?,?,?,?,?,?,?,?,?,?,?,?)", Conn);
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);
int res = top.ExecuteNonQuery();
Conn.Close();
return res;
}
2.4 测试查询以及插入功能,仅展示部分代码段
DataRowCollection drc = findStudentById();
if (drc.Count > 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();
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("登记失败,请放入下一张卡!");
}
}
|