对于不同的Excel版本,有两种接口可供选择:Microsoft.Jet.OLEDB.4.0(以下简称 Jet 引擎)和Microsoft.ACE.OLEDB.12.0(以下简称 ACE 引擎)。
Jet 引擎,可以访问 Office 97-2003,但不能访问 Office 2007。
ACE 引擎,既可以访问 Office 2007,也可以访问 Office 97-2003。
另外:Microsoft.ACE.OLEDB.12.0 可以访问正在打开的 Excel 文件,而 Microsoft.Jet.OLEDB.4.0 是不可以的。
所以,在使用不同版本的office时,要注意使用合适的引擎。
获取excel数据:
public System.Data.DataTable ExcelToDS(string Path)
{
System.Data.DataTable dt = null;
DataSet ds = null;
try
{
//filetype="xls"
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties= 'Excel 8.0;HDR=Yes;'";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
string strExcel = "";
System.Data.DataTable midDt = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);
OleDbDataAdapter myCommand = null;
//获得excel第一个表的名称
string tablename = midDt.Rows[0]["Table_Name"].ToString();
strExcel = string.Format("select * from [{0}]", tablename);
myCommand = new OleDbDataAdapter(strExcel, strConn);
ds = new DataSet();
myCommand.Fill(ds, "table1");
dt = ds.Tables["table1"];
}
catch (Exception ex)
{
throw;
}
return dt;
}
下面这里再放上获取CSV格式的excel(CSV重量级轻,实用性比较好)
public static DataTable GetTableFromCsv(string csvPath)
{
System.Data.DataTable dt = new System.Data.DataTable();
FileStream fs = new FileStream(csvPath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
//Unicode存储,列之间使用tab间隔
//StreamReader sr = new StreamReader(fs, new System.Text.UnicodeEncoding());
//utf - 8存储,使用逗号间隔
StreamReader sr = new StreamReader(fs, new System.Text.UTF8Encoding());
//记录每次读取的一行记录
string strLine = "";
//记录每行记录中的各字段内容
string[] aryLine;
//标示列数
int columnCount = 0;
//标示是否是读取的第一行
bool IsFirst = true;
//逐行读取CSV中的数据
while ((strLine = sr.ReadLine()) != null)
{
//aryLine = strLine.Split('\t');
aryLine = strLine.Split(',');
if (IsFirst == true)
{
IsFirst = false;
columnCount = aryLine.Length;
//创建列
for (int i = 0; i < columnCount; i++)
{
DataColumn dc = new DataColumn(aryLine[i]);
dt.Columns.Add(dc);
}
}
else
{
DataRow dr = dt.NewRow();
for (int j = 0; j < columnCount; j++)
{
dr[j] = aryLine[j];
}
dt.Rows.Add(dr);
}
}
sr.Close();
fs.Close();
return dt;
}