zoukankan      html  css  js  c++  java
  • C# 使用OLEDB读取不同版本Excel数据的连接字符串

    用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----链接模式(完全更新能力)

  • 相关阅读:
    socket入门教程
    线程间操作无效: 从不是创建控件“xxxxxxxx”的线程访问它。
    Socket教程
    Windows 2008 R2防火墙,允许被ping
    Miller_rabin算法+Pollard_rho算法 POJ 1811 Prime Test
    Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法
    Miller-Rabin算法 codevs 1702 素数判定 2
    快速幂 cojs 1130. 取余运算
    中国剩余定理 hdu 3579
    中国剩余定理 hdu 1573 X问题
  • 原文地址:https://www.cnblogs.com/zouhao/p/3358647.html
Copyright © 2011-2022 走看看