C# 使用OLEDB读取不同版本Excel数据的连接字符串
2013-10-09 10:30
656 查看
用OLEDB通过设置连接字符串可以像读取sqlserver一样将excel中的数据读取出来,但是excel2003和excel2007/2010的连接字符串是不同的
/// <summary> /// 通用函数类 /// 2013.10.09 /// zouhao /// </summary> class GeneralFun { /// <summary> /// 从文件中(Excel、Access)读取数据,装载到DataTable对象 /// </summary> /// <param name="pathName">绝对路径+文件名</param> /// <param name="tableName">表名</param> /// <returns></returns> public static DataTable FileToDataTable(string pathName, string tableName) { return GeneralFun.FileToDataTable(pathName, tableName, ""); } /// <summary> /// 从文件中(Excel、Access)读取数据,装载到DataTable对象 /// </summary> /// <param name="pathName">绝对路径+文件名</param> /// <param name="tableName">表名</param> /// <param name="where">查询条件</param> /// <returns></returns> public static DataTable FileToDataTable(string pathName, string tableName, string where) { //格式化传入传输 pathName = pathName.Trim().ToLower(); tableName = tableName.Trim().ToLower(); where = where.Trim().ToLower(); //读取数据 DataTable tbContainer = new DataTable(); string strConn = string.Empty; if (string.IsNullOrEmpty(tableName)) { tableName = "Sheet1"; } FileInfo file = new FileInfo(pathName); if (!file.Exists) { throw new Exception("文件不存在"); } string extension = file.Extension.Trim().ToLower(); switch (extension) { case ".xls"://Excel2003 strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=No;IMEX=1;'"; tableName += "$"; break; case ".xlsx"://Excel2007 strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pathName + ";Extended Properties='Excel 12.0;HDR=No;IMEX=1;'";//{IMEX = 0:写,1:读,2:读/写;} {HDR = Yes,第一行是标题} tableName += "$"; break; case ".mdb"://Access2003 strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName; break; case ".accdb"://Access2007 strConn = "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" + pathName; //Provider=Microsoft.Ace.OleDb.12.0;Data Source=文件位置;Jet OLEDB:Database Password=密码; break; } //链接文件 OleDbConnection cnnxls = new OleDbConnection(strConn); //生成SQL字符串 string sql = string.Format(" select * from [{0}] ", tableName); //判断是否有条件 if (!string.IsNullOrEmpty(where)) { //判读用户是否添加了 where 字符串 if (-1 == where.IndexOf("where")) where = " where " + where; //添加查询条件 sql += where; } //读取文件数据 OleDbDataAdapter oda = new OleDbDataAdapter(sql, cnnxls); DataSet ds = new DataSet(); //将文件里面有表内容装载到内存表中! oda.Fill(tbContainer); return tbContainer; } }
这里需要注意的地方是,当文件的后缀名为.xlsx(excel2007/2010)时的连接字符串
97-2003版本
EXCEL
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=文件位置;Extended Properties=Excel 8.0;HDR=Yes
ACCESS
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=文件位置;Jet OLEDB:Database Password=密码;
2007版本
EXCEL
Provider=Microsoft.Ace.OleDb.12.0;Data Source=文件位置;Extended Properties=Excel 12.0;HDR=Yes
ACCESS
Provider=Microsoft.Ace.OleDb.12.0;Data Source=文件位置;Jet OLEDB:Database Password=密码;
【其他说明】
HDR=Yes/NO 表示是否将首行做标题。
不支持文件带密码的EXCEL文件,哪怕知道正确密码,除非自行先打开该文件
参数HDR的值:
HDR=Yes,这代表第一行是标题,不做为数据使用 ,如果用HDR=NO,则表示第一行不是标题,做为数据来使用。系统默认的是YES
参数Excel 8.0
对于Excel 97以上版本都用Excel 8.0
IMEX ( IMport EXport mode )设置
IMEX 有三种模式:
0 is Export mode
1 is Import mode
2 is Linked mode (full update capabilities)
我这里特别要说明的就是 IMEX 参数了,因为不同的模式代表著不同的读写行为:
当 IMEX=0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。
当 IMEX=1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。
当 IMEX=2 时为“连結模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。
意义如下:
0 ---输出模式;
1---输入模式;
2----链接模式(完全更新能力)
相关文章推荐
- 使用OLEDB读取不同版本Excel数据的连接字符串设置
- 使用OLEDB读取不同版本Excel数据的连接字符串设置
- 使用OLEDB读取不同版本Excel数据的连接字符串设置
- 使用OLEDB读取不同版本Excel数据的连接字符串设置
- C#读取不同版本excel的连接字符串
- C#自动判断Excel版本使用不同的连接字符串
- [OLEDB]OLEDB对于不同版本Excel的连接字符串
- C#使用oledb方式将excel数据导入到datagridview后数据被截断为 255 个字符
- C#使用oledb连接excel执行Insert Into语句出现“操作必须使用一个可更新的查询”的解决办法
- 通过OleDb连接,C#读取excel驱动
- C#使用OLEDB读取Excel的一个注意点
- c# office不同版本下中使用Excel
- 使用C# 连接不同版本的Oracle.DataAccess
- Delphi7使用ADO直接连接Excel读取数据
- 使用C# 连接不同版本的Oracle.DataAccess
- 不同Excel版本的连接字符串
- Asp.net/c#+OleDb操作excel文件(二),数据传输使用Parameters
- asp.net 解决使用OLEDB导入excel数据时同时包含文本和数字的列无法正常读取情况
- c#.net使用oledb读取excel
- C#操作EXCEL之用OleDb快速读取数据到DataTable