Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wx5575
excelize
提交
c0ac3165
excelize
项目概览
wx5575
/
excelize
与 Fork 源项目一致
Fork自
xuri / excelize
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
excelize
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
已验证
提交
c0ac3165
编写于
12月 14, 2021
作者:
xurime
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ref #65: new formula function COUNTIFS
上级
33719334
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
52 addition
and
3 deletion
+52
-3
calc.go
calc.go
+46
-3
calc_test.go
calc_test.go
+6
-0
未找到文件。
calc.go
浏览文件 @
c0ac3165
...
...
@@ -355,6 +355,7 @@ type formulaFuncs struct {
// COUNTA
// COUNTBLANK
// COUNTIF
// COUNTIFS
// COUPDAYBS
// COUPDAYS
// COUPDAYSNC
...
...
@@ -5222,6 +5223,48 @@ func (fn *formulaFuncs) COUNTIF(argsList *list.List) formulaArg {
return
newNumberFormulaArg
(
count
)
}
// COUNTIFS function returns the number of rows within a table, that satisfy a
// set of given criteria. The syntax of the function is:
//
// COUNTIFS(criteria_range1,criteria1,[criteria_range2,criteria2],...)
//
func
(
fn
*
formulaFuncs
)
COUNTIFS
(
argsList
*
list
.
List
)
formulaArg
{
if
argsList
.
Len
()
<
2
{
return
newErrorFormulaArg
(
formulaErrorVALUE
,
"COUNTIFS requires at least 2 arguments"
)
}
if
argsList
.
Len
()
%
2
!=
0
{
return
newErrorFormulaArg
(
formulaErrorNA
,
formulaErrorNA
)
}
group
,
rowsIdx
:=
0
,
map
[
int
]
struct
{}{}
for
criteriaRange
:=
argsList
.
Front
();
criteriaRange
!=
nil
;
criteriaRange
=
criteriaRange
.
Next
()
{
criteria
:=
criteriaRange
.
Next
()
if
group
==
0
{
for
rowIdx
,
row
:=
range
criteriaRange
.
Value
.
(
formulaArg
)
.
Matrix
{
for
_
,
col
:=
range
row
{
if
ok
,
_
:=
formulaCriteriaEval
(
col
.
String
,
formulaCriteriaParser
(
criteria
.
Value
.
(
formulaArg
)
.
Value
()));
ok
{
rowsIdx
[
rowIdx
]
=
struct
{}{}
}
}
}
}
else
{
for
rowIdx
,
row
:=
range
criteriaRange
.
Value
.
(
formulaArg
)
.
Matrix
{
if
_
,
ok
:=
rowsIdx
[
rowIdx
];
!
ok
{
delete
(
rowsIdx
,
rowIdx
)
continue
}
for
_
,
col
:=
range
row
{
if
ok
,
_
:=
formulaCriteriaEval
(
col
.
String
,
formulaCriteriaParser
(
criteria
.
Value
.
(
formulaArg
)
.
Value
()));
!
ok
{
delete
(
rowsIdx
,
rowIdx
)
}
}
}
}
criteriaRange
=
criteriaRange
.
Next
()
group
++
}
return
newNumberFormulaArg
(
float64
(
len
(
rowsIdx
)))
}
// DEVSQ function calculates the sum of the squared deviations from the sample
// mean. The syntax of the function is:
//
...
...
@@ -6923,15 +6966,15 @@ func (fn *formulaFuncs) SHEETS(argsList *list.List) formulaArg {
return
newNumberFormulaArg
(
float64
(
len
(
fn
.
f
.
GetSheetList
())))
}
arg
:=
argsList
.
Front
()
.
Value
.
(
formulaArg
)
sheetMap
:=
map
[
string
]
interface
{}{}
sheetMap
:=
map
[
string
]
struct
{}{}
if
arg
.
cellRanges
!=
nil
&&
arg
.
cellRanges
.
Len
()
>
0
{
for
rng
:=
arg
.
cellRanges
.
Front
();
rng
!=
nil
;
rng
=
rng
.
Next
()
{
sheetMap
[
rng
.
Value
.
(
cellRange
)
.
From
.
Sheet
]
=
nil
sheetMap
[
rng
.
Value
.
(
cellRange
)
.
From
.
Sheet
]
=
struct
{}{}
}
}
if
arg
.
cellRefs
!=
nil
&&
arg
.
cellRefs
.
Len
()
>
0
{
for
ref
:=
arg
.
cellRefs
.
Front
();
ref
!=
nil
;
ref
=
ref
.
Next
()
{
sheetMap
[
ref
.
Value
.
(
cellRef
)
.
Sheet
]
=
nil
sheetMap
[
ref
.
Value
.
(
cellRef
)
.
Sheet
]
=
struct
{}{}
}
}
if
len
(
sheetMap
)
>
0
{
...
...
calc_test.go
浏览文件 @
c0ac3165
...
...
@@ -799,6 +799,9 @@ func TestCalcCellValue(t *testing.T) {
"=COUNTIF(D1:D9,
\"
<>Jan
\"
)"
:
"5"
,
"=COUNTIF(A1:F9,
\"
>=50000
\"
)"
:
"2"
,
"=COUNTIF(A1:F9,TRUE)"
:
"0"
,
// COUNTIFS
"=COUNTIFS(A1:A9,2,D1:D9,
\"
Jan
\"
)"
:
"1"
,
"=COUNTIFS(F1:F9,
\"
>20000
\"
,D1:D9,
\"
Jan
\"
)"
:
"4"
,
// DEVSQ
"=DEVSQ(1,3,5,2,9,7)"
:
"47.5"
,
"=DEVSQ(A1:D2)"
:
"10"
,
...
...
@@ -2211,6 +2214,9 @@ func TestCalcCellValue(t *testing.T) {
"=COUNTBLANK(1,2)"
:
"COUNTBLANK requires 1 argument"
,
// COUNTIF
"=COUNTIF()"
:
"COUNTIF requires 2 arguments"
,
// COUNTIFS
"=COUNTIFS()"
:
"COUNTIFS requires at least 2 arguments"
,
"=COUNTIFS(A1:A9,2,D1:D9)"
:
"#N/A"
,
// DEVSQ
"=DEVSQ()"
:
"DEVSQ requires at least 1 numeric argument"
,
"=DEVSQ(D1:D2)"
:
"#N/A"
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录