Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xuri
excelize
提交
134865d9
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 搜索 >>
未验证
提交
134865d9
编写于
11月 09, 2023
作者:
N
Nick
提交者:
GitHub
11月 09, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update data validation type and operator's enumerations (#1714)
上级
a0252bd0
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
84 addition
and
84 deletion
+84
-84
datavalidation.go
datavalidation.go
+78
-84
datavalidation_test.go
datavalidation_test.go
+6
-0
未找到文件。
datavalidation.go
浏览文件 @
134865d9
...
...
@@ -23,15 +23,14 @@ type DataValidationType int
// Data validation types.
const
(
_DataValidationType
=
iota
typeNone
// inline us
e
_
DataValidationType
=
iota
DataValidationTypeNon
e
DataValidationTypeCustom
DataValidationTypeDate
DataValidationTypeDecimal
typeList
// inline use
DataValidationTypeList
DataValidationTypeTextLength
DataValidationTypeTime
// DataValidationTypeWhole Integer
DataValidationTypeWhole
)
...
...
@@ -58,7 +57,7 @@ type DataValidationOperator int
// Data validation operators.
const
(
_DataValidationOperator
=
iota
_
DataValidationOperator
=
iota
DataValidationOperatorBetween
DataValidationOperatorEqual
DataValidationOperatorGreaterThan
...
...
@@ -69,13 +68,42 @@ const (
DataValidationOperatorNotEqual
)
// formulaEscaper mimics the Excel escaping rules for data validation,
// which converts `"` to `""` instead of `"`.
var
formulaEscaper
=
strings
.
NewReplacer
(
`&`
,
`&`
,
`<`
,
`<`
,
`>`
,
`>`
,
`"`
,
`""`
,
var
(
// formulaEscaper mimics the Excel escaping rules for data validation,
// which converts `"` to `""` instead of `"`.
formulaEscaper
=
strings
.
NewReplacer
(
`&`
,
`&`
,
`<`
,
`<`
,
`>`
,
`>`
,
`"`
,
`""`
,
)
// dataValidationTypeMap defined supported data validation types.
dataValidationTypeMap
=
map
[
DataValidationType
]
string
{
DataValidationTypeNone
:
"none"
,
DataValidationTypeCustom
:
"custom"
,
DataValidationTypeDate
:
"date"
,
DataValidationTypeDecimal
:
"decimal"
,
DataValidationTypeList
:
"list"
,
DataValidationTypeTextLength
:
"textLength"
,
DataValidationTypeTime
:
"time"
,
DataValidationTypeWhole
:
"whole"
,
}
// dataValidationOperatorMap defined supported data validation operators.
dataValidationOperatorMap
=
map
[
DataValidationOperator
]
string
{
DataValidationOperatorBetween
:
"between"
,
DataValidationOperatorEqual
:
"equal"
,
DataValidationOperatorGreaterThan
:
"greaterThan"
,
DataValidationOperatorGreaterThanOrEqual
:
"greaterThanOrEqual"
,
DataValidationOperatorLessThan
:
"lessThan"
,
DataValidationOperatorLessThanOrEqual
:
"lessThanOrEqual"
,
DataValidationOperatorNotBetween
:
"notBetween"
,
DataValidationOperatorNotEqual
:
"notEqual"
,
}
)
const
(
formula1Name
=
"formula1"
formula2Name
=
"formula2"
)
// NewDataValidation return data validation struct.
...
...
@@ -123,45 +151,43 @@ func (dv *DataValidation) SetDropList(keys []string) error {
if
MaxFieldLength
<
len
(
utf16
.
Encode
([]
rune
(
formula
)))
{
return
ErrDataValidationFormulaLength
}
dv
.
Formula1
=
fmt
.
Sprintf
(
`<
formula1>"%s"</formula1>`
,
formulaEscaper
.
Replace
(
formula
)
)
dv
.
Type
=
convDataValidationType
(
typeList
)
dv
.
Formula1
=
fmt
.
Sprintf
(
`<
%[2]s>"%[1]s"</%[2]s>`
,
formulaEscaper
.
Replace
(
formula
),
formula1Name
)
dv
.
Type
=
dataValidationTypeMap
[
DataValidationTypeList
]
return
nil
}
// SetRange provides function to set data validation range in drop list, only
// accepts int, float64,
or
string data type formula argument.
// accepts int, float64,
string or []
string data type formula argument.
func
(
dv
*
DataValidation
)
SetRange
(
f1
,
f2
interface
{},
t
DataValidationType
,
o
DataValidationOperator
)
error
{
var
formula1
,
formula2
string
switch
v
:=
f1
.
(
type
)
{
case
int
:
formula1
=
fmt
.
Sprintf
(
"<formula1>%d</formula1>"
,
v
)
case
float64
:
if
math
.
Abs
(
v
)
>
math
.
MaxFloat32
{
return
ErrDataValidationRange
genFormula
:=
func
(
name
string
,
val
interface
{})
(
string
,
error
)
{
var
formula
string
switch
v
:=
val
.
(
type
)
{
case
int
:
formula
=
fmt
.
Sprintf
(
"<%s>%d</%s>"
,
name
,
v
,
name
)
case
float64
:
if
math
.
Abs
(
v
)
>
math
.
MaxFloat32
{
return
formula
,
ErrDataValidationRange
}
formula
=
fmt
.
Sprintf
(
"<%s>%.17g</%s>"
,
name
,
v
,
name
)
case
string
:
formula
=
fmt
.
Sprintf
(
"<%s>%s</%s>"
,
name
,
v
,
name
)
default
:
return
formula
,
ErrParameterInvalid
}
formula1
=
fmt
.
Sprintf
(
"<formula1>%.17g</formula1>"
,
v
)
case
string
:
formula1
=
fmt
.
Sprintf
(
"<formula1>%s</formula1>"
,
v
)
default
:
return
ErrParameterInvalid
return
formula
,
nil
}
switch
v
:=
f2
.
(
type
)
{
case
int
:
formula2
=
fmt
.
Sprintf
(
"<formula2>%d</formula2>"
,
v
)
case
float64
:
if
math
.
Abs
(
v
)
>
math
.
MaxFloat32
{
return
ErrDataValidationRange
}
formula2
=
fmt
.
Sprintf
(
"<formula2>%.17g</formula2>"
,
v
)
case
string
:
formula2
=
fmt
.
Sprintf
(
"<formula2>%s</formula2>"
,
v
)
default
:
return
ErrParameterInvalid
formula1
,
err
:=
genFormula
(
formula1Name
,
f1
)
if
err
!=
nil
{
return
err
}
formula2
,
err
:=
genFormula
(
formula2Name
,
f2
)
if
err
!=
nil
{
return
err
}
dv
.
Formula1
,
dv
.
Formula2
=
formula1
,
formula2
dv
.
Type
=
convDataValidationType
(
t
)
dv
.
Operator
=
convDataValidationOperator
(
o
)
return
nil
dv
.
Type
=
dataValidationTypeMap
[
t
]
dv
.
Operator
=
dataValidationOperatorMap
[
o
]
return
err
}
// SetSqrefDropList provides set data validation on a range with source
...
...
@@ -180,48 +206,16 @@ func (dv *DataValidation) SetRange(f1, f2 interface{}, t DataValidationType, o D
// err := f.AddDataValidation("Sheet1", dv)
func
(
dv
*
DataValidation
)
SetSqrefDropList
(
sqref
string
)
{
dv
.
Formula1
=
fmt
.
Sprintf
(
"<formula1>%s</formula1>"
,
sqref
)
dv
.
Type
=
convDataValidationType
(
typeList
)
dv
.
Type
=
dataValidationTypeMap
[
DataValidationTypeList
]
}
// SetSqref provides function to set data validation range in drop list.
func
(
dv
*
DataValidation
)
SetSqref
(
sqref
string
)
{
if
dv
.
Sqref
==
""
{
dv
.
Sqref
=
sqref
}
else
{
dv
.
Sqref
=
fmt
.
Sprintf
(
"%s %s"
,
dv
.
Sqref
,
sqref
)
return
}
}
// convDataValidationType get excel data validation type.
func
convDataValidationType
(
t
DataValidationType
)
string
{
typeMap
:=
map
[
DataValidationType
]
string
{
typeNone
:
"none"
,
DataValidationTypeCustom
:
"custom"
,
DataValidationTypeDate
:
"date"
,
DataValidationTypeDecimal
:
"decimal"
,
typeList
:
"list"
,
DataValidationTypeTextLength
:
"textLength"
,
DataValidationTypeTime
:
"time"
,
DataValidationTypeWhole
:
"whole"
,
}
return
typeMap
[
t
]
}
// convDataValidationOperator get excel data validation operator.
func
convDataValidationOperator
(
o
DataValidationOperator
)
string
{
typeMap
:=
map
[
DataValidationOperator
]
string
{
DataValidationOperatorBetween
:
"between"
,
DataValidationOperatorEqual
:
"equal"
,
DataValidationOperatorGreaterThan
:
"greaterThan"
,
DataValidationOperatorGreaterThanOrEqual
:
"greaterThanOrEqual"
,
DataValidationOperatorLessThan
:
"lessThan"
,
DataValidationOperatorLessThanOrEqual
:
"lessThanOrEqual"
,
DataValidationOperatorNotBetween
:
"notBetween"
,
DataValidationOperatorNotEqual
:
"notEqual"
,
}
return
typeMap
[
o
]
dv
.
Sqref
=
fmt
.
Sprintf
(
"%s %s"
,
dv
.
Sqref
,
sqref
)
}
// AddDataValidation provides set data validation on a range of the worksheet
...
...
@@ -337,23 +331,23 @@ func (f *File) squashSqref(cells [][]int) []string {
}
else
if
len
(
cells
)
==
0
{
return
[]
string
{}
}
var
res
[]
string
var
re
f
s
[]
string
l
,
r
:=
0
,
0
for
i
:=
1
;
i
<
len
(
cells
);
i
++
{
if
cells
[
i
][
0
]
==
cells
[
r
][
0
]
&&
cells
[
i
][
1
]
-
cells
[
r
][
1
]
>
1
{
curr
,
_
:=
f
.
coordinatesToRangeRef
(
append
(
cells
[
l
],
cells
[
r
]
...
))
ref
,
_
:=
f
.
coordinatesToRangeRef
(
append
(
cells
[
l
],
cells
[
r
]
...
))
if
l
==
r
{
curr
,
_
=
CoordinatesToCellName
(
cells
[
l
][
0
],
cells
[
l
][
1
])
ref
,
_
=
CoordinatesToCellName
(
cells
[
l
][
0
],
cells
[
l
][
1
])
}
re
s
=
append
(
res
,
curr
)
re
fs
=
append
(
refs
,
ref
)
l
,
r
=
i
,
i
}
else
{
r
++
}
}
curr
,
_
:=
f
.
coordinatesToRangeRef
(
append
(
cells
[
l
],
cells
[
r
]
...
))
ref
,
_
:=
f
.
coordinatesToRangeRef
(
append
(
cells
[
l
],
cells
[
r
]
...
))
if
l
==
r
{
curr
,
_
=
CoordinatesToCellName
(
cells
[
l
][
0
],
cells
[
l
][
1
])
ref
,
_
=
CoordinatesToCellName
(
cells
[
l
][
0
],
cells
[
l
][
1
])
}
return
append
(
re
s
,
curr
)
return
append
(
re
fs
,
ref
)
}
datavalidation_test.go
浏览文件 @
134865d9
...
...
@@ -67,6 +67,12 @@ func TestDataValidation(t *testing.T) {
assert
.
NoError
(
t
,
err
)
assert
.
Len
(
t
,
dataValidations
,
1
)
dv
=
NewDataValidation
(
true
)
dv
.
Sqref
=
"A4:A5"
assert
.
NoError
(
t
,
dv
.
SetRange
(
"Sheet2!$A$2:$A$3"
,
""
,
DataValidationTypeList
,
DataValidationOperatorBetween
))
dv
.
SetError
(
DataValidationErrorStyleStop
,
"error title"
,
"error body"
)
assert
.
NoError
(
t
,
f
.
AddDataValidation
(
"Sheet2"
,
dv
))
dv
=
NewDataValidation
(
true
)
dv
.
Sqref
=
"A5:B6"
for
_
,
listValid
:=
range
[][]
string
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录