Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
此号慢热型
excelize
提交
92c8626f
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,发现更多精彩内容 >>
已验证
提交
92c8626f
编写于
11月 18, 2020
作者:
xurime
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fixed #732, support single line with repeated row element in the sheet data
上级
2be4bfd4
变更
4
显示空白变更内容
内联
并排
Showing
4 changed file
with
46 addition
and
24 deletion
+46
-24
cell_test.go
cell_test.go
+20
-1
col.go
col.go
+3
-4
excelize.go
excelize.go
+7
-1
rows.go
rows.go
+16
-18
未找到文件。
cell_test.go
浏览文件 @
92c8626f
...
...
@@ -136,8 +136,9 @@ func TestSetCellBool(t *testing.T) {
func
TestGetCellValue
(
t
*
testing
.
T
)
{
// Test get cell value without r attribute of the row.
f
:=
NewFile
()
sheetData
:=
`<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><sheetData>%s</sheetData></worksheet>`
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
.
XLSX
[
"xl/worksheets/sheet1.xml"
]
=
[]
byte
(
fmt
.
Sprintf
(
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>`
)
)
f
.
checked
=
nil
cells
:=
[]
string
{
"A3"
,
"A4"
,
"B4"
,
"A7"
,
"B7"
}
rows
,
err
:=
f
.
GetRows
(
"Sheet1"
)
...
...
@@ -151,6 +152,24 @@ func TestGetCellValue(t *testing.T) {
cols
,
err
:=
f
.
GetCols
(
"Sheet1"
)
assert
.
Equal
(
t
,
[][]
string
{{
""
,
""
,
"A3"
,
"A4"
,
""
,
""
,
"A7"
,
"A8"
},
{
""
,
""
,
""
,
"B4"
,
""
,
""
,
"B7"
,
"B8"
}},
cols
)
assert
.
NoError
(
t
,
err
)
delete
(
f
.
Sheet
,
"xl/worksheets/sheet1.xml"
)
f
.
XLSX
[
"xl/worksheets/sheet1.xml"
]
=
[]
byte
(
fmt
.
Sprintf
(
sheetData
,
`<row r="2"><c r="A2" t="str"><v>A2</v></c></row><row r="2"><c r="B2" t="str"><v>B2</v></c></row>`
))
f
.
checked
=
nil
cell
,
err
:=
f
.
GetCellValue
(
"Sheet1"
,
"A2"
)
assert
.
Equal
(
t
,
"A2"
,
cell
)
assert
.
NoError
(
t
,
err
)
delete
(
f
.
Sheet
,
"xl/worksheets/sheet1.xml"
)
f
.
XLSX
[
"xl/worksheets/sheet1.xml"
]
=
[]
byte
(
fmt
.
Sprintf
(
sheetData
,
`<row r="2"><c r="A2" t="str"><v>A2</v></c></row><row r="2"><c r="B2" t="str"><v>B2</v></c></row>`
))
f
.
checked
=
nil
rows
,
err
=
f
.
GetRows
(
"Sheet1"
)
assert
.
Equal
(
t
,
[][]
string
{
nil
,
{
"A2"
,
"B2"
}},
rows
)
assert
.
NoError
(
t
,
err
)
delete
(
f
.
Sheet
,
"xl/worksheets/sheet1.xml"
)
f
.
XLSX
[
"xl/worksheets/sheet1.xml"
]
=
[]
byte
(
fmt
.
Sprintf
(
sheetData
,
`<row r="1"><c r="A1" t="str"><v>A1</v></c></row><row r="1"><c r="B1" t="str"><v>B1</v></c></row>`
))
f
.
checked
=
nil
rows
,
err
=
f
.
GetRows
(
"Sheet1"
)
assert
.
Equal
(
t
,
[][]
string
{{
"A1"
,
"B1"
}},
rows
)
assert
.
NoError
(
t
,
err
)
}
func
TestGetCellFormula
(
t
*
testing
.
T
)
{
...
...
col.go
浏览文件 @
92c8626f
...
...
@@ -103,10 +103,9 @@ func (cols *Cols) Rows() ([]string, error) {
if
inElement
==
"row"
{
cellCol
=
0
cellRow
++
for
_
,
attr
:=
range
startElement
.
Attr
{
if
attr
.
Name
.
Local
==
"r"
{
cellRow
,
_
=
strconv
.
Atoi
(
attr
.
Value
)
}
attrR
,
_
:=
attrValToInt
(
"r"
,
startElement
.
Attr
)
if
attrR
!=
0
{
cellRow
=
attrR
}
}
if
inElement
==
"c"
{
...
...
excelize.go
浏览文件 @
92c8626f
...
...
@@ -219,11 +219,17 @@ func checkSheet(ws *xlsxWorksheet) {
row
=
r
.
R
continue
}
if
r
.
R
!=
row
{
row
++
}
}
sheetData
:=
xlsxSheetData
{
Row
:
make
([]
xlsxRow
,
row
)}
row
=
0
for
_
,
r
:=
range
ws
.
SheetData
.
Row
{
if
r
.
R
==
row
{
sheetData
.
Row
[
r
.
R
-
1
]
.
C
=
append
(
sheetData
.
Row
[
r
.
R
-
1
]
.
C
,
r
.
C
...
)
continue
}
if
r
.
R
!=
0
{
sheetData
.
Row
[
r
.
R
-
1
]
=
r
row
=
r
.
R
...
...
rows.go
浏览文件 @
92c8626f
...
...
@@ -81,7 +81,7 @@ func (rows *Rows) Columns() ([]string, error) {
var
(
err
error
inElement
string
row
,
cellCol
int
attrR
,
cellCol
,
row
int
columns
[]
string
)
...
...
@@ -99,26 +99,21 @@ func (rows *Rows) Columns() ([]string, error) {
case
xml
.
StartElement
:
inElement
=
startElement
.
Name
.
Local
if
inElement
==
"row"
{
for
_
,
attr
:=
range
startElement
.
Attr
{
if
attr
.
Name
.
Local
==
"r"
{
row
,
err
=
strconv
.
Atoi
(
attr
.
Value
)
if
err
!=
nil
{
return
columns
,
err
row
++
if
attrR
,
err
=
attrValToInt
(
"r"
,
startElement
.
Attr
);
attrR
!=
0
{
row
=
attrR
}
if
row
>
rows
.
curRow
{
rows
.
stashRow
=
row
-
1
return
columns
,
err
}
}
}
}
if
inElement
==
"c"
{
cellCol
++
colCell
:=
xlsxC
{}
_
=
rows
.
decoder
.
DecodeElement
(
&
colCell
,
&
startElement
)
if
colCell
.
R
!=
""
{
cellCol
,
_
,
err
=
CellNameToCoordinates
(
colCell
.
R
)
if
err
!=
nil
{
if
cellCol
,
_
,
err
=
CellNameToCoordinates
(
colCell
.
R
);
err
!=
nil
{
return
columns
,
err
}
}
...
...
@@ -128,7 +123,10 @@ func (rows *Rows) Columns() ([]string, error) {
}
case
xml
.
EndElement
:
inElement
=
startElement
.
Name
.
Local
if
inElement
==
"row"
{
if
row
==
0
{
row
=
rows
.
curRow
}
if
inElement
==
"row"
&&
row
+
1
<
rows
.
curRow
{
return
columns
,
err
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录