Excel读取方式
用OleDb 方式去读取Excel速度还是非常的快的,但这种方式读取数据的时候不太灵活,不过可以在 DataTable 中对数据进行一些删减修改.
这种方式将Excel作为一个数据源,直接用Sql语句获取数据了。所以读取之前要知道此次要读取的Sheet
if (fileType == ".xls")
connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + fileName + ";" + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";
else
connStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + fileName + ";" + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";
OleDbConnection conn new OleDbConnection(connStr);
DataTable dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
以上是读取Excel的Sheet名,xls和xlsx的连接字符串也不一样的,可以根据文件的后缀来区别。这里需要注意的一点,Excel里面只有一个Sheet,但通过这种方式读取Sheet可能会大于一个(有一个无效sheet,sheetName中包含$符号).
using System.Data; - 使用.Net Framework 4.0或者4.5架构时均可引用.目标架构在解决方案,属性修改中..命名空间下还包含– System.Data.OleDb;用于访问OLE DB
OleDbConnection - 数据源连接路径配置 - string类型
//Excel 2007前:Provider=Microsoft.Jet.OLEDB.4.0
//Excel 2010:Provider=Microsoft.ACE.OLEDB.12.0; Excel 8.0或者Excel 12.0均可
//HDR=Yes - 首行不为数据;
//HDR=No - 首行为数据;默认HDR为Yes
//IMEX=0 - 输出模式;
//IMEX=1 - 输入模式;
//IMEX=2 - 链接模式(完全更新能力)
DataTable - 内存中的数据表.并非Excel文件或者Sheet. (注:DataTable像一个容器,用于装数据,而非指特定的表格) - 数据访问方式:行下标索引,列既可下标索引也可字段名访问.
Excel信息通过OleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object [] { null, null, null, “Table” });要求式筛选后,返回DataTable获取.其中也只是Excel整体表格信息,所有信息存储在行列中.
Sheet信息通过OleDbDataAdapter.Fill(DataTable)后,再访问DataTable获取指定行列位置的数据.
DataSet - 内存中的数据缓存.
Excel 读取操作
public static DataSet ToDataTable(string filePath)
{
string connStr = "";
string fileType = System.IO.Path.GetExtension(fileName);
if (string.IsNullOrEmpty(fileType)) return null;
if (fileType == ".xls")
connStr = "Provider=Microsoft.Jet.OLEDB.0;" + "Data Source=" + filePath+ ";" + ";Extended Properties=\"Excel 0;HDR=YES;IMEX=\"";
else
connStr = "Provider=Microsoft.ACE.OLEDB.0;" + "Data Source=" + filePath+ ";" + ";Extended Properties=\"Excel 0;HDR=YES;IMEX=\"";
string sql_F = "Select * FROM [{0}]";
OleDbConnection conn = null;
OleDbDataAdapter da = null;
DataTable dtSheetName= null;
DataSet ds = new DataSet();
try
{
// 初始化连接,并打开
conn = new OleDbConnection(connStr);
conn.Open();
// 获取数据源的表定义元数据
string SheetName = "";
dtSheetName= conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
// 初始化适配器
da = new OleDbDataAdapter();
for (int i = 0; i < dtSheetName.Rows.Count; i++)
{
SheetName = (string)dtSheetName.Rows[i]["TABLE_NAME"];
if (SheetName .Contains("$") && !SheetName .Replace("'", "").EndsWith("$"))
{
continue;
}
da.SelectCommand = new OleDbCommand(String.Format(sql_F, SheetName ), conn);
DataSet dsItem = new DataSet();
da.Fill(dsItem, tblName);
ds.Tables.Add(dsItem.Tables[0].Copy());
}
}
catch (Exception ex)
{
}
finally
{
// 关闭连接
if (conn.State == ConnectionState.Open)
{
conn.Close();
da.Dispose();
conn.Dispose();
}
}
return ds;
}
优缺点
优点:读取方式简单、读取速度快
缺点:除了读取过程不太灵活之外,这种读取方式还有个弊端就是,当Excel数据量很大时。会非常占用内存,当内存不够时会抛出内存溢出的异常。