C#使用OLEDB将Excel数据转换为DataSet

Theo
Theo
发布时间:2026-10-14| 3人浏览过
原创

在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#数据库交互的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。