复杂报表单元格公式里可以直接调用下列函数。写法是 函数名(参数),函数名不区分大小写。单元格引用、加减乘除和 if 见 表达式;按扩展行取上月、同年见 层次坐标。
参数里的「日期」可以是日期单元格,或 "2010-01-01"、"2010-01-01 00:00:00" 这样的文字。带千分位的金额在做除法时,请用层次坐标取原始数字,见层次坐标文档。
1. 日期函数
| 函数 | 说明 | 示例 |
NOW() | 当前日期时间,默认格式 yyyy-MM-dd HH:mm:ss。传入格式文字时按该格式输出。 | NOW()
NOW("yyyy-MM-dd") |
YEAR(日期) | 年份,四位数字。 | YEAR("2010-03-15") → 2010 |
MONTH(日期) | 月份,1 到 12。 | MONTH("2010-03-15") → 3 |
DAY(日期) | 日,1 到 31。 | DAY("2010-03-15") → 15 |
WEEK(日期) | 该日期在一年中的第几周。 | WEEK(A3) |
WEEKDAY(日期) | 星期。返回 1 到 7:1 是星期日,2 是星期一,……,7 是星期六。 | WEEKDAY("2010-01-03") |
FORMAT(日期) | 把日期格式化成文字。不写格式时为 yyyy-MM-dd HH:mm:ss。 | FORMAT(A3, "yyyy-MM") |
EDATE(起始日期, 月数) | 起始日期加减若干月,结果为 yyyy-MM-dd。正数向后,负数向前。月末日期会落到目标月的最后一天。 | EDATE("2010-01-31", 1) → 2010-02-28 |
YEAR_OFFSET_DATE(年偏移, 月, 日) | 以今年为基准偏移年份,再取指定的月、日,结果为 yyyy-MM-dd。 | YEAR_OFFSET_DATE(0, 1, 1) 今年 1 月 1 日
YEAR_OFFSET_DATE(-1, 12, 31) 去年 12 月 31 日 |
GETYEARDAY(日期时间, 第几天) | 取第一个参数里的年份,返回该年的第 N 天,格式 yyyy-MM-dd。日期时间须写成 yyyy-MM-dd HH:mm:ss。 | GETYEARDAY("2010-01-01 00:00:00", 32) → 2010-02-01 |
2. 数学函数
| 函数 | 说明 | 示例 |
SUM(区域) | 求和。常配合层次坐标只加同一组。 | SUM(D3[])
SUM(D3[]{A3==A3}) 当年合计 |
AVG(区域) | 平均值。 | AVG(D3[]{A3==A3}) |
COUNT(区域) | 个数。可用来做排名:比当前值大的个数 + 1。 | COUNT(D3[]{D3>D3[B3:-0]}) + 1 |
MAX(区域) | 最大值。 | MAX(D3[]{A3==A3}) |
MIN(区域) | 最小值。 | MIN(D3[]) |
ABS(数值) | 绝对值。 | ABS(-12) → 12 |
CEIL(数值) | 向上取整。 | CEIL(1.2) → 2 |
FLOOR(数值) | 向下取整。 | FLOOR(1.8) → 1 |
ROUND(数值) | 四舍五入到整数。没有「保留几位小数」的第二个参数。要保留小数,请用单元格格式。 | ROUND(1.5) → 2 |
POWER(底数, 指数) | 乘幂。指数按整数使用。 | POWER(2, 3) → 8 |
SQRT(数值) | 平方根。参数须为正数。 | SQRT(9) → 3 |
EXP(数值) | e 的乘幂。 | EXP(1) |
LOG(数值) | 自然对数(以 e 为底)。 | LOG(10) |
LOG10(数值) | 以 10 为底的对数。 | LOG10(100) → 2 |
SIN(弧度) | 正弦。 | SIN(0) → 0 |
COS(弧度) | 余弦。 | COS(0) → 1 |
TAN(弧度) | 正切。 | TAN(0) → 0 |
MEDIAN(区域) | 中位数。 | MEDIAN(D3[]) |
MODE(区域) | 众数。 | MODE(D3[]) |
VARP(区域) | 总体方差。 | VARP(D3[]) |
STDEVP(区域) | 总体标准差。 | STDEVP(D3[]) |
CN(数值) | 数字转中文大写数字(壹、贰、叁,含拾、佰、仟)。 | CN(123) |
CNY(数值) | 数字转人民币大写,带圆、角、分。整数带「整」。 | CNY(123.4) |
UUID() | 生成一个 UUID 文字。 | UUID() |
RAND、NUMTOZH 目前没有计算结果,不要写进报表。随机数请在数据集里生成;数字转中文用 CN 或 CNY。
3. 文本函数
| 函数 | 说明 | 示例 |
CONCAT(值1, 值2, …) | 把多个值拼成一段文字。 | CONCAT(B3, "月份") → 1月份 |
JOIN(分隔符, 值1, 值2, …) | 用分隔符拼接。第一个参数是分隔符。 | JOIN("-", A3, B3) → 2010-1 |
TRIM(文本) | 去掉首尾空格。 | TRIM(" 华东 ") → 华东 |
LENGTH(文本) | 字符个数。 | LENGTH("月份") → 2 |
LOWER(文本) | 转小写。 | LOWER("AbC") → abc |
UPPER(文本) | 转大写。 | UPPER("AbC") → ABC |
SUBSTRING(文本, 开始, 结束) | 截取。下标从 0 开始,含开始、不含结束。只写开始时,截到末尾。 | SUBSTRING("2010-01", 0, 4) → 2010 |
INDEXOF(文本, 查找) | 查找第一次出现的位置,从 0 开始。找不到返回 -1。第三个参数是开始找的位置。 | INDEXOF("2010-01", "-") → 4 |
REPLACE(文本, 原文字, 新文字) | 替换。三个参数都要写。 | REPLACE(C3, "月份", "月") |
STARTS_WITH(文本, 前缀) | 是否以前缀开头,返回 true 或 false。 | STARTS_WITH("2010-01", "2010") |
ENDS_WITH(文本, 后缀) | 是否以后缀结尾。 | ENDS_WITH("1月份", "月份") |
QUERY(JSON文字, 属性名) | 从 JSON 文字里取一个属性。两个参数都要写。 | QUERY("{\"name\":\"华东\"}", "name") → 华东 |
4. 报表函数
| 函数 | 说明 | 示例 |
PAGENUM() | 当前页码。 | PAGENUM() |
PAGECOUNT() | 总页数。 | CONCAT("第", PAGENUM(), "/", PAGECOUNT(), "页") |
ROW() | 当前单元格所在行号。 | ROW() |
COL() | 当前单元格所在列号。 | COL() |
SEQ() | 扩展后的序号,从 1 开始。SEQ(扩展格) 按该格的扩展次序编号。 | SEQ(A3) |
ORDER(区域, 正序) | 把一组值排序后返回。第二个参数 true 从小到大,false 从大到小。 | ORDER(D3[], true) |
SORT(单元格, 降序, 不跳号) | 当前格子在同一批扩展值里的排名。第二个参数 true 从大到小,false 从小到大。第三个参数 true 名次不跳号(并列都占同一个名次,下一名紧接),false 跳号。只写这三个参数。按年份、部门分组的排名用 COUNT,见 同比环比示例。 | SORT(D3, true, true) |
5. 和显示格式配合
- 百分比:公式写比值(
本月 / 上月),单元格格式选百分比、0%。不要在公式里再乘 100。0.17 会显示成 17%,1.70 会显示成 170%。
- 金额:格式选数值、
#,##0。这种格式只影响显示。其他格子要拿这个金额做除法时,用层次坐标取数,例如 D3[B3:-0],不要直接写已格式化的 D3。
- 空结果:公式里写
null,预览该格为空白。适合「1 月没有环比」。