Navicat 不支持直接导出 .xlsx 文件,所谓“Excel 导出”实为导出 CSV 或旧版 .xls(最大 65536 行),无公式/合并单元格;推荐选 CSV 以精准控制编码、分隔符等参数。
navicat 本身不直接导出 excel(.xlsx)文件,它只支持导出为 csv、txt、sql 等格式;所谓“导出 excel”,实际是导出 csv 后用 excel 打开,或借助中间工具转换——这点不搞清,后面所有操作都会卡在乱码、日期错位、长数字变科学计数法上。
导出时选 CSV 还是 Excel(.xlsx)?Navicat 根本没这个选项
Navicat 最新版(16/17)的「导出向导」里,Excel 仅指旧版 .xls 格式(Excel 97–2003),最大行数 65536,不支持现代 Excel 功能。它不是 .xlsx,也不走 Office COM 接口,本质仍是 CSV 封装。你看到的 Excel 导出选项,实际生成的是制表符分隔、无扩展名的文本,靠 Excel 自动识别——所以别指望它保留公式、合并单元格或条件格式。
- 选
CSV:最可控,编码、分隔符、引号规则全可调,推荐首选 - 选
Excel(.xls):仅当目标环境必须用老 Excel 且数据量 .xlsx 防丢失 - 别信“导出为 Excel”按钮文字——它不等于你双击能直接打开的
.xlsx
中文乱码、日期错位、手机号变 1.34E+10?全是编码和分隔符惹的祸
Navicat 默认用系统编码(Windows 通常是 GBK)导出 CSV,而 Excel 2016+ 默认用 UTF-8 with BOM 打开 CSV。两者不匹配,中文就成问号;字段含逗号、换行时若没加双引号包裹,Excel 会错切列;数字型字段(如身份证、手机号)被 Excel 自动转成科学计数法,不可逆。
- 导出前务必勾选
Export with BOM(BOM 是 UTF-8 的“身份证”,告诉 Excel 别乱猜编码) - 分隔符选
Comma(英文逗号),别用Semicolon或Tab——Excel 对逗号兼容性最好 - 勾选
Quote all fields:强制每字段加双引号,避免含逗号/换行的内容崩列 - 手机号、身份证等字段,在 SQL 查询里提前转成字符串:
CAST(id_card AS CHAR)或CONCAT('', mobile)
想真导出 .xlsx?得绕道 Python 或命令行
如果业务方明确要原生 .xlsx(比如带样式、多 sheet、超大数据),Navicat 做不到。得用脚本中转:查出数据 → 写入 Excel 文件。常用组合是 mysqlclient + openpyxl(适合小到中量数据),或 pandas.read_sql + pandas.DataFrame.to_excel(更简洁,但内存占用高)。
import pandas as pd
from sqlalchemy import create_engine
<p>engine = create_engine('mysql://user:pass@host:3306/db')
df = pd.read_sql("SELECT * FROM users WHERE created_at > '2024-01-01'", engine)
df.to_excel("users_report.xlsx", index=False)- 注意
to_excel默认不带 BOM,中文列名不会乱码;但若用openpyxl手动写,得设encoding='utf-8' - 超 10 万行建议分页导出,否则 pandas 容易 OOM;可用
chunksize参数流式读取 - Navicat 的「导出向导」里没有「执行 SQL 后导出」的快捷入口,得先在查询窗口跑完,再右键结果集 →「导出记录」
真正麻烦的从来不是点几下鼠标,而是导出后对方打开 Excel 说“这日期怎么是 45123?”、“手机号怎么少了一位?”。编码、分隔符、数字类型处理,这三个点漏掉任何一个,都得返工重来。










