在一次将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控件中了,只要用户选择一下要导入哪个表的数据,那就可以直接导入相应的表中的数据了。