Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
此号慢热型
excelize
提交
48f19f60
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,发现更多精彩内容 >>
已验证
提交
48f19f60
编写于
6月 27, 2020
作者:
xurime
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
support the row element without r attribute in the worksheet
上级
15fd5685
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
61 addition
and
35 deletion
+61
-35
cell_test.go
cell_test.go
+17
-0
col.go
col.go
+7
-11
excelize.go
excelize.go
+15
-6
rows.go
rows.go
+22
-18
未找到文件。
cell_test.go
浏览文件 @
48f19f60
...
...
@@ -95,6 +95,23 @@ func TestSetCellBool(t *testing.T) {
assert
.
EqualError
(
t
,
f
.
SetCellBool
(
"Sheet1"
,
"A"
,
true
),
`cannot convert cell "A" to coordinates: invalid cell name "A"`
)
}
func
TestGetCellValue
(
t
*
testing
.
T
)
{
// Test get cell value without r attribute of the row.
f
:=
NewFile
()
delete
(
f
.
Sheet
,
"xl/worksheets/sheet1.xml"
)
f
.
XLSX
[
"xl/worksheets/sheet1.xml"
]
=
[]
byte
(
`<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><sheetData><row r="3"><c t="str"><v>A3</v></c></row><row><c t="str"><v>A4</v></c><c t="str"><v>B4</v></c></row><row r="7"><c t="str"><v>A7</v></c><c t="str"><v>B7</v></c></row><row><c t="str"><v>A8</v></c><c t="str"><v>B8</v></c></row></sheetData></worksheet>`
)
f
.
checked
=
nil
cells
:=
[]
string
{
"A3"
,
"A4"
,
"B4"
,
"A7"
,
"B7"
}
rows
,
err
:=
f
.
GetRows
(
"Sheet1"
)
assert
.
Equal
(
t
,
[][]
string
{
nil
,
nil
,
{
"A3"
},
{
"A4"
,
"B4"
},
nil
,
nil
,
{
"A7"
,
"B7"
},
{
"A8"
,
"B8"
}},
rows
)
assert
.
NoError
(
t
,
err
)
for
_
,
cell
:=
range
cells
{
value
,
err
:=
f
.
GetCellValue
(
"Sheet1"
,
cell
)
assert
.
Equal
(
t
,
cell
,
value
)
assert
.
NoError
(
t
,
err
)
}
}
func
TestGetCellFormula
(
t
*
testing
.
T
)
{
// Test get cell formula on not exist worksheet.
f
:=
NewFile
()
...
...
col.go
浏览文件 @
48f19f60
...
...
@@ -42,18 +42,14 @@ type Cols struct {
// GetCols return all the columns in a sheet by given worksheet name (case
// sensitive). For example:
//
// cols, err := f.Cols("Sheet1")
// cols, err := f.
Get
Cols("Sheet1")
// if err != nil {
// fmt.Println(err)
// return
// }
// for cols.Next() {
// col, err := cols.Rows()
// if err != nil {
// fmt.Println(err)
// }
// for _, rowCell := range col {
// fmt.Print(rowCell, "\t")
// for _, col := range cols {
// for _, colCell := range col {
// fmt.Println(colCell, "\t")
// }
// fmt.Println()
// }
...
...
@@ -71,13 +67,13 @@ func (f *File) GetCols(sheet string) ([][]string, error) {
return
results
,
nil
}
// Next will return true if the next col
element
is found.
// Next will return true if the next col
umn
is found.
func
(
cols
*
Cols
)
Next
()
bool
{
cols
.
curCol
++
return
cols
.
curCol
<=
cols
.
totalCol
}
// Error will return an error when the
next col element is found
.
// Error will return an error when the
error occurs
.
func
(
cols
*
Cols
)
Error
()
error
{
return
cols
.
err
}
...
...
@@ -127,7 +123,7 @@ func (cols *Cols) Rows() ([]string, error) {
return
rows
,
nil
}
// Cols returns a columns iterator, used for streaming
/
reading data for a
// Cols returns a columns iterator, used for streaming
reading data for a
// worksheet with a large data. For example:
//
// cols, err := f.Cols("Sheet1")
...
...
excelize.go
浏览文件 @
48f19f60
...
...
@@ -191,16 +191,25 @@ func (f *File) workSheetReader(sheet string) (xlsx *xlsxWorksheet, err error) {
// checkSheet provides a function to fill each row element and make that is
// continuous in a worksheet of XML.
func
checkSheet
(
xlsx
*
xlsxWorksheet
)
{
row
:=
len
(
xlsx
.
SheetData
.
Row
)
if
row
>=
1
{
lastRow
:=
xlsx
.
SheetData
.
Row
[
row
-
1
]
.
R
if
lastRow
>=
row
{
row
=
lastRow
var
row
int
for
_
,
r
:=
range
xlsx
.
SheetData
.
Row
{
if
r
.
R
!=
0
&&
r
.
R
>
row
{
row
=
r
.
R
continue
}
row
++
}
sheetData
:=
xlsxSheetData
{
Row
:
make
([]
xlsxRow
,
row
)}
row
=
0
for
_
,
r
:=
range
xlsx
.
SheetData
.
Row
{
sheetData
.
Row
[
r
.
R
-
1
]
=
r
if
r
.
R
!=
0
{
sheetData
.
Row
[
r
.
R
-
1
]
=
r
row
=
r
.
R
continue
}
row
++
r
.
R
=
row
sheetData
.
Row
[
row
-
1
]
=
r
}
for
i
:=
1
;
i
<=
row
;
i
++
{
sheetData
.
Row
[
i
-
1
]
.
R
=
i
...
...
rows.go
浏览文件 @
48f19f60
...
...
@@ -25,18 +25,14 @@ import (
// GetRows return all the rows in a sheet by given worksheet name (case
// sensitive). For example:
//
// rows, err := f.Rows("Sheet1")
// rows, err := f.
Get
Rows("Sheet1")
// if err != nil {
// fmt.Println(err)
// return
// }
// for rows.Next() {
// row, err := rows.Columns()
// if err != nil {
// fmt.Println(err)
// }
// for _, row := range rows {
// for _, colCell := range row {
// fmt.Print(colCell, "\t")
// fmt.Print
ln
(colCell, "\t")
// }
// fmt.Println()
// }
...
...
@@ -57,7 +53,7 @@ func (f *File) GetRows(sheet string) ([][]string, error) {
return
results
,
nil
}
// Rows defines an iterator to a sheet
// Rows defines an iterator to a sheet
.
type
Rows
struct
{
err
error
curRow
,
totalRow
,
stashRow
int
...
...
@@ -73,12 +69,12 @@ func (rows *Rows) Next() bool {
return
rows
.
curRow
<=
rows
.
totalRow
}
// Error will return the error when the
find next row element
// Error will return the error when the
error occurs.
func
(
rows
*
Rows
)
Error
()
error
{
return
rows
.
err
}
// Columns return the current row's column values
// Columns return the current row's column values
.
func
(
rows
*
Rows
)
Columns
()
([]
string
,
error
)
{
var
(
err
error
...
...
@@ -117,9 +113,13 @@ func (rows *Rows) Columns() ([]string, error) {
if
inElement
==
"c"
{
colCell
:=
xlsxC
{}
_
=
rows
.
decoder
.
DecodeElement
(
&
colCell
,
&
startElement
)
cellCol
,
_
,
err
=
CellNameToCoordinates
(
colCell
.
R
)
if
err
!=
nil
{
return
columns
,
err
if
colCell
.
R
!=
""
{
cellCol
,
_
,
err
=
CellNameToCoordinates
(
colCell
.
R
)
if
err
!=
nil
{
return
columns
,
err
}
}
else
{
cellCol
++
}
blank
:=
cellCol
-
len
(
columns
)
for
i
:=
1
;
i
<
blank
;
i
++
{
...
...
@@ -177,10 +177,10 @@ func (f *File) Rows(sheet string) (*Rows, error) {
f
.
saveFileList
(
name
,
replaceRelationshipsNameSpaceBytes
(
output
))
}
var
(
err
error
inElement
string
row
int
rows
Rows
err
error
inElement
string
row
,
curRow
int
rows
Rows
)
decoder
:=
f
.
xmlNewDecoder
(
bytes
.
NewReader
(
f
.
readXML
(
name
)))
for
{
...
...
@@ -194,12 +194,16 @@ func (f *File) Rows(sheet string) (*Rows, error) {
if
inElement
==
"row"
{
for
_
,
attr
:=
range
startElement
.
Attr
{
if
attr
.
Name
.
Local
==
"r"
{
r
ow
,
err
=
strconv
.
Atoi
(
attr
.
Value
)
curR
ow
,
err
=
strconv
.
Atoi
(
attr
.
Value
)
if
err
!=
nil
{
return
&
rows
,
err
}
row
=
curRow
}
}
if
len
(
startElement
.
Attr
)
==
0
{
row
++
}
rows
.
totalRow
=
row
}
default
:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录