Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xuri
excelize
提交
cb5a8e2d
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 搜索 >>
未验证
提交
cb5a8e2d
编写于
8月 23, 2023
作者:
F
fsfsx
提交者:
GitHub
8月 23, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
This closes #674, closes #1454, add new exported functions GetTables and DeleteTable (#1573)
上级
1b63d098
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
138 addition
and
0 deletion
+138
-0
errors.go
errors.go
+6
-0
table.go
table.go
+85
-0
table_test.go
table_test.go
+46
-0
xmlTable.go
xmlTable.go
+1
-0
未找到文件。
errors.go
浏览文件 @
cb5a8e2d
...
@@ -82,6 +82,12 @@ func newNoExistSheetError(name string) error {
...
@@ -82,6 +82,12 @@ func newNoExistSheetError(name string) error {
return
fmt
.
Errorf
(
"sheet %s does not exist"
,
name
)
return
fmt
.
Errorf
(
"sheet %s does not exist"
,
name
)
}
}
// newNoExistTableError defined the error message on receiving the non existing
// table name.
func
newNoExistTableError
(
name
string
)
error
{
return
fmt
.
Errorf
(
"table %s does not exist"
,
name
)
}
// newNotWorksheetError defined the error message on receiving a sheet which
// newNotWorksheetError defined the error message on receiving a sheet which
// not a worksheet.
// not a worksheet.
func
newNotWorksheetError
(
name
string
)
error
{
func
newNotWorksheetError
(
name
string
)
error
{
...
...
table.go
浏览文件 @
cb5a8e2d
...
@@ -125,6 +125,91 @@ func (f *File) AddTable(sheet string, table *Table) error {
...
@@ -125,6 +125,91 @@ func (f *File) AddTable(sheet string, table *Table) error {
return
f
.
addContentTypePart
(
tableID
,
"table"
)
return
f
.
addContentTypePart
(
tableID
,
"table"
)
}
}
// GetTables provides the method to get all tables in a worksheet by given
// worksheet name.
func
(
f
*
File
)
GetTables
(
sheet
string
)
([]
Table
,
error
)
{
var
tables
[]
Table
ws
,
err
:=
f
.
workSheetReader
(
sheet
)
if
err
!=
nil
{
return
tables
,
err
}
if
ws
.
TableParts
==
nil
{
return
tables
,
err
}
for
_
,
tbl
:=
range
ws
.
TableParts
.
TableParts
{
if
tbl
!=
nil
{
target
:=
f
.
getSheetRelationshipsTargetByID
(
sheet
,
tbl
.
RID
)
tableXML
:=
strings
.
ReplaceAll
(
target
,
".."
,
"xl"
)
content
,
ok
:=
f
.
Pkg
.
Load
(
tableXML
)
if
!
ok
{
continue
}
var
t
xlsxTable
if
err
:=
f
.
xmlNewDecoder
(
bytes
.
NewReader
(
namespaceStrictToTransitional
(
content
.
([]
byte
))))
.
Decode
(
&
t
);
err
!=
nil
&&
err
!=
io
.
EOF
{
return
tables
,
err
}
table
:=
Table
{
rID
:
tbl
.
RID
,
Range
:
t
.
Ref
,
Name
:
t
.
Name
,
}
if
t
.
TableStyleInfo
!=
nil
{
table
.
StyleName
=
t
.
TableStyleInfo
.
Name
table
.
ShowColumnStripes
=
t
.
TableStyleInfo
.
ShowColumnStripes
table
.
ShowFirstColumn
=
t
.
TableStyleInfo
.
ShowFirstColumn
table
.
ShowLastColumn
=
t
.
TableStyleInfo
.
ShowLastColumn
table
.
ShowRowStripes
=
&
t
.
TableStyleInfo
.
ShowRowStripes
}
tables
=
append
(
tables
,
table
)
}
}
return
tables
,
err
}
// DeleteTable provides the method to delete table by given table name.
func
(
f
*
File
)
DeleteTable
(
name
string
)
error
{
if
err
:=
checkDefinedName
(
name
);
err
!=
nil
{
return
err
}
for
_
,
sheet
:=
range
f
.
GetSheetList
()
{
tables
,
err
:=
f
.
GetTables
(
sheet
)
if
err
!=
nil
{
return
err
}
for
_
,
table
:=
range
tables
{
if
table
.
Name
!=
name
{
continue
}
ws
,
_
:=
f
.
workSheetReader
(
sheet
)
for
i
,
tbl
:=
range
ws
.
TableParts
.
TableParts
{
if
tbl
.
RID
==
table
.
rID
{
ws
.
TableParts
.
TableParts
=
append
(
ws
.
TableParts
.
TableParts
[
:
i
],
ws
.
TableParts
.
TableParts
[
i
+
1
:
]
...
)
f
.
deleteSheetRelationships
(
sheet
,
tbl
.
RID
)
break
}
}
if
ws
.
TableParts
.
Count
=
len
(
ws
.
TableParts
.
TableParts
);
ws
.
TableParts
.
Count
==
0
{
ws
.
TableParts
=
nil
}
// Delete cell value in the table header
coordinates
,
err
:=
rangeRefToCoordinates
(
table
.
Range
)
if
err
!=
nil
{
return
err
}
_
=
sortCoordinates
(
coordinates
)
for
col
:=
coordinates
[
0
];
col
<=
coordinates
[
2
];
col
++
{
for
row
:=
coordinates
[
1
];
row
<
coordinates
[
1
]
+
1
;
row
++
{
cell
,
_
:=
CoordinatesToCellName
(
col
,
row
)
err
=
f
.
SetCellValue
(
sheet
,
cell
,
nil
)
}
}
return
err
}
}
return
newNoExistTableError
(
name
)
}
// countTables provides a function to get table files count storage in the
// countTables provides a function to get table files count storage in the
// folder xl/tables.
// folder xl/tables.
func
(
f
*
File
)
countTables
()
int
{
func
(
f
*
File
)
countTables
()
int
{
...
...
table_test.go
浏览文件 @
cb5a8e2d
...
@@ -27,6 +27,10 @@ func TestAddTable(t *testing.T) {
...
@@ -27,6 +27,10 @@ func TestAddTable(t *testing.T) {
ShowHeaderRow
:
boolPtr
(
false
),
ShowHeaderRow
:
boolPtr
(
false
),
}))
}))
assert
.
NoError
(
t
,
f
.
AddTable
(
"Sheet2"
,
&
Table
{
Range
:
"F1:F1"
,
StyleName
:
"TableStyleMedium8"
}))
assert
.
NoError
(
t
,
f
.
AddTable
(
"Sheet2"
,
&
Table
{
Range
:
"F1:F1"
,
StyleName
:
"TableStyleMedium8"
}))
// Test get tables in worksheet
tables
,
err
:=
f
.
GetTables
(
"Sheet2"
)
assert
.
Len
(
t
,
tables
,
3
)
assert
.
NoError
(
t
,
err
)
// Test add table with already exist table name
// Test add table with already exist table name
assert
.
Equal
(
t
,
f
.
AddTable
(
"Sheet2"
,
&
Table
{
Name
:
"Table1"
}),
ErrExistsTableName
)
assert
.
Equal
(
t
,
f
.
AddTable
(
"Sheet2"
,
&
Table
{
Name
:
"Table1"
}),
ErrExistsTableName
)
...
@@ -74,6 +78,48 @@ func TestAddTable(t *testing.T) {
...
@@ -74,6 +78,48 @@ func TestAddTable(t *testing.T) {
assert
.
NoError
(
t
,
f
.
AddTable
(
"Sheet1"
,
&
Table
{
Range
:
"A1:B2"
}))
assert
.
NoError
(
t
,
f
.
AddTable
(
"Sheet1"
,
&
Table
{
Range
:
"A1:B2"
}))
}
}
func
TestGetTables
(
t
*
testing
.
T
)
{
f
:=
NewFile
()
// Test get tables in none table worksheet
tables
,
err
:=
f
.
GetTables
(
"Sheet1"
)
assert
.
Len
(
t
,
tables
,
0
)
assert
.
NoError
(
t
,
err
)
// Test get tables in not exist worksheet
_
,
err
=
f
.
GetTables
(
"SheetN"
)
assert
.
EqualError
(
t
,
err
,
"sheet SheetN does not exist"
)
// Test adjust table with unsupported charset
assert
.
NoError
(
t
,
f
.
AddTable
(
"Sheet1"
,
&
Table
{
Range
:
"B26:A21"
}))
f
.
Pkg
.
Store
(
"xl/tables/table1.xml"
,
MacintoshCyrillicCharset
)
_
,
err
=
f
.
GetTables
(
"Sheet1"
)
assert
.
EqualError
(
t
,
err
,
"XML syntax error on line 1: invalid UTF-8"
)
// Test adjust table with no exist table parts
f
.
Pkg
.
Delete
(
"xl/tables/table1.xml"
)
tables
,
err
=
f
.
GetTables
(
"Sheet1"
)
assert
.
Len
(
t
,
tables
,
0
)
assert
.
NoError
(
t
,
err
)
}
func
TestDeleteTable
(
t
*
testing
.
T
)
{
f
:=
NewFile
()
assert
.
NoError
(
t
,
f
.
AddTable
(
"Sheet1"
,
&
Table
{
Range
:
"A1:B4"
,
Name
:
"Table1"
}))
assert
.
NoError
(
t
,
f
.
AddTable
(
"Sheet1"
,
&
Table
{
Range
:
"B26:A21"
,
Name
:
"Table2"
}))
assert
.
NoError
(
t
,
f
.
DeleteTable
(
"Table2"
))
assert
.
NoError
(
t
,
f
.
DeleteTable
(
"Table1"
))
// Test delete table with invalid table name
assert
.
EqualError
(
t
,
f
.
DeleteTable
(
"Table 1"
),
newInvalidNameError
(
"Table 1"
)
.
Error
())
// Test delete table with no exist table name
assert
.
EqualError
(
t
,
f
.
DeleteTable
(
"Table"
),
newNoExistTableError
(
"Table"
)
.
Error
())
// Test delete table with unsupported charset
f
.
Sheet
.
Delete
(
"xl/worksheets/sheet1.xml"
)
f
.
Pkg
.
Store
(
"xl/worksheets/sheet1.xml"
,
MacintoshCyrillicCharset
)
assert
.
EqualError
(
t
,
f
.
DeleteTable
(
"Table1"
),
"XML syntax error on line 1: invalid UTF-8"
)
// Test delete table with invalid table range
f
=
NewFile
()
assert
.
NoError
(
t
,
f
.
AddTable
(
"Sheet1"
,
&
Table
{
Range
:
"A1:B4"
,
Name
:
"Table1"
}))
f
.
Pkg
.
Store
(
"xl/tables/table1.xml"
,
[]
byte
(
"<table name=
\"
Table1
\"
ref=
\"
-
\"
/>"
))
assert
.
EqualError
(
t
,
f
.
DeleteTable
(
"Table1"
),
ErrParameterInvalid
.
Error
())
}
func
TestSetTableHeader
(
t
*
testing
.
T
)
{
func
TestSetTableHeader
(
t
*
testing
.
T
)
{
f
:=
NewFile
()
f
:=
NewFile
()
_
,
err
:=
f
.
setTableHeader
(
"Sheet1"
,
true
,
1
,
0
,
1
)
_
,
err
:=
f
.
setTableHeader
(
"Sheet1"
,
true
,
1
,
0
,
1
)
...
...
xmlTable.go
浏览文件 @
cb5a8e2d
...
@@ -198,6 +198,7 @@ type xlsxTableStyleInfo struct {
...
@@ -198,6 +198,7 @@ type xlsxTableStyleInfo struct {
// Table directly maps the format settings of the table.
// Table directly maps the format settings of the table.
type
Table
struct
{
type
Table
struct
{
rID
string
Range
string
Range
string
Name
string
Name
string
StyleName
string
StyleName
string
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录