如何解决百万行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




