CSV文件太大,Excel打不开或显示不全怎么办
一个 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 只会写回它加载的内容。如果你在
export.csv上按了“保存”,原来的 300 万行就会被替换成大约 100 万行,而且不会再有任何提醒。 - 你计算了合计。 对截断后的工作表做
SUM或数据透视表,得到的结果看起来合理,实际上是错的,因为三分之二的数据根本没有进来。 - 你把它发给了别人。 收到保存后副本的同事,完全无从知道少了很多行。
如果 Excel 已经弹出了警告,请不保存直接关闭文件,并保持原始导出文件不动。然后先确认它到底有多大,再决定怎么处理。
方法 1:在浏览器中打开整个文件
如果你主要是要看数据——核对几条记录、查找某个客户、看看某一列里有什么——用没有网格限制的查看器最快。
Opener 的 CSV 查看器在你的浏览器中读取文件,绝不上传,这在导出文件包含客户或财务数据时尤其重要。解析在后台线程中进行,只绘制屏幕上的行,所以 20 万行的文件大约一秒就能打开,数百万行的文件在普通笔记本电脑上也能正常使用。实际上限取决于你设备的内存,而不是固定的行数。
打开之后,你可以:
- 边输入边在所有列中搜索;
- 按任意列排序;
- 把当前视图(包括筛选和排序结果)导出为干净的 UTF-8 CSV 或 JSON。
最后一点是个很实用的技巧:把 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 在你的浏览器中本地读取文件,不向任何地方发送任何内容,所以数据始终留在你的设备上。