連接 Excel 表:
string sqlconnection="Provider=Microsoft.Jet.OleDb.4.0;Data Source=D:\\Book\\Book.xls;Extended Properties=Excel 8.0"; (1)Excel 連接字符串: 通過OleDb方式讀取Excel文件時(shí)常常出現(xiàn)讀取某些字段為null值,其實(shí)是有值,原因是讀取文件時(shí),Excel通常會(huì)以前10行的數(shù)據(jù)類型為參考, 如果后邊的與其不一致,則會(huì)出現(xiàn)些問題。 可以通過修改Excel文件的連接串,強(qiáng)制讀取的數(shù)據(jù)為字符串類型。
string xlsConnFormat = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source='{0}';Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"; // 1、HDR表示要把第一行作為數(shù)據(jù)還是作為列名,作為數(shù)據(jù)用HDR=NO,作為列名用HDR=YES; // 2、通過IMEX=1來把混合型作為文本型讀取,避免null值。
注意:把一個(gè) Excel 文件看做一個(gè)數(shù)據(jù)庫,一個(gè)sheet看做一張表。語法 "SELECT * FROM [sheet1$]",表單要使用"[]"和"$" 默認(rèn)Excel的表,列名是"F1 ~ F99"。 如果提示 “找不到可安裝的ISAM?!卞e(cuò)誤,主要還是Connection字符串的問題,請注意Data Source之間是否空格,Extended Properties是否書寫正確。 (2)、使用 OLEDB 讀取不同版本 Excel 數(shù)據(jù)的連接字符串設(shè)置 用OLEDB通過設(shè)置連接字符串可以像讀取sqlserver一樣將excel中的數(shù)據(jù)讀取出來,但是excel2003和excel2007/2010的連接字符串是不同的 /// <summary> /// 把數(shù)據(jù)從Excel裝載到DataTable /// </summary> /// <param name="pathName">帶路徑的Excel文件名</param> /// <param name="sheetName">工作表名</param> /// <param name="tbContainer">將數(shù)據(jù)存入的DataTable</param> /// <returns></returns> public DataTable ExcelToDataTable(string pathName, string sheetName) { DataTable tbContainer = new DataTable(); string strConn = string.Empty; if (string.IsNullOrEmpty(sheetName)) { sheetName = "Sheet1"; } FileInfo file = new FileInfo(pathName); if (!file.Exists) { throw new Exception("文件不存在"); } string extension = file.Extension; switch (extension) { case ".xls": strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'"; break; case ".xlsx": strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pathName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'"; break; default: strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'"; break; } //鏈接Excel OleDbConnection cnnxls = new OleDbConnection(strConn); //讀取Excel里面有 表Sheet1 OleDbDataAdapter oda = new OleDbDataAdapter(string.Format("select * from [{0}$]", sheetName), cnnxls); DataSet ds = new DataSet(); //將Excel里面有表內(nèi)容裝載到內(nèi)存表中! oda.Fill(tbContainer); return tbContainer; } 這里需要注意的地方是,當(dāng)文件的后綴名為.xlsx(excel2007/2010)時(shí)的連接字符串是"Provider=Microsoft.ACE.OLEDB.12.0;....",注意中間紅色部分不是"Jet"。 (3)、 .Net 讀取 xlsx文件 Excel2007 .NET 讀取Excel 2007的xlsx文件和讀取老的.xls文件是一樣的,都是用Oledb讀取,僅僅連接字符串不同而已。 讀取xlsx 用的是Microsoft.Ace.OleDb.12.0; 具體操作方法如下: public static DataTable GetExcelToDataTableBySheet(string FileFullPath, string SheetName) { //string strConn = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + FileFullPath + ";Extended Properties='Excel 8.0; HDR=NO; IMEX=1'"; //此連接只能操作Excel2007之前(.xls)文件 string strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + FileFullPath + ";Extended Properties='Excel 12.0; HDR=NO; IMEX=1'"; //此連接可以操作.xls與.xlsx文件 OleDbConnection conn = new OleDbConnection(strConn); conn.Open(); DataSet ds = new DataSet(); OleDbDataAdapter odda = new OleDbDataAdapter(string.Format("SELECT * FROM [{0}]", SheetName), conn); //("select * from [Sheet1$]", conn); odda.Fill(ds, SheetName); conn.Close(); return ds.Tables[0]; } 讀取Excel文件時(shí),可能一個(gè)文件中會(huì)有多個(gè)Sheet,因此獲取Sheet的名稱是非常有用的。 具體操作方法如下: //根據(jù)Excel物理路徑獲取Excel文件中所有表名 public static String[] GetExcelSheetNames(string excelFile) { OleDbConnection objConn = null; System.Data.DataTable dt = null; try { //string strConn = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + excelFile + ";Extended Properties='Excel 8.0; HDR=NO; IMEX=1'"; //此連接只能操作Excel2007之前(.xls)文件 string strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + excelFile + ";Extended Properties='Excel 12.0; HDR=NO; IMEX=1'"; //此連接可以操作.xls與.xlsx文件 objConn = new OleDbConnection(strConn); objConn.Open(); dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); if (dt == null) { return null; } String[] excelSheets = new String[dt.Rows.Count]; int i = 0; foreach (DataRow row in dt.Rows) { excelSheets[i] = row["TABLE_NAME"].ToString(); i++; } return excelSheets; } catch { return null; } finally { if (objConn != null) { objConn.Close(); objConn.Dispose(); } if (dt != null) { dt.Dispose(); } } }
|