Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xuri
excelize
提交
f5d3d59d
excelize
项目概览
xuri
/
excelize
通知
13
Star
2
Fork
4
代码
文件
提交
分支
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 搜索 >>
已验证
提交
f5d3d59d
编写于
6月 11, 2022
作者:
xurime
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ref #65: new formula function EOMONTH
上级
980fffa2
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
64 addition
and
1 deletion
+64
-1
calc.go
calc.go
+53
-1
calc_test.go
calc_test.go
+11
-0
未找到文件。
calc.go
浏览文件 @
f5d3d59d
...
...
@@ -435,6 +435,7 @@ type formulaFuncs struct {
// EFFECT
// EDATE
// ENCODEURL
// EOMONTH
// ERF
// ERF.PRECISE
// ERFC
...
...
@@ -12394,7 +12395,9 @@ func (fn *formulaFuncs) EDATE(argsList *list.List) formulaArg {
if month.Number > 11 {
y += int(math.Floor(float64(m) / 12))
}
m = int(math.Mod(float64(m), 12))
if m = m % 12; m < 0 {
m += 12
}
if d > 28 {
if days := getDaysInMonth(y, m); d > days {
d = days
...
...
@@ -12404,6 +12407,55 @@ func (fn *formulaFuncs) EDATE(argsList *list.List) formulaArg {
return newNumberFormulaArg(result)
}
// EOMONTH function returns the last day of the month, that is a specified
// number of months before or after an initial supplied start date. The syntax
// of the function is:
//
// EOMONTH(start_date,months)
//
func (fn *formulaFuncs) EOMONTH(argsList *list.List) formulaArg {
if argsList.Len() != 2 {
return newErrorFormulaArg(formulaErrorVALUE, "EOMONTH requires 2 arguments")
}
date := argsList.Front().Value.(formulaArg)
num := date.ToNumber()
var dateTime time.Time
if num.Type != ArgNumber {
dateString := strings.ToLower(date.Value())
if !isDateOnlyFmt(dateString) {
if _, _, _, _, _, err := strToTime(dateString); err.Type == ArgError {
return err
}
}
y, m, d, _, err := strToDate(dateString)
if err.Type == ArgError {
return err
}
dateTime = time.Date(y, time.Month(m), d, 0, 0, 0, 0, time.Now().Location())
} else {
if num.Number < 0 {
return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
}
dateTime = timeFromExcelTime(num.Number, false)
}
months := argsList.Back().Value.(formulaArg).ToNumber()
if months.Type != ArgNumber {
return months
}
y, m := dateTime.Year(), int(dateTime.Month())+int(months.Number)-1
if m < 0 {
y -= int(math.Ceil(-1 * float64(m) / 12))
}
if m > 11 {
y += int(math.Floor(float64(m) / 12))
}
if m = m % 12; m < 0 {
m += 12
}
result, _ := timeToExcelTime(time.Date(y, time.Month(m+1), getDaysInMonth(y, m+1), 0, 0, 0, 0, time.UTC), false)
return newNumberFormulaArg(result)
}
// HOUR function returns an integer representing the hour component of a
// supplied Excel time. The syntax of the function is:
//
...
...
calc_test.go
浏览文件 @
f5d3d59d
...
...
@@ -1479,6 +1479,11 @@ func TestCalcCellValue(t *testing.T) {
"=EDATE(
\"
01/01/2021
\"
,-1)"
:
"44166"
,
"=EDATE(
\"
01/31/2020
\"
,1)"
:
"43890"
,
"=EDATE(
\"
01/29/2020
\"
,12)"
:
"44225"
,
"=EDATE(
\"
6/12/2021
\"
,-14)"
:
"43933"
,
// EOMONTH
"=EOMONTH(
\"
01/01/2021
\"
,-1)"
:
"44196"
,
"=EOMONTH(
\"
01/29/2020
\"
,12)"
:
"44227"
,
"=EOMONTH(
\"
01/12/2021
\"
,-18)"
:
"43677"
,
// HOUR
"=HOUR(1)"
:
"0"
,
"=HOUR(43543.5032060185)"
:
"12"
,
...
...
@@ -3447,6 +3452,12 @@ func TestCalcCellValue(t *testing.T) {
"=EDATE(-1,0)"
:
"#NUM!"
,
"=EDATE(
\"\"
,0)"
:
"#VALUE!"
,
"=EDATE(
\"
January 25, 100
\"
,0)"
:
"#VALUE!"
,
// EOMONTH
"=EOMONTH()"
:
"EOMONTH requires 2 arguments"
,
"=EOMONTH(0,
\"\"
)"
:
"strconv.ParseFloat: parsing
\"\"
: invalid syntax"
,
"=EOMONTH(-1,0)"
:
"#NUM!"
,
"=EOMONTH(
\"\"
,0)"
:
"#VALUE!"
,
"=EOMONTH(
\"
January 25, 100
\"
,0)"
:
"#VALUE!"
,
// HOUR
"=HOUR()"
:
"HOUR requires exactly 1 argument"
,
"=HOUR(-1)"
:
"HOUR only accepts positive argument"
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录