在一次将Excel文件导入到DataGridView中时发现以前的代码都是讲excel中的表名写死了的,都是Sheet1$,要是想导入第二个的话,那就是Sheet2$了,写死了的话,就没有办法将Excel中的第二个表格导入了。于是就做了一个下拉列表,在里面写了N多个Sheet1$、Sheet2$、Sheet3$......SheetN$,当时自以为把问题完美的解决了,但是后来发现原来Excel文件中的表格也是可以自己命名的,谁规定非得叫Sheet1$之类的了?我完全可以叫他xiaoqiang啊,于是问题出来了,之前的办法还是没有从根本上解决这个问题。后来就想,应该先把导入的Excel文件中的所有表格的名字都取到,然后绑定到一个下拉列表中,在让用户自己去选择要导入那个表里面的数据,这样一来的话,问题不就解决了吗?于是上网找资料,还真被我找到了。下面把代码贴出来:

这个方法是用来获取导入的那个Excel文件中的所有的表的名称的,他返回的是一张表,这张表中存储的关于这个Excel中的所有表的相关信息,狠丰富的,里面有一个字段叫做Table_Name,这个字段存储的就是Excel中所有表的名称,我们返回这个表格以后,就可以用一个循环来获取这个Table_Name字段中的数据了不是?这个方法的参数是要导入的那个Excel文件的路径,当我们用OpenFileDialog控件打开Excel文件的时候,用它的对象的FileName属性就能获取路径了,这个做开发的地球人都知道吧?
        /// <summary>
        /// 获取Excel中表的名称
        /// </summary>
        /// <param name="p_ExcelFile">Excel的路径</param>
        /// <returns></returns>
        public static DataTable GetExcelTableName(string p_ExcelFile)
        {
            try
            {
                if (System.IO.File.Exists(p_ExcelFile))
                {
                    OleDbConnection _ExcelConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=\"Excel 8.0\";Data Source=" + p_ExcelFile);
                    _ExcelConn.Open();
                    DataTable _Table = _ExcelConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                    _ExcelConn.Close();
                    return _Table;
                }
                return null;
            }
            catch
            {
                return null;
            }
        }

当把上面的方法写在类中以后,就是去调用它了,我们在OpenFileDialog 控件的打开事件中去调用上面的这个方法就可以了。

            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "Excel文件 (*.xls)|*.xls";
            openFileDialog.FilterIndex = 0;
            openFileDialog.RestoreDirectory = true;
            //openFileDialog..CreatePrompt = true;
            openFileDialog.Title = "请选择要导入的Excel文件";
            //openFileDialog.ShowDialog();
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                //获取Excel中各表的名称,并绑定到下拉列表中
                fileName = openFileDialog.FileName;
                DataTable _Table = GetExcelTableName(fileName);
                string tableName = _Table.Rows[0]["Table_Name"].ToString();

                //在绑定前先将下拉列表清空 cboExcelName是下拉列表的名称,即:comBobox控件
                cboExcelName.Items.Clear();

                //然后我们用一个循环将上面那个方法中返回来的table中的Table_Name这个字段的数据读取出来,绑定到控件上。
                for (int i = 0; i != _Table.Rows.Count; i++)
                {
                    cboExcelName.Items.Add((_Table.Rows[i]["Table_Name"].ToString()));
                }
                cboExcelName.SelectedIndex = 0;
                btnInput.Enabled = true;
             }

嗯,做到这里就OK了,这样就顺利的把Excel中的表名都获取到了,也绑定到了comBobox控件中了,只要用户选择一下要导入哪个表的数据,那就可以直接导入相应的表中的数据了。

posted on 2010-12-13 09:24  Black Bean  阅读(1875)  评论(0编辑  收藏  举报