最稳方案是先将Excel转为UTF-8编码CSV,再用BULK INSERT(SQL Server)或LOAD DATA INFILE(MySQL)导入;Python可用pandas.read_excel+to_sql实现清洗后入库。

Excel数据直接进SQL?别试了,INSERT不认.xlsx文件
Excel本身不是数据库驱动源,SQL Server、MySQL这些不会主动读取.xlsx文件。你双击拖进去、复制粘贴几十行还行,但“批量导入”必须走中间环节——要么转成CSV用原生工具加载,要么用程序桥接。常见错误是死磕Excel打开方式,结果卡在“未启用宏”或“ACE.OLEDB不可用”上,纯浪费时间。
- Windows上
Microsoft.ACE.OLEDB.12.0驱动只支持32位Office,64位SQL Server Management Studio(SSMS)连不上,报错The 'Microsoft.ACE.OLEDB.12.0' provider is not registered - Mac/Linux根本没ACE驱动,这条路直接不通
- 哪怕驱动装对了,Excel里合并单元格、空行、表头含特殊字符(如
销售部(2024)),OPENROWSET会静默跳过整行
最稳的方案:先转CSV,再用BULK INSERT或LOAD DATA INFILE
这不是妥协,是绕过所有OLEDB权限、位数、格式校验的物理捷径。Excel另存为CSV (Comma delimited)时注意三点:编码选UTF-8(中文不乱码)、禁用自动公式计算(避免=NOW()变成时间戳)、删掉所有页眉页脚和汇总行。
- SQL Server用
BULK INSERT:路径必须是数据库服务器能访问的本地路径,不是你电脑桌面,例如'D:\data\orders.csv',不是'C:\Users\Me\Desktop\orders.csv' - MySQL用
LOAD DATA INFILE:需开启secure_file_priv,且文件得放在它指定目录下,命令里路径不能带C:盘符 - 字段分隔符默认是
,,但Excel导出的CSV如果某列含逗号(如地址"Beijing, Chaoyang"),必须用双引号包裹,BULK INSERT要加FIRSTROW = 2跳过表头,否则第一行会被当数据
Python脚本比SSMS向导更可控:用pandas.read_excel + to_sql
适合字段多、需清洗、目标库在远程或权限受限的场景。不用装驱动,openpyxl读.xlsx,sqlalchemy写库,全程Python跑完。
-
read_excel默认读第一个sheet,要指定用sheet_name='Sales_Q3';空值自动转NaN,入库前建议df.fillna('')或df.dropna() -
to_sql参数关键:if_exists='append'追加,index=False别把行号当列插进去,chunksize=500防内存爆(尤其>10万行) - MySQL连不上?检查连接字符串是否漏了
?charset=utf8mb4,否则中文变???;SQL Server用pyodbc引擎时,driver={ODBC Driver 17 for SQL Server}必须和系统已安装版本严格一致
Power Query不是万能的:能连SQL但不能反向推Excel到库
Power Query在Excel里可以“从SQL Server获取数据”,但它本质是单向拉取+缓存,改完Excel表格点“刷新”,只是重新查库,并不会把你在Excel里新增的行UPDATE回数据库。有人误以为“已建立连接”就等于“双向同步”,结果改了一天数据,一刷新全没了。
- 真要靠Excel编辑后回写,得用VBA调
ADODB.Connection执行INSERT语句,但每行都要拼SQL,无批量、无事务、易注入,不推荐 - Power Query导出到
CSV再走前面说的BULK INSERT流程,才是合理组合 - 如果你的Excel有复杂公式依赖实时数据库值,别硬塞进SQL,改用
SQL Server Reporting Services或轻量BI工具,Excel不是数据中台
真正卡住人的从来不是“怎么连”,而是Excel里那些看不见的格式残留——隐藏行、条件格式色块、单元格样式继承、数字被当文本存(左上角绿色三角)。导出前按Ctrl + A全选→右键“设置单元格格式”→统一选“常规”,再清除格式,比调半天驱动实在得多。










