Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
此号慢热型
excelize
提交
b812e9a1
excelize
项目概览
此号慢热型
/
excelize
与 Fork 源项目一致
Fork自
xuri / excelize
通知
2
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 搜索 >>
已验证
提交
b812e9a1
编写于
10月 22, 2020
作者:
xurime
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
New formula function AND (#701) and update doc for the NewSheet (#714)
上级
4834a058
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
67 addition
and
13 deletion
+67
-13
calc.go
calc.go
+47
-5
calc_test.go
calc_test.go
+16
-4
sheet.go
sheet.go
+4
-4
未找到文件。
calc.go
浏览文件 @
b812e9a1
...
...
@@ -116,11 +116,11 @@ var tokenPriority = map[string]int{
//
// ABS, ACOS, ACOSH, ACOT, ACOTH, AND, ARABIC, ASIN, ASINH, ATAN2, ATANH,
// BASE, CEILING, CEILING.MATH, CEILING.PRECISE, COMBIN, COMBINA, COS,
// COSH, COT, COTH, COUNTA, CSC, CSCH, D
ECIMAL, DEGREES, EVEN, EXP, FACT
,
// FACT
DOUBLE, FLOOR, FLOOR.MATH, FLOOR.PRECISE, GCD, INT, ISBLANK, ISERR
,
// ISERR
OR, ISEVEN, ISNA, ISNONTEXT, ISNUMBER, ISO.CEILING, ISODD, LCM
,
// L
N, LOG, LOG10, MDETERM, MEDIAN, MOD, MROUND, MULTINOMIAL, MUNIT, NA
,
// ODD, OR, PI, POWER, PRODUCT, QUOTIENT, RADIANS, RAND, RANDBETWEEN,
// COSH, COT, COTH, COUNTA, CSC, CSCH, D
ATE, DECIMAL, DEGREES, EVEN, EXP
,
// FACT
, FACTDOUBLE, FLOOR, FLOOR.MATH, FLOOR.PRECISE, GCD, INT, ISBLANK
,
// ISERR
, ISERROR, ISEVEN, ISNA, ISNONTEXT, ISNUMBER, ISO.CEILING, ISODD
,
// L
CM, LN, LOG, LOG10, MDETERM, MEDIAN, MOD, MROUND, MULTINOMIAL, MUNIT
,
//
NA,
ODD, OR, PI, POWER, PRODUCT, QUOTIENT, RADIANS, RAND, RANDBETWEEN,
// ROUND, ROUNDDOWN, ROUNDUP, SEC, SECH, SIGN, SIN, SINH, SQRT, SQRTPI,
// SUM, SUMIF, SUMSQ, TAN, TANH, TRUNC
//
...
...
@@ -3308,3 +3308,45 @@ func (fn *formulaFuncs) OR(argsList *list.List) (result string, err error) {
result
=
strings
.
ToUpper
(
strconv
.
FormatBool
(
or
))
return
}
// Date and Time Functions
// DATE returns a date, from a user-supplied year, month and day.
func
(
fn
*
formulaFuncs
)
DATE
(
argsList
*
list
.
List
)
(
result
string
,
err
error
)
{
if
argsList
.
Len
()
!=
3
{
err
=
errors
.
New
(
"DATE requires 3 number arguments"
)
return
}
var
year
,
month
,
day
int
if
year
,
err
=
strconv
.
Atoi
(
argsList
.
Front
()
.
Value
.
(
formulaArg
)
.
String
);
err
!=
nil
{
err
=
errors
.
New
(
"DATE requires 3 number arguments"
)
return
}
if
month
,
err
=
strconv
.
Atoi
(
argsList
.
Front
()
.
Next
()
.
Value
.
(
formulaArg
)
.
String
);
err
!=
nil
{
err
=
errors
.
New
(
"DATE requires 3 number arguments"
)
return
}
if
day
,
err
=
strconv
.
Atoi
(
argsList
.
Back
()
.
Value
.
(
formulaArg
)
.
String
);
err
!=
nil
{
err
=
errors
.
New
(
"DATE requires 3 number arguments"
)
return
}
d
:=
makeDate
(
year
,
time
.
Month
(
month
),
day
)
result
=
timeFromExcelTime
(
daysBetween
(
excelMinTime1900
.
Unix
(),
d
)
+
1
,
false
)
.
String
()
return
}
// makeDate return date as a Unix time, the number of seconds elapsed since
// January 1, 1970 UTC.
func
makeDate
(
y
int
,
m
time
.
Month
,
d
int
)
int64
{
if
y
==
1900
&&
int
(
m
)
<=
2
{
d
--
}
date
:=
time
.
Date
(
y
,
m
,
d
,
0
,
0
,
0
,
0
,
time
.
UTC
)
return
date
.
Unix
()
}
// daysBetween return time interval of the given start timestamp and end
// timestamp.
func
daysBetween
(
startDate
,
endDate
int64
)
float64
{
return
float64
(
int
(
0.5
+
float64
((
endDate
-
startDate
)
/
86400
)))
}
calc_test.go
浏览文件 @
b812e9a1
...
...
@@ -407,14 +407,14 @@ func TestCalcCellValue(t *testing.T) {
"=TRUNC(99.999,-1)"
:
"90"
,
"=TRUNC(-99.999,2)"
:
"-99.99"
,
"=TRUNC(-99.999,-1)"
:
"-90"
,
// Statistical
f
unctions
// Statistical
F
unctions
// COUNTA
`=COUNTA()`
:
"0"
,
`=COUNTA(A1:A5,B2:B5,"text",1,2)`
:
"8"
,
// MEDIAN
"=MEDIAN(A1:A5,12)"
:
"2"
,
"=MEDIAN(A1:A5)"
:
"1.5"
,
// Information
f
unctions
// Information
F
unctions
// ISBLANK
"=ISBLANK(A1)"
:
"FALSE"
,
"=ISBLANK(A5)"
:
"TRUE"
,
...
...
@@ -443,6 +443,7 @@ func TestCalcCellValue(t *testing.T) {
"=ISODD(A2)"
:
"FALSE"
,
// NA
"=NA()"
:
"#N/A"
,
// Logical Functions
// AND
"=AND(0)"
:
"FALSE"
,
"=AND(1)"
:
"TRUE"
,
...
...
@@ -457,6 +458,10 @@ func TestCalcCellValue(t *testing.T) {
"=OR(0)"
:
"FALSE"
,
"=OR(1=2,2=2)"
:
"TRUE"
,
"=OR(1=2,2=3)"
:
"FALSE"
,
// Date and Time Functions
// DATE
"=DATE(2020,10,21)"
:
"2020-10-21 00:00:00 +0000 UTC"
,
"=DATE(1900,1,1)"
:
"1899-12-31 00:00:00 +0000 UTC"
,
}
for
formula
,
expected
:=
range
mathCalc
{
f
:=
prepareData
()
...
...
@@ -732,10 +737,10 @@ func TestCalcCellValue(t *testing.T) {
"=TRUNC()"
:
"TRUNC requires at least 1 argument"
,
`=TRUNC("X")`
:
"#VALUE!"
,
`=TRUNC(1,"X")`
:
"#VALUE!"
,
// Statistical
f
unctions
// Statistical
F
unctions
// MEDIAN
"=MEDIAN()"
:
"MEDIAN requires at least 1 argument"
,
// Information
f
unctions
// Information
F
unctions
// ISBLANK
"=ISBLANK(A1,A2)"
:
"ISBLANK requires 1 argument"
,
// ISERR
...
...
@@ -756,6 +761,7 @@ func TestCalcCellValue(t *testing.T) {
`=ISODD("text")`
:
"#VALUE!"
,
// NA
"=NA(1)"
:
"NA accepts no arguments"
,
// Logical Functions
// AND
`=AND("text")`
:
"#VALUE!"
,
`=AND(A1:B1)`
:
"#VALUE!"
,
...
...
@@ -766,6 +772,12 @@ func TestCalcCellValue(t *testing.T) {
`=OR(A1:B1)`
:
"#VALUE!"
,
"=OR()"
:
"OR requires at least 1 argument"
,
"=OR(1"
+
strings
.
Repeat
(
",1"
,
30
)
+
")"
:
"OR accepts at most 30 arguments"
,
// Date and Time Functions
// DATE
"=DATE()"
:
"DATE requires 3 number arguments"
,
`=DATE("text",10,21)`
:
"DATE requires 3 number arguments"
,
`=DATE(2020,"text",21)`
:
"DATE requires 3 number arguments"
,
`=DATE(2020,10,"text")`
:
"DATE requires 3 number arguments"
,
}
for
formula
,
expected
:=
range
mathCalcError
{
f
:=
prepareData
()
...
...
sheet.go
浏览文件 @
b812e9a1
...
...
@@ -31,10 +31,10 @@ import (
"github.com/mohae/deepcopy"
)
// NewSheet provides
function to create a new sheet by given worksheet name.
//
When creating a new spreadsheet file, the default worksheet will be
//
created. Returns the number of sheets in the workbook (file) after
//
appending the new sheet
.
// NewSheet provides
the function to create a new sheet by given a worksheet
//
name and returns the index of the sheets in the workbook
//
(spreadsheet) after it appended. Note that when creating a new spreadsheet
//
file, the default worksheet named `Sheet1` will be created
.
func
(
f
*
File
)
NewSheet
(
name
string
)
int
{
// Check if the worksheet already exists
index
:=
f
.
GetSheetIndex
(
name
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录