1. 从一张会自己更新的表格说起
上班时间想瞄一眼持仓涨跌,又不想频繁切窗口、开APP、被同事瞥见屏幕上花花绿绿的K线,这个需求其实非常普遍。我身边做运维、做财务、做行政的朋友,几乎每个人都有过类似的小心思:能不能让手边最不起眼的Excel,变成一个能自动刷新行情的小看板?答案是能,而且核心工具就是Excel自带的公式体系,配合一个叫GetStockSource的数据获取函数,再加上GetJsonProperty做JSON字段提取,整条链路不需要装任何插件、不需要写VBA宏、不需要开通任何付费接口,纯公式就能跑起来。
这套方案的本质,是把外部返回的JSON格式行情数据,通过公式拉进单元格,再用JSON解析函数把嵌套结构里的字段一层层剥出来,最后落到你熟悉的表格里。它解决的核心问题是"数据获取"和"数据解析"这两步的自动化,让你从手动复制粘贴里彻底解放出来。适合谁来参考?只要你会用Excel的基础函数、知道单元格引用是怎么回事,就能照着做;如果你还懂一点JSON结构,那上手会更快。下面我把整套思路、参数细节、踩坑记录全部摊开讲,尽量做到你照着抄就能用。
2. 整体设计思路与方案选型拆解
2.1 为什么选Excel公式而不是插件或脚本
很多人第一反应是装个行情插件,或者写个Python脚本定时抓数据再写进表格。这两条路我都试过,各有各的麻烦。插件的问题在于安装权限、版本兼容、以及公司电脑往往不允许随意装东西;Python脚本的问题在于要配环境、要挂后台、要处理定时任务,一旦电脑重启或者网络抖动,整个链路就断了,排查起来还费劲。
Excel公式方案的优势在于"零依赖"——它跑在Excel自己的计算引擎里,只要表格开着,公式就能重新计算。你不需要额外的运行时,不需要管理员权限,文件发给同事也能直接用(前提是对方Excel版本支持这些函数)。对于"上班偷偷盯盘"这种轻量、即时、低存在感的需求来说,公式方案是最贴合的。它的劣势也很明显:刷新依赖手动触发或工作簿重算,做不到秒级推送,但对于看日线、看当前价这种场景,完全够用。
2.2 GetStockSource与GetJsonProperty的分工
这两个函数是整套方案的两根支柱,理解它们的分工,后面就不会乱。
GetStockSource负责"取数"。你给它一个标的代码或者查询条件,它去外部数据源把原始数据拿回来。拿回来的东西通常是一坨JSON文本,长这样:
{"data":{"code":"600519","name":"某某","price":1688.00,"change":12.34,"changePercent":0.74,"volume":123456}}GetJsonProperty负责"拆数"。JSON是嵌套的,你不能直接对着一整坨文本做加减乘除,必须先把price、change这些字段单独拎出来。GetJsonProperty就是干这个的:你告诉它"我要data下面的price",它就把1688.00这个值返回给你,变成一个可以参与计算的数字。
提示:不同Excel版本或不同数据源对这两个函数的支持情况不一样,动手前先确认你的环境里这两个函数能正常返回结果,否则后面全是白忙。
2.3 数据流的整体走向
把上面两步串起来,整条数据流是这样的:
- 在某个单元格(比如A2)用
GetStockSource拉取某只标的的原始JSON; - 在相邻单元格用
GetJsonProperty从A2里提取各个字段; - 用普通公式对提取出来的数字做涨跌颜色、百分比、量比等二次加工;
- 设置好刷新方式,让数据在你需要的时候更新。
这个结构的好处是"取数"和"展示"分离。原始JSON放在一个隐藏列或者单独区域,展示区只放解析后的干净数字。哪天数据源字段变了,你只需要改解析公式,展示区不用动。这是我在实际维护中总结出来的最重要的一条结构原则。
3. 核心细节解析与实操要点
3.1 JSON结构必须先看懂再动手
新手最容易犯的错,是拿到JSON看都不看就开始写提取公式,结果字段名写错、层级搞错,返回一堆错误值。JSON的本质是"键值对的嵌套",你可以把它想象成文件夹:最外层是根目录,里面可能有data、result、msg这些子文件夹,真正的数据藏在某几层里面。
以常见的行情返回为例,字段可能藏在data下面,也可能藏在result.list[0]这种数组里。数组是最容易翻车的地方,因为数组有下标,第一个元素是0不是1。如果你要取列表里的第一条,路径里就得体现下标。我的习惯是:拿到JSON先丢进任意一个在线格式化工具里展开看一遍,把要用的字段路径用笔记下来,再回Excel写公式。这一步花两分钟,能省后面半小时的调试。
3.2 GetJsonProperty的路径写法要点
GetJsonProperty的第二个参数就是路径。路径的写法直接决定你能不能取到值。常见的几种情况:
- 单层字段:直接写字段名,比如
price; - 嵌套字段:用点号连接,比如
data.price; - 数组元素:带下标,比如
data.list.0.price或者data.list[0].price(具体语法看你的函数实现); - 字段名含特殊字符:有些返回的键带横线或空格,这种要特别小心,可能需要加引号或者转义。
我踩过最坑的一次,是字段名里有个大写字母,我写成小写,结果一直返回空。JSON的键是大小写敏感的,Price和price是两个完全不同的东西。所以抄字段名的时候,宁可复制粘贴,不要手打。
3.3 单元格引用与批量填充的技巧
假设A2是原始JSON,B2要取价格,公式大概长这样:
=GetJsonProperty(A2, "data.price")C2取涨跌幅:
=GetJsonProperty(A2, "data.changePercent")如果你要盯多只标的,最忌讳的是每行都手写一遍公式。正确做法是:把标的代码单独放一列(比如A列),原始JSON用公式根据代码动态生成,解析公式统一写好之后往下拖。这样新增一只标的,只需要在代码列加一行,其余全部自动带出来。
注意:往下拖公式时,注意哪些引用要锁、哪些要相对。原始JSON那一列通常要锁列不锁行,路径字符串如果是固定的就直接写死,如果路径也要跟着变,那就得用字符串拼接函数动态构造路径。
3.4 数字格式化与涨跌颜色
取出来的数字默认是文本还是数值,取决于函数返回类型。如果发现取出来的价格不能求和、不能比较大小,多半是被当成了文本。这时候可以用VALUE函数强制转换,或者用乘1的方式(=GetJsonProperty(...)*1)把它变成数字。
涨跌颜色用条件格式做最省事:选中涨跌幅那一列,新建规则,大于0显示红色,小于0显示绿色(A股习惯红涨绿跌,如果你看的是别的市场,反过来即可)。这样一眼扫过去,红绿分明,比看数字快得多。
4. 完整实操流程与关键环节实现
4.1 环境确认与函数可用性测试
动手第一步,先在一个空白单元格里试一下GetStockSource能不能用。输入类似:
=GetStockSource("600519")如果返回一坨JSON文本,说明函数可用;如果返回#NAME?,说明你的Excel不认识这个函数,可能是版本问题,也可能是需要启用某个加载项。这一步必须先过,不然后面全是空中楼阁。
4.2 搭建原始数据区
我习惯把原始数据区放在表格最右侧或者单独一个sheet,命名为"raw",避免干扰展示区。结构大概是:
| 单元格 | 内容 | 说明 |
|---|---|---|
| A2 | 标的代码 | 手动填写或下拉选择 |
| B2 | 原始JSON | =GetStockSource(A2) |
| C2 | 名称 | =GetJsonProperty(B2,"data.name") |
| D2 | 现价 | =GetJsonProperty(B2,"data.price") |
| E2 | 涨跌幅 | =GetJsonProperty(B2,"data.changePercent") |
这个结构清晰、可扩展。要加字段,就在后面继续加列;要加标的,就往下加行。
4.3 展示区的美化与信息浓缩
展示区是给你自己瞄一眼用的,信息要极度浓缩。我的做法是只保留四列:名称、现价、涨跌幅、更新时间。涨跌幅用条件格式上色,现价保留两位小数,更新时间用NOW()或者数据源返回的时间戳。整个展示区控制在屏幕一屏之内,扫一眼就完事,不需要滚动。
如果你想让展示区更"低调",可以把字体调成和背景接近的灰色,或者把表格做得像一份普通的工作文档,这样即使有人路过也不容易注意到。这是很多老哥的实际做法,实用性拉满。
4.4 刷新机制的设计
公式方案最大的短板是刷新。Excel不会自动帮你重新拉数据,除非你触发重算。几种常见的触发方式:
- 按
F9手动重算整个工作簿; - 按
Ctrl+Alt+F9强制重算所有公式(包括易失性函数); - 修改任意单元格触发自动重算(前提是开启了自动计算);
- 用
NOW()这类易失性函数"带动"其他公式一起重算。
我实测下来,最省心的是把自动计算打开,然后在展示区放一个NOW()单元格。每次你点一下表格、改个无关紧要的单元格,整张表就会重算一遍,数据也就跟着更新了。频率不用太高,看日线的场景,几分钟刷一次完全够。
提示:如果数据源有请求频率限制,千万别把重算触发搞得太频繁,否则容易被限流,返回空值或者错误。
4.5 一个可直接复用的最小示例
把上面的东西拼起来,一个最小可用的表格长这样:
A2: 600519 B2: =GetStockSource(A2) C2: =GetJsonProperty(B2,"data.name") D2: =GetJsonProperty(B2,"data.price")*1 E2: =GetJsonProperty(B2,"data.changePercent")*1 F2: =NOW()D2和E2后面的*1是为了强制转成数值。F2的NOW()既是时间戳,也是重算的"发动机"。这套结构你复制到自己的表里,改一下代码和字段路径,就能跑。
5. 常见问题与排查技巧实录
5.1 返回 #NAME? 或函数不存在
这是最常见的第一道坎。原因通常是Excel版本不支持这两个函数,或者函数来自某个未启用的加载项。排查顺序:先确认版本,再确认加载项,最后确认函数名拼写。如果确实不支持,那这套方案在你的环境里就跑不通,得换思路。
5.2 返回空值或 #VALUE!
多半是路径写错了。排查方法:把原始JSON单独复制出来,用格式化工具展开,逐层核对字段名和层级。特别注意大小写、数组下标、以及字段是否真的存在。有时候数据源在非交易时段返回的结构和交易时段不一样,字段可能缺失,这种要用IFERROR包一层,避免满屏错误值。
5.3 数字变成文本无法计算
前面提过,用*1或VALUE转换。如果转换后还是不行,检查一下取出来的值里是不是带了单位或者千分位逗号,这种要先清洗再转换。
5.4 数据不刷新
先确认自动计算是否开启,再确认有没有易失性函数带动重算。如果都正常但还是不刷新,可能是数据源本身有缓存,或者请求被限流了。这种情况等一会儿再试,或者降低刷新频率。
5.5 常见问题速查表
| 现象 | 可能原因 | 解决方向 |
|---|---|---|
| #NAME? | 函数不支持或拼写错误 | 确认版本与加载项 |
| #VALUE! | 路径错误或字段缺失 | 核对JSON结构 |
| 返回空 | 非交易时段或限流 | 加IFERROR,降频 |
| 数字是文本 | 返回类型为字符串 | 用VALUE或*1转换 |
| 不刷新 | 自动计算关闭或无易失函数 | 开启自动计算,加NOW() |
| 涨跌颜色不对 | 条件格式规则写反 | 检查大于小于方向 |
5.6 几条独家避坑心得
第一,永远给解析公式包一层IFERROR,返回一个空字符串或者"--",这样即使某次请求失败,表格也不会满屏红叉,看着糟心。
第二,原始JSON区一定要和展示区分开,最好放在单独sheet并隐藏。JSON文本又长又乱,混在展示区里既难看又容易误操作。
第三,字段路径不要硬编码在每一个公式里,如果字段多,可以在旁边放一列"路径"文本,公式用INDIRECT或者字符串拼接去引用,这样改路径只改一处。
第四,测试阶段先用一只你熟悉的标的,确认整条链路通了,再批量加。一上来就铺十几只,出了问题你都不知道是哪只的哪一步坏了。
第五,注意合规与场合。这套东西是提升个人效率的工具,用在合适的地方、合适的时机,别因为盯盘影响了正事,那就本末倒置了。
6. 把表格变成你自己的行情看板
这套方案跑通之后,你会发现它的扩展空间比想象中大。比如你可以加一列"量比",用成交量除以某个均值;可以加一列"距成本价百分比",把自己持仓的成本填进去自动算盈亏;甚至可以用条件格式做一个简单的"预警",当涨跌幅超过某个阈值时整行变色。这些都不需要新函数,全是Excel基础公式的排列组合。
我自己用下来最深的体会是:工具的价值不在于多高级,而在于它能不能无缝嵌进你现有的工作流。Excel人人都有、人人会用,把行情数据塞进这个最熟悉的容器里,学习成本几乎为零,这才是它真正的优势。至于刷新频率、字段多少、展示样式,都可以按你自己的习惯慢慢调,调到顺手为止。