在一次将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控件中了,隻要使用者選擇一下要導入哪個表的資料,那就可以直接導入相應的表中的資料了。