Navicat“导出Excel”实际生成的是Excel 97–2003格式(.xls),其硬性上限为65536行,超出部分被静默截断;所谓“Excel 2007+”选项仅为误导性文案,所有版本均未真正支持.xlsx格式。
Navicat 导出“Excel”时卡在 65535 行,不是它故意限制,而是它压根没调用 Excel 新格式——你点的那个「Excel」导出,实际生成的是 .xls(Excel 97–2003)二进制文件,这个格式的硬性上限就是 65536 行(含表头),超出部分被静默丢弃,连警告都没有。
为什么选「Excel」却得到 .xls 而不是 .xlsx?
navicat 所有版本(包括 16/17)的「导出结果 → excel」选项,底层调用的是旧式 excel 97–2003 格式库(如 libxls 或自研封装),而非 openpyxl、xlsxwriter 这类支持 .xlsx 的现代库。它不依赖 office com,也不生成真正的 ooxml 文件,只是把数据按 .xls 结构打包——所以你双击打开看到的,是 excel 兼容模式下的降级渲染,不是原生 .xlsx。
65535 行之外的数据去哪了?
不会报错,也不会提示截断。Navicat 在写入时就按 .xls 规范封包,第 65536 行起的数据直接不写入文件。你用 Excel 打开后数行号,会发现最后一行就是 65536,但原始查询结果明明有 8 万行——这不是传输中断或网络问题,是格式层的主动放弃。
导出向导里「Excel 2007+」选项真的有用吗?
没有。Navicat 界面中所谓「Excel 2007 以上版本」是误导性文案。实测所有已知版本(含 2026 年最新版)均未实现该功能:选择该项后导出的仍是 .xls,文件头签名(BOF record)和结构仍为 BIFF8,不是 .xlsx 的 ZIP+XML。这个选项存在,但未激活——它不改变输出格式,只可能影响分隔符或编码逻辑,无法突破行数墙。
怎么确认自己导出的到底是不是 .xlsx?
别信文件名或右键属性。用命令行验证:
file your_exported_file.xls
如果返回 Composite Document File V2 Document 或含 Microsoft Excel + BIFF8 字样,就是真 .xls;若想得到 .xlsx,必须绕过 Navicat 导出界面,用脚本写入——比如 pandas.read_sql(...).to_excel("out.xlsx"),或用 mysql -e "SELECT ..." | csvkit csvformat -D "," | in2csv -f csv | csvsql --insert --db sqlite:///tmp.db 再转出,否则永远卡在 65535。
.xlsx 的场景(多 sheet、带样式、超 10 万行),Navicat 的「Excel 导出」按钮只是个快捷入口,背后没引擎支撑。它适合快速看一眼几十行数据,不适合交付报表。


















