You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决百万行Excel导入DataTable仅导入数千行的问题?

解决百万行Excel导入DataTable仅读取几千行的问题

遇到这种情况大概率是OLEDB驱动的默认配置或者数据类型识别逻辑导致的,我帮你梳理几个关键修复点:

1. 修正连接字符串(核心解决方法)

你的连接字符串缺少两个关键参数,这是导致数据截断的主要原因:

  • IMEX=1:强制驱动将混合数据类型的列当作文本读取,避免驱动只识别前几行的类型,丢弃后续不同类型的行
  • MaxScanRows=0:让驱动扫描所有行来确定列的数据类型,而不是默认的前8行(如果前8行都是数字,后面的文本行就会被直接忽略)

修改后的连接字符串配置:

<connectionStrings>
  <!--Connect excel for bulk upload-->
  <add name="Excel03ConString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=YES;IMEX=1;MaxScanRows=0'"/>
  <add name="Excel07+ConString" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=YES;IMEX=1;MaxScanRows=0'"/>
</connectionStrings>

2. 检查Excel文件本身的问题

  • 取消所有筛选:如果Excel中设置了筛选,OLEDB只会读取可见行,务必点击数据选项卡的「清除筛选」
  • 取消隐藏行/列:隐藏的行同样会被OLEDB忽略,检查并取消所有隐藏内容
  • 排查空行分隔:如果数据中间有大量连续空行,驱动可能会误以为数据结束,导致提前停止读取

3. 验证驱动兼容性

  • 确保安装的ACE/Jet驱动版本和应用程序平台一致(32位程序用32位驱动,64位程序用64位驱动),版本不匹配会引发各种读取异常
  • 若使用Office 2010及以后版本,优先选择64位的Microsoft.ACE.OLEDB.12.0驱动,对大文件的支持更稳定

4. 代码优化(可选)

虽然不是行数不足的直接原因,但针对百万级数据可以做些优化:

  • 避免用SELECT *,明确指定需要的列(比如你的DataTable只需要3列,就写SELECT [Document Type], [Posting period], [Profit Center] FROM [sheet1$]),减少不必要的数据读取
  • 若内存压力大,可考虑分批读取数据,但先解决前面的核心问题即可

修改后的代码片段(重点在连接字符串和查询语句):

connString = String.Format(connString, excelPath)
Using excel_con As New OleDbConnection(connString)
    excel_con.Open()
    Dim sheet1 As String = excel_con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing).Rows(0)("TABLE_NAME").ToString()
    Dim dtExcelData As New DataTable()
    dtExcelData.Columns.AddRange(New DataColumn(2) {
        New DataColumn("Document Type", GetType(String)),
        New DataColumn("Posting period", GetType(Decimal)),
        New DataColumn("Profit Center", GetType(String))
    })
    ' 明确指定列,避免读取不必要的数据
    Using oda As New OleDbDataAdapter("SELECT [Document Type], [Posting period], [Profit Center] FROM [" + sheet1 + "]", excel_con)
        oda.Fill(dtExcelData)
    End Using
    excel_con.Close()
End Using

先尝试修改连接字符串,这应该能解决大部分行数截断的问题,如果还是不行,再排查Excel文件的格式问题。

内容的提问来源于stack exchange,提问作者user2248733

火山引擎 最新活动