C#从Excel文件提取DataTable时无法获取完整数据的求助
这种部分列数据读不出来的情况,我之前用OleDb操作Excel时也踩过坑,最常见的原因就是OleDb自动推断列类型时出现了偏差,下面给你几个可行的解决思路:
强制以文本类型读取所有列
OleDb默认会根据列的前8行数据推断列类型,如果某列里混合了不同类型的数据(比如前几行是数字,后面出现文本),不符合推断类型的数据就会被置为null。解决方法是在连接字符串的Extended Properties里加上IMEX=1,强制把所有列按文本类型读取:var connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=\"Excel 8.0;IMEX=1;HDR=Yes;\"", filename);其中
HDR=Yes表示Excel第一行是表头,如果你的文件没有表头,改成HDR=No即可。检查并统一Excel列格式
打开你的Excel文件,查看那些读不出来数据的列,看看是不是被设置了特殊格式(比如自定义格式、日期格式但实际存储的是文本内容)。可以手动把这些列的格式改成「文本」,保存后再重新运行代码读取。替换为ACE驱动(推荐)
你当前用的Microsoft.Jet.OLEDB.4.0是旧版驱动,只支持32位系统和.xls格式的Excel文件。如果你的环境是64位,或者使用的是.xlsx格式,建议换成Microsoft.ACE.OLEDB.12.0驱动,兼容性更好,连接字符串调整为:var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0; data source={0}; Extended Properties=\"Excel 12.0 Xml;IMEX=1;HDR=Yes;\"", filename);注意:ACE驱动需要单独安装,并且要和你的程序位数匹配(64位程序装64位ACE驱动,32位装32位)。
核对查询语句的列名
虽然你说其他列能正常读取,但还是建议确认SELECT语句里的col_1到col_6和Excel表中的表头完全一致,有没有大小写错误或者拼写偏差——有时候细微的差异也会导致列数据读取失败。
内容的提问来源于stack exchange,提问作者Dor Lugasi-Gal

