C#使用OLEDB将Excel数据转换为DataSet
在C#开发中,经常需要将Excel文件的数据导入程序进行业务处理。本文详述如何在不引入NPOI、EPPlus等第三方组件的前提下,利用.NET框架自带的OLEDB Provider(Microsoft.ACE.OLEDB.12.0)建立数据库连接,扫描Excel内的所有Sheet名称,并依次将各表数据抓取至内存中的DataSet结构内。
实现原理
核心思路是将Excel文件视为一个只读的数据库源。Microsoft.ACE.OLEDB.12.0是微软提供的一种驱动,能够识别.xlsx或.xls格式的文件。通过OleDbConnection打开文件后,可以调用GetOleDbSchemaTable获取其中的“表”(即Sheet)列表,随后针对每个Sheet构建SQL查询语句,最后使用适配器OleDbDataAdapter将数据拉取并存入DataTable集合中。
完整代码示例
以下代码段封装了一个名为GetDataSet的方法。它接收文件路径作为参数,返回包含所有Sheet数据的DataSet对象。请注意,该方法内部已包含连接管理的try...catch...finally块,确保无论成功与否都会关闭连接。
/// <summary>
/// 将EXCEL数据转换为DataSet,无第三方依赖
/// </summary>
/// <param name="filePath">文件全路径</param>
/// <returns>包含所有Sheet数据的DataSet</returns>
private DataSet GetDataSet(string fileName)
{
// 配置连接字符串:Provider版本为ACE 12.0,HDR=Yes表示首行为标题
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1';";
OleDbConnection objConn = null;
try
{
objConn = new OleDbConnection(strConn);
objConn.Open();
DataSet ds = new DataSet();
List<string> sheetList = new List<string>();
// 获取Excel中的所有Sheet名称
DataTable dtSheetName = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
// 过滤并收集有效的Sheet名称
foreach (DataRow dr in dtSheetName.Rows)
{
string tableName = dr["Table_Name"].ToString();
// 保留包含'$'且不以'$'结尾的有效Sheet名(排除某些隐藏sheet的变体)
if (tableName.Contains("$") && !tableName.EndsWith("$"))
{
continue;
}
sheetList.Add(tableName);
}
// 遍历每个Sheet,提取数据
for (int i = 0; i < sheetList.Count; i++)
{
string SheetName = sheetList[i];
string strSql = "select * from [" + SheetName + "]";
// 创建对应DataTable并填入数据
DataTable dt = new DataTable(SheetName);
OleDbDataAdapter odbcCSVDataAdapter = new OleDbDataAdapter(strSql, objConn);
odbcCSVDataAdapter.Fill(dt);
ds.Tables.Add(dt);
}
return ds;
}
catch (Exception ex)
{
// 异常情况下记录或处理,此处返回null示意失败
System.Diagnostics.Debug.WriteLine(ex.Message);
return null;
}
finally
{
// 确保连接始终关闭和释放
if (objConn != null)
{
objConn.Close();
objConn.Dispose();
}
}
}
关键参数说明
- Provider=Microsoft.ACE.OLEDB.12.0:适用于Office 2007及以上版本(含.xlsx)。若需兼容旧版.xls格式,可将此改为
Microsoft.Jet.OLEDB.4.0(仅支持32位进程)。 - HDR=Yes:表示Excel工作表的第一行被视为列名而非普通数据。如果设为No,列名将默认为F1, F2...
- IMEX=1:强制将所有列的数据作为文本读取,防止因混合数据类型导致的静默截断问题。
注意事项
在使用此方法前,请确保运行环境(服务器或本地PC)已安装Office ACE引擎驱动程序,否则抛出No MSISAMODE provider available错误。此外,对于超大体积Excel文件,内存压力会随数据量线性增长,建议对性能要求极高的场景改用流式读取方式或第三方工具。
以上就是C#利用OLEDB技术将Excel数据转化为DataSet的详细内容,更多关于Excel数据处理与C#数据库交互的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













