你上传一个塞满 =VLOOKUP(...)、=SUMIFS(...) 和数据透视表的工作簿,让 ChatGPT 汇总,结果总数明显错了:要么返回 0,要么直接返回 =SUM(B2:B100) 这种字面公式字符串。这不是模型幻觉,而是 ChatGPT 的 Advanced Data Analysis(即原来叫 Code Interpreter 的沙箱)读 Excel 的固有行为。ChatGPT 用 openpyxl 加载 .xlsx,而 openpyxl 默认返回的是公式文本,不是计算后的数字。如果文件是脚本生成、从没在真正的 Excel 里打开过,那它里面根本就没有存计算结果。
最快的修法(最可靠,约 30 秒):在 Excel 里打开工作簿,全选,复制,然后选择性粘贴 - 数值,另存为新 .xlsx,上传这个”纯值”副本。这时每个公式单元格都变成静态数字,任何读取器都能看到。本文后面讲清楚为什么会这样、怎么判断自己属于哪种情况,以及当你无法在 Excel 里另存时的另外四种修法。
你属于哪种情况?
在 ChatGPT 里跑一次下面的代码确认,再跳到对应修法:
import openpyxl
wb_f = openpyxl.load_workbook("file.xlsx") # 公式
wb_v = openpyxl.load_workbook("file.xlsx", data_only=True) # 缓存值
c = "B2" # 一个你确定是公式的单元格
print("formula:", wb_f.active[c].value)
print("cached :", wb_v.active[c].value)
| 公式单元格的 cached 输出 | 属于哪种情况 | 跳到 |
|---|---|---|
cached 是数字 | 读取器处于公式模式 | Step 1(强制 data_only=True) |
cached 是 None | 文件从没在 Excel 里计算过 | Step 2,或 Step 3(在 Python 里求值) |
cached 是 #REF! / 过期值 | 外部引用或实时连接 | Step 4(重建) |
| 公式格为空、值在别处 | 数据透视表 | Step 5(重新聚合源数据) |
常见原因
1. openpyxl 默认返回公式文本而不是值
openpyxl.load_workbook(file) 不加 data_only=True 返回公式;加上 data_only=True 返回 Excel 上次保存时的缓存值——但前提是文件最近被 Excel 打开并保存过。脚本生成的 XLSX(xlsxwriter、exceljs)经常根本没有缓存值。
如何判断:让 ChatGPT 打印一个公式单元格。输出是 =SUMIFS(...) 而不是数字,就是 openpyxl 在公式模式。
2. 文件是代码生成的,从没在 Excel 里打开过
pandas to_excel、xlsxwriter、openpyxl 写出的文件——只写公式文本。Excel 只在你真正打开并保存时才会计算公式并缓存值。Python 生成、没被 Excel 碰过的文件,缓存值字段是 None。
如何判断:openpyxl.load_workbook(..., data_only=True) 返回 None,就是没有缓存值。
3. 外部引用 / 实时数据连接
=INDIRECT("[other.xlsx]Sheet1!A1")、=GETPIVOTDATA(...)、Power Query / 数据模型拉取的公式——只要源工作簿没一起上传,缓存值就没意义。即使 data_only=True,你拿到的也是 Excel 上次能访问源文件时的旧缓存,常常是过期值或 #REF!。
4. 数据透视表是 Excel 算的,不是存的
Pivot table 以缓存 blob 形式存在,只有 Excel 自己能渲染。openpyxl 看得到源数据和一个 stub,但看不到透视表输出。ChatGPT 没法直接读透视表——只能读底层数据,用 pandas 重新聚合。
5. 易变函数永远不可靠缓存
NOW()、TODAY()、RAND()、OFFSET()、INDIRECT()——Excel 每次打开都会重算。缓存值(如果有)是上次保存时的快照,只在你知道文件何时最后被 Excel 打开的情况下才能信任。
最短修复路径
Step 1:让 openpyxl 强制读缓存值
如果上面的判断里 cached 显示的是真实数字,说明读取器只是处于公式模式。明确告诉 ChatGPT:
import openpyxl
wb = openpyxl.load_workbook("file.xlsx", data_only=True)
ws = wb.active
for row in ws.iter_rows(values_only=True):
print(row)
如果文件最后是 Excel 保存的,会返回数字。如果该有公式的位置都是 None,说明文件没缓存值,去 Step 2 或 Step 3。
Step 2:上传前另存为”值”(最可靠)
这是永远有效的修法,约 30 秒。Excel 里:全选(Ctrl+A / Cmd+A)- 复制 - 选择性粘贴 - 数值,然后”文件 - 另存为”新 .xlsx。所有公式单元格都变成静态数字,任何读取器都能看到。上传这个”纯值”版本。
也可以”文件 - 另存为” .csv。CSV 按定义只存计算结果,这也是为什么 CSV 导出从来不会有这个问题。
Step 3:在 Python 里直接求值(没有 Excel 可用)
如果你的机器上没有 Excel(且判断结果是 None),可以让 ChatGPT 在沙箱里直接对工作簿里的公式求值。xlcalculator 和 pycel 这两个库能把 Excel 公式编译成 Python 代码、在不装 Excel 的情况下计算,两个都能在 Advanced Data Analysis 沙箱里用 pip 安装:
# pip install xlcalculator
from xlcalculator import ModelCompiler, Evaluator
model = ModelCompiler().read_and_parse_archive("file.xlsx")
evaluator = Evaluator(model)
print(evaluator.evaluate("Summary!B2")) # 计算 =SUM(...) 等
这类库覆盖了常见函数(SUM、SUMIFS、VLOOKUP、IF,以及大部分数学/文本/查找函数),但不是全部 Excel 函数,也不跑数据透视表和外部链接。如果 xlcalculator 在某个不支持的函数上报错,就退回到 Step 4 用 pandas 重建。
Step 4:在 pandas 里重新算
如果不能改文件、公式又太定制不适合 Step 3,让 ChatGPT 读底层数据、重算:
import pandas as pd
df = pd.read_excel("file.xlsx", sheet_name="Data")
# 用 pandas 重写 VLOOKUP / SUMIFS
totals = df.groupby("region")["amount"].sum()
print(totals)
代价是失去原始 Excel 公式审计链,但你得到正确数字,而且过程可复现。
Step 5:透视表 → 读源数据再聚合
数据透视表是只有 Excel 能渲染的缓存 blob。openpyxl 只看得到源数据范围和一个 stub,看不到透视表输出。读底层数据表、重新聚合:
import pandas as pd
df = pd.read_excel("file.xlsx", sheet_name="RawData")
pivot = df.pivot_table(
index="category",
columns="quarter",
values="revenue",
aggfunc="sum",
)
print(pivot)
比纠结透视表缓存 blob 更快、更灵活。
Step 6:用 ChatGPT for Excel 插件(让 Excel 来算)
ChatGPT for Excel and Google Sheets 插件(2026 年 3 月 5 日开始公测,5 月在全部套餐上正式开放)能让你完全绕开上传问题。这个插件读的是你真实的单元格、公式和工作表结构,计算直接在 Excel 里跑,所以它看到的永远是真实计算结果,不是公式文本。截至 2026 年 6 月,它已在全球面向 ChatGPT Free、Go、Plus、Pro、Business、Enterprise、Edu、K-12 全部套餐开放(Free 和 Go 用量有限)。安装方式:Excel 里”插入 - 获取加载项”(Office 加载项商店),搜索 ChatGPT,然后登录。因为计算在 Excel 内部跑,你还能审计它改动的每个公式、并撤销它提出的任何编辑。
Step 7:实在不行就把关键数字单独贴
什么都行不通时,打开工作簿,把你真正需要的那 5-20 个数字复制出来,以 markdown 表格贴进对话。这样 ChatGPT 拿到的是权威值,完全绕过 Excel 内部解析。
验证修复
重新保存或重建后,再验一次读取:
import openpyxl
wb = openpyxl.load_workbook("file.xlsx", data_only=True)
ws = wb["Summary"]
for row in ws.iter_rows(min_row=1, max_row=10, values_only=True):
print(row)
公式单元格现在应该是数字,不是 None、不是 = 字符串。还是 None,说明文件没经过 Excel——回到 Step 3 用 pandas 重建。
预防
- Excel 文件在上传前一定要在 Excel 里打开并保存一次——这会缓存所有公式值。
- 给 ChatGPT 分析的数据,优先用”选择性粘贴 - 数值”版本;公式版作为独立审计文件保留。
- 准备给 LLM 分析的工作簿不要用外部引用、实时数据连接。
- 重复性工作流从一开始就用 pandas / SQL 做聚合——Excel 只做查看器,ChatGPT 直接读原始数据。
- 必须保留公式时,附带一个小文本文件列出预期总数,让 ChatGPT 能自检读取是否正确。
常见问题
为什么 ChatGPT 把 =SUM(...) 当文本返回而不是数字?
ChatGPT 用 openpyxl 加载 .xlsx,而它默认返回公式字符串。计算后的数字只有在 Excel 自己上次打开并保存文件时才会存进去。脚本生成的工作簿只有公式、没有缓存值,所以你看到的是公式文本或 0。
data_only=True 一定能修好吗?
不一定。data_only=True 返回的是 Excel 上次保存时缓存的值。如果 Excel 从没打开过这个文件,就没有缓存值,你会得到 None。这种情况要么在 Excel 里另存(Step 2)、要么用 xlcalculator 在 Python 里求值(Step 3)、要么用 pandas 重建(Step 4)。
另存为 CSV 会丢公式吗?
CSV 保留计算结果、丢掉公式。对分析来说这正是你想要的,因为 ChatGPT 能干净地读到数字。把带公式的 .xlsx 单独留作审计副本。
ChatGPT 能读我的 Excel 数据透视表吗?
不能直接读。数据透视表是只有 Excel 能渲染的缓存对象,openpyxl 只看得到源数据范围和一个 stub。让 ChatGPT 指向底层数据表,用 pandas.pivot_table 重建聚合(Step 5)。
有没有办法干脆不上传文件?
有,用 ChatGPT for Excel 插件(Step 6)。它在 Excel 内部跑计算,读的是真实计算结果,完全不会遇到公式字符串问题。截至 2026 年 6 月,它已在全部套餐(Free、Go、Plus、Pro、Business、Enterprise、Edu、K-12)正式开放,其中 Free 和 Go 用量有限。
我的总数显示成 0 而不是公式文本,是同一个原因吗?
通常是。0 意味着 openpyxl 读到的是空缓存槽(None),下游的 sum() 把它当成了零。跑一下开头那段判断代码;如果 cached 是 None,你就属于”从没在 Excel 里计算过”那种情况。
Related
- ChatGPT data file analysis wrong
- ChatGPT CSV column misread
- ChatGPT spreadsheet too large truncated
- ChatGPT file analysis too shallow
- ChatGPT uploaded PDF not analyzed correctly
- ChatGPT large document incomplete analysis
标签: #ChatGPT #ChatGPT 文件 #排查 #排查 #Excel