ODBC连接无表头XLSX文件丢失首行,HDR参数设置无效求助
我之前也踩过Microsoft Excel ODBC驱动的这个坑!明明设置了HDR=NO还是丢首行,大概率是驱动的缓存、位数不匹配或者参数组合的问题,给你几个实测有效的解决方向:
检查ODBC驱动位数匹配:如果你的程序是32位,一定要用32位的ODBC数据源管理器(路径是
C:\Windows\SysWOW64\odbcad32.exe),而不是系统默认的64位管理器(C:\Windows\System32\odbcad32.exe)。很多时候位数不匹配会导致驱动忽略HDR参数的设置,我之前就是因为这个折腾了半天。清理驱动缓存文件:Excel ODBC驱动会在临时目录缓存文件的schema信息,哪怕你改了
HDR参数,缓存还在就会沿用旧规则。去C:\Users\<你的用户名>\AppData\Local\Temp目录下,删除所有和你的目标文件(比如test.xlsx)相关的临时文件(通常是~$test.xlsx或者类似命名的缓存文件),然后重新连接试试。调整参数组合并明确查询范围:
试试把连接字符串改成这个:DRIVER=Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb);HDR=NO;IMEX=1;READONLY=TRUE;DBQ=C:\Temp\test.xlsx然后查询的时候不要用
SELECT *,而是明确指定列名(无表头时驱动会自动命名为F1、F2、F3...),比如SELECT F1, F2 FROM [Sheet1$A1:Z1000]——强制指定从A1开始的范围,避免驱动自动跳过第一行。换用Access Database Engine驱动:如果上面的方法都不行,试试用Microsoft Access Database Engine的驱动来连接,这个驱动对Excel文件的兼容性更好。连接字符串改成:
DRIVER=Microsoft Access Driver (*.mdb, *.accdb);DBQ=C:\Temp\test.xlsx;Extended Properties="Excel 12.0 Xml;HDR=NO;IMEX=1;READONLY=TRUE"注意这里的
Extended Properties要用双引号包裹,外层如果是双引号的话,内部用转义的双引号(或者单引号,视你的程序语言而定)。检查文件本身的格式:确认你的XLSX文件第一行没有被设置为隐藏行,也没有特殊的单元格格式(比如合并单元格、空值过多)导致驱动误判为表头。打开文件手动取消所有隐藏行,再重新连接测试。
内容的提问来源于stack exchange,提问作者Wurzelbert

