使用OLEDB可以對excel文件進行讀取,我們只要把該excel文件作為數據源即可。
一 在D盤創建excel文件test.xls:
二 將工作表Sheet1的內容讀取到DataSet
C#-Code:string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+
"Extended Properties=Excel 8.0";
DataSet ds = new DataSet();
OleDbDataAdapter oada = new OleDbDataAdapter("select * from [Sheet1$]", strConn);
oada.Fill(ds);
讀取的DataSet為:
從圖中可以看出excel文件中的第一行變成了DataSet中的列名,這正是系統的默認設置。
三 如果想把第一行也作為數據行,那我們可以給連接字符串添加一個HDR=No屬性
如:
C#-Code:string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+
"Extended Properties=Excel 8.0;HDR=No";
DataSet ds = new DataSet();
OleDbDataAdapter oada = new OleDbDataAdapter("select * from [Sheet1$]", strConn);
oada.Fill(ds);
結果也許會讓你有點想不到:
第一行的第一列和第三列都變成空的了,這是因為系統把第一列識別成了數字,把第三列識別成了日期,而第一行的數據不符合格式的要求,所以就變成空的了。
四 我們還可以把所有列都做為字符串來讀取,只要添加屬性IMEX=1即可
C#-Code:string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+
"Extended Properties=Excel 8.0;HDR=No;IMEX=1";
DataSet ds = new DataSet();
OleDbDataAdapter oada = new OleDbDataAdapter("select * from [Sheet1$]", strConn);
oada.Fill(ds);
結果又會如何呢?
是不是再次出乎你的意料,第三行的日期怎麼變成數字了,其實excel在轉換格式的時候就自動把日期變成數字了,那這個數字是怎麼來的呢 ? 如果你把日期改成1900年1月1日,那麼你可以看到他的轉換結果是1,以此類推,39902是哪一天就明白了吧。
五 也許你並不想讀取整個excel的內容
如果只想讀取前兩列可以用:select * from [Sheet1$A:B]
如果只想讀取A1到B2的內容,就用:select * from [Sheet1$A1:B2]
六 如果不知道工作表的名字或名字被人為修改了該怎麼辦呢?
我們可以通過索引來獲取指定工作表的名字,以下方法可以用來獲取工作表名稱的數組:
C#-Code:ArrayList al = new ArrayList();
string strConn;
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+
"Extended Properties=Excel 8.0;";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
DataTable sheetNames = conn.GetOleDbSchemaTable
(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
conn.Close();
foreach (DataRow dr in sheetNames.Rows)
{
al.Add(dr[2]);
}
return al;