laudy的博客

人变聪明容易,但想装糊涂可真难
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

采用ADO.NET读取Excel文件数据

Posted on 2007-06-16 09:31  laudy  阅读(217)  评论(0)    收藏  举报

可读多个工作表,并不限制工作表名称

protected DataSet ReadUniverExcel()
    {
        // 读取Excel数据,填充DataSet
        // 连接字符串           
        string xlsPath = Server.MapPath("~/ExcelFiles/周销售报表(0611-0617).xls");
        string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                        "Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\";" + // 指定扩展属性为 Microsoft Excel 8.0 (97) 9.0 (2000) 10.0 (2002),并且第一行作为数据返回,且以文本方式读取
                        "data source=" + xlsPath;
        string sql_F = "SELECT * FROM [{0}]";

        OleDbConnection conn = null;
        OleDbDataAdapter da = null;
        DataTable tblSchema = null;
        IList<string> tblNames = null;

        // 初始化连接,并打开
        conn = new OleDbConnection(connStr);
        conn.Open();

        // 获取数据源的表定义元数据                       
        //tblSchema = conn.GetSchema("Tables");
        tblSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

        //GridView1.DataSource = tblSchema;
        //GridView1.DataBind();

        // 关闭连接
        //conn.Close();

        tblNames = new List<string>();
        foreach (DataRow row in tblSchema.Rows)
        {
            tblNames.Add((string)row["TABLE_NAME"]); // 读取表名
        }

        // 初始化适配器
        da = new OleDbDataAdapter();
        // 准备数据,导入DataSet
        DataSet ds = new DataSet();

        foreach (string tblName in tblNames)
        {
            da.SelectCommand = new OleDbCommand(String.Format(sql_F, tblName), conn);
            try
            {
                da.Fill(ds, tblName);
            }
            catch
            {
                // 关闭连接
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                }
                throw;
            }           
        }

        // 关闭连接
        if (conn.State == ConnectionState.Open)
        {
            conn.Close();
        }

        return ds;
    }