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

  • 相关阅读:
    BF算法和KMP算法
    Python课程笔记 (五)
    0268. Missing Number (E)
    0009. Palindrome Number (E)
    0008. String to Integer (atoi) (M)
    0213. House Robber II (M)
    0198. House Robber (E)
    0187. Repeated DNA Sequences (M)
    0007. Reverse Integer (E)
    0006. ZigZag Conversion (M)
  • 原文地址:https://www.cnblogs.com/zouhao/p/3358647.html
Copyright © 2011-2022 走看看