最近几天,准备将用C# 处理Excel的几种方式,写在一起,方便后面查代码,还有就是比较几种处理方式的运行效率。结果遇到一些需要总结 的点。
1、"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Expth + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES;\""; 这玩意儿已测试,只能用office 2013(2013以后得版本没测,但office2021,office2024 已测试不可用)。另外,需要用到 AccessDatabaseEngine_X64_2010版, AccessDatabaseEngine_X64_2016版找到,但是不知道怎么用(没过多花时间研究,期待有知道答案的大佬赐教)。
2、标题上说的,至少一个参数没指定问题。 我这里的问题发生在参数问题上,当我们的Excel表第一行不是标准的(第一行单元格合并了)那么一下代码中的 HDR=YES 就应该改为 HDR=NO。
以下代码是报错的
string exDts = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Expth + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES;\"";
以下代码是正确的
string exDts = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Expth + ";Extended Properties=\"Excel 12.0 Xml;HDR=NO;\"";
感谢OLEDB操作EXCEL_oledb excel-优快云博客 大佬解惑!!
结果搬运过来,备查备用。
注:1)使用 Excel 工作簿时,默认情况下,区域中的第一行是标题行(或字段名称)。如果第一个区域不包含标题,您可以在连接字符串的扩展属性中指定 HDR=NO。如果您在连接字符串中指定 HDR=NO,Jet OLE DB 提供程序将自动为您命名字段(不管excel中的列叫什么名字,F1 表示第一个字段,F2 表示第二个字段,依此类推,select F1,F2 from [sheet1$]);
2)IMEX=1将所有读入数据看作字符,其他值(0、2)请查阅相关帮助文档;
3)如果出现“找不到可安装的isam”错误,一般是连接字符串错误
DoOleSql(sql,"test.xls");
6、删除excel文件中的数据:不提倡使用这种方法
7、对于非标准结构的excel表格,可以指定excel中sheet的范围
1)读取数据:string sql = "select * from [sheet1$A3:F20]";
2)更新数据:string sql = "update [sheet1$A9:F15] set FieldName='333' where AnotherFieldName='b3'";
3)插入数据:string sql = "insert into [sheet1$A9:F15](FieldName1,FieldName2,…) values('a',’b’,…)";
2003和2007的链接区别
//string strConn = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + excelFile + ";Extended Properties='Excel 8.0; HDR=NO; IMEX=1'"; //此连接只能操作Excel2007之前(.xls)文件
string strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + excelFile + ";Extended Properties='Excel 12.0; HDR=NO; IMEX=1'"; //此连接可以操作.xls与.xlsx文件
//获取excel中都有哪些sheet
dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
下附一个按钮的全部代码,记得先using System.Data.OleDb;
string Expth = @"F:\匹配表\散表1\表名.xls";
string exDts = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Expth + ";Extended Properties=\"Excel 12.0 Xml;HDR=NO;\"";
//使用 Excel 工作簿时,默认情况下,区域中的第一行是标题行(或字段名称)。如果第一个区域不包含标题,您可以在连接字符串的扩展属性中指定 HDR=NO
OleDbConnection exCon = new OleDbConnection(exDts);
exCon.Open();
string updatCmd = "UPDATE [Sheet1$] SET F5 = 'setvalue' WHERE F4 = '条件'";
OleDbCommand upd_cmd = new OleDbCommand(updatCmd,exCon);
upd_cmd.ExecuteNonQuery();
exCon.Close();