指南

CSV文件太大,Excel打不开或显示不全怎么办

Opener 团队阅读约 7 分钟

一个 Excel 工作表最多容纳 1,048,576 行、16,384 列,所以一份 300 万行的导出文件根本放不下——Excel 会加载前面一部分,弹出警告,然后把剩下的丢掉。要查看整个文件,可以用没有这个限制的工具打开,比如 CSV 查看器;也可以把它加载到 Excel 的数据模型而不是工作表中,或者拆分文件,或者用 Python 或数据库来分析。

为什么 Excel 会截断文件

CSV 文件本身没有大小限制。它是纯文本:一行一条记录,值之间用逗号或分号分隔(如果你对此还不熟悉,请看 CSV 文件是什么)。但 Excel 会把你打开的所有内容放进工作表,而工作表是一个固定大小的网格:1,048,576 行 × 16,384 列(最后一列是 XFD)。

如果文件比这个网格大,Excel 会提示文件未完全加载,并且只保留放得下的行。表头加上 1,048,575 行数据能进来;从第 1,048,577 行开始,屏幕上就看不到了。

换成 Google 表格也躲不过。它的上限是每个电子表格 1000 万个单元格,所有工作表合并计算。一个 300 万行、10 列的文件已经是 3000 万个单元格,同样无法导入。

真正的风险:保存会丢失数据

这个警告很容易随手点掉,而屏幕上剩下的内容看起来就是一张完全正常的表格。危险出现在后面:

如果 Excel 已经弹出了警告,请不保存直接关闭文件,并保持原始导出文件不动。然后先确认它到底有多大,再决定怎么处理。

方法 1:在浏览器中打开整个文件

如果你主要是要看数据——核对几条记录、查找某个客户、看看某一列里有什么——用没有网格限制的查看器最快。

Opener 的 CSV 查看器在你的浏览器中读取文件,绝不上传,这在导出文件包含客户或财务数据时尤其重要。解析在后台线程中进行,只绘制屏幕上的行,所以 20 万行的文件大约一秒就能打开,数百万行的文件在普通笔记本电脑上也能正常使用。实际上限取决于你设备的内存,而不是固定的行数。

打开之后,你可以:

最后一点是个很实用的技巧:把 300 万行筛选到只涉及某个地区的 4 万行,导出,这个小文件在 Excel 中打开就不会再有任何警告。这个查看器不能运行公式、数据透视表或图表;如果需要这些,请继续往下看。

方法 2:加载到 Excel 的数据模型中

较新的桌面版 Excel 可以通过 Power Query 导入 CSV(“数据”选项卡中的“获取数据”/“从文本/CSV”),而不是直接打开。区别在于数据最终放在哪里。

不要把结果加载到工作表,而是选择仅创建连接,并添加到数据模型。数据模型以压缩形式把数据存放在网格之外,因此不受 1,048,576 行的限制。然后你可以基于它创建数据透视表,汇总全部 300 万行——按月合计、按类别计数等等。

代价是:你不能像普通工作表那样逐行滚动浏览,而且不同 Excel 版本的菜单名称也不完全一样。当你必须留在 Excel 里、而最终要的是汇总结果而不是逐行查看时,这是最好的选择。

方法 3:用命令行统计、预览和拆分

在 macOS、Linux 或装有 WSL 的 Windows 上,几条标准命令就能在几秒钟内回答“它有多大?”和“里面有什么?”,完全不需要把文件加载到任何软件中:

wc -l export.csv              # 行数
head -n 20 export.csv         # 前 20 行
head -n 100000 export.csv > sample.csv   # 取一个小样本,方便试验

注意 wc -l 统计的是文本行数,而不是记录数。如果有些值在引号内包含换行(地址和备注经常如此),行数会比记录数多。

要把文件拆成 Excel 能打开的几份,并且每份都带有表头:

tail -n +2 export.csv | split -l 1000000 - part_
for f in part_*; do
  { head -n 1 export.csv; cat "$f"; } > "$f.csv" && rm "$f"
done

拆分适合快速检查,但同样要小心引号内换行的问题:split 按行切分,可能会把一个跨行的值切成两半。而且如果需要对所有数据求合计,在四个独立的工作簿之间来回操作会很麻烦。

方法 4:用 pandas、SQLite 或 DuckDB 分析

如果要计算、关联或汇总数据,老老实实用专业的数据工具才是正解。下面这些工具在普通笔记本电脑上都能处理数千万行数据。

Python 的 pandas 会把整个文件读入内存:

import pandas as pd

df = pd.read_csv("export.csv")
print(len(df))
print(df.groupby("region")["amount"].sum())

如果文件比你的内存还大,就分块读取:

total = 0
for chunk in pd.read_csv("export.csv", chunksize=500_000):
    total += chunk["amount"].sum()

DuckDB 可以直接用 SQL 查询 CSV 文件,无需先导入:

SELECT region, COUNT(*) AS orders, SUM(amount) AS revenue
FROM 'export.csv'
GROUP BY region
ORDER BY revenue DESC;

SQLite 在很多系统上都已预装,如果你想把数据保存在一个可查询的文件里,它很合适:

sqlite3 sales.db
sqlite> .mode csv
sqlite> .import export.csv sales
sqlite> SELECT COUNT(*) FROM sales;

比较好的工作流程是:在这里完成繁重的计算,然后把一个小结果——几千行汇总数据——写回 CSV,交给 Excel 或用于报告。

常见问题

能提高 Excel 的行数上限吗?

不能。每个工作表 1,048,576 行的上限是固定的。你只能绕开它:把数据加载到数据模型、拆分文件,或者换用其他工具。

怎么知道我的文件有没有被截断?

Excel 打开文件时会发出警告;如果工作表中的数据恰好在第 1,048,576 行结束,基本可以断定被截断了。要确认的话,用 wc -l 检查原始文件的大小,或者用 CSV 查看器打开它,它会显示总行数。

换成 Google 表格或 LibreOffice 能打开吗?

通常不能。Google 表格每个电子表格上限为 1000 万个单元格,LibreOffice Calc 每个工作表也有固定的最大行数。两者处理较小的文件都没问题,但数百万行的导出文件需要查看器、数据库或脚本。

用浏览器工具打开大型客户数据导出文件安全吗?

取决于工具。很多在线转换工具会把你的文件上传到服务器。Opener 在你的浏览器中本地读取文件,不向任何地方发送任何内容,所以数据始终留在你的设备上。