Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
Y
yn-science-front
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
徐俊
yn-science-front
Commits
797e046a
Commit
797e046a
authored
Mar 14, 2025
by
徐俊
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
徐俊
parent
726212d9
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
182 additions
and
196 deletions
+182
-196
projKeyAssign.vue
src/views/peAssign/projKeyAssign.vue
+43
-20
Export2Excel.js
src/views/utils/Export2Excel.js
+139
-176
No files found.
src/views/peAssign/projKeyAssign.vue
View file @
797e046a
...
...
@@ -400,35 +400,58 @@ export default {
},
exportEvaluationExcel
()
{
this
.
loading
=
true
const
rowMarks
=
[
'A'
,
'B'
,
'C'
,
'D'
,
'K'
]
this
.
$api
.
statistical
.
getEvaluationExportExcel
({
reportYear
:
this
.
reportYear
,
startRow
:
3
,
rowMarks
:
rowMarks
}).
then
(({
data
=
{}
})
=>
{
const
rowMarks
=
[
'A'
,
'B'
,
'C'
,
'D'
,
'E'
,
'P'
,
'Q'
]
this
.
$api
.
statistical
.
getEvaluationExportExcel
({
reportYear
:
this
.
reportYear
,
startRow
:
3
,
rowMarks
:
rowMarks
}).
then
(({
data
=
{}
})
=>
{
if
(
data
)
{
this
.
eTableData
=
data
.
evaluationList
this
.
eMergeList
=
data
.
mergeList
import
(
'@/views/utils/Export2Excel'
).
then
(
excel
=>
{
const
multiHeader
=
[[
this
.
reportYear
+
'项目评审结果列表'
,
''
,
''
]]
// 标题
const
header
=
[
'项目编号'
,
'项目名称'
,
'二级学科'
,
'所属市州'
,
'证件号'
,
'专家姓名'
,
'专家单位'
,
'手机号'
,
'评分'
,
'评审内容'
,
'平均分'
]
// 表头
const
filterVal
=
[
'projNo'
,
'projName'
,
'knowledgeName'
,
'unitName'
,
'certId'
,
'personName'
,
'expertUnitName'
,
'mobile'
,
'totalScore'
,
'remark'
,
'averageScore'
]
// 数据属性
const
list
=
this
.
eTableData
//请求来的数据
const
merges
=
[
'A1:K1'
].
concat
(
this
.
eMergeList
)
//需要合并的单元格
const
data
=
list
.
map
(
item
=>
filterVal
.
map
(
j
=>
item
[
j
]))
// 转换二维数组
const
filename
=
this
.
reportYear
+
'项目评审结果列表'
excel
.
exportJsonToExcel
({
multiHeader
,
// 标题--非必要
header
,
// 表头
data
,
// 具体数据--二维数组
merges
,
// 合并--非必要
filename
,
// 下载文件名
autoWidth
:
true
,
// 不自动调整列宽
})
try
{
const
multiHeader
=
[[
this
.
reportYear
+
'项目评审结果列表'
,
''
,
''
]]
const
header
=
[
'项目编号'
,
'项目名称'
,
'一级学科'
,
'二级学科'
,
'所属市州'
,
'证件号'
,
'专家姓名'
,
'专家单位'
,
'手机号'
,
'专家类型'
,
'专家评分'
,
'评审类别'
,
'是否支持立项'
,
'评审内容'
,
'评审状态'
,
'总分'
,
'最终得分'
]
const
filterVal
=
[
'projNo'
,
'projName'
,
'parentName'
,
'knowledgeName'
,
'unitName'
,
'certId'
,
'personName'
,
'expertUnitName'
,
'mobile'
,
'expertTypeName'
,
'evaluationScore'
,
'evaluationTypeName'
,
'supportStateName'
,
'remark'
,
'auditStateName'
,
'totalScore'
,
'calculateScore'
]
const
list
=
this
.
eTableData
const
merges
=
[
'A1:Q1'
].
concat
(
this
.
eMergeList
)
const
data
=
list
.
map
(
item
=>
filterVal
.
map
(
j
=>
item
[
j
]))
const
filename
=
this
.
reportYear
+
'项目评审结果列表'
excel
.
exportJsonToExcel
({
multiHeader
,
header
,
data
,
merges
,
filename
,
autoWidth
:
true
,
})
this
.
$message
.
success
(
'导出成功'
)
}
catch
(
err
)
{
console
.
error
(
'Excel导出错误:'
,
err
)
this
.
$message
.
error
(
`导出失败:
${
err
.
message
||
'未知错误'
}
`
)
}
this
.
loading
=
false
this
.
eTableData
=
[]
this
.
eMergeList
=
[]
}).
catch
(()
=>
{
this
.
loading
=
false
})
}).
catch
(
err
=>
{
console
.
error
(
'加载Export2Excel模块错误:'
,
err
)
this
.
$message
.
error
(
`加载导出模块失败:
${
err
.
message
||
'未知错误'
}
`
)
this
.
loading
=
false
})
}
}).
catch
(()
=>
{
this
.
loading
=
false
})
}).
catch
(
err
=>
{
console
.
error
(
'获取评审数据错误:'
,
err
)
this
.
$message
.
error
(
`获取评审数据失败:
${
err
.
message
||
'未知错误'
}
`
)
this
.
loading
=
false
this
.
eTableData
=
[]
this
.
eMergeList
=
[]
})
},
exportProjGroupScoreExcel
()
{
this
.
loading
=
true
...
...
src/views/utils/Export2Excel.js
View file @
797e046a
...
...
@@ -132,7 +132,7 @@ function sheet_from_array_of_arrays(data, opts) {
var
cell
=
{
v
:
data
[
R
][
C
]
}
// 如果单元格所在的值为空,让其值为
“”
// 如果单元格所在的值为空,让其值为
""
if
(
cell
.
v
==
null
)
{
cell
.
v
=
''
}
...
...
@@ -289,218 +289,181 @@ export function exportJsonToExcel({
autoWidth
=
true
,
bookType
=
'xlsx'
,
XlsWidth
}
=
{})
{
filename
=
filename
||
'导出excel文件'
data
=
[...
data
]
data
.
unshift
(
header
)
for
(
let
i
=
multiHeader
.
length
-
1
;
i
>
-
1
;
i
--
)
{
data
.
unshift
(
multiHeader
[
i
])
}
var
wsName
=
'SheetJS'
var
wb
=
new
Workbook
()
var
ws
=
sheetFromArrayOfArrays
(
data
)
try
{
filename
=
filename
||
'导出excel文件'
data
=
[...
data
]
data
.
unshift
(
header
)
for
(
let
i
=
multiHeader
.
length
-
1
;
i
>
-
1
;
i
--
)
{
data
.
unshift
(
multiHeader
[
i
])
}
if
(
merges
.
length
>
0
)
{
// ws[!merges]:存放一些单元格合并信息,是一个数组,每个数组由包含s和e构成的对象组成,s表示开始,e表示结束,r表示行,c表示列
if
(
!
ws
[
'!merges'
])
ws
[
'!merges'
]
=
[]
merges
.
forEach
(
item
=>
{
ws
[
'!merges'
].
push
(
XLSX
.
utils
.
decode_range
(
item
))
})
}
var
wsName
=
'SheetJS'
var
wb
=
new
Workbook
()
var
ws
=
sheetFromArrayOfArrays
(
data
)
if
(
autoWidth
)
{
/* 设置worksheet每列的最大宽度 */
const
colWidth
=
data
.
map
(
row
=>
row
.
map
(
val
=>
{
/* 先判断是否为null/undefined */
if
(
val
==
null
)
{
return
{
'wch'
:
10
}
}
else
if
(
val
.
toString
().
charCodeAt
(
0
)
>
255
)
{
/* 再判断是否为中文 */
return
{
'wch'
:
val
.
toString
().
length
*
2
}
}
else
{
return
{
'wch'
:
val
.
toString
().
length
if
(
merges
.
length
>
0
)
{
if
(
!
ws
[
'!merges'
])
ws
[
'!merges'
]
=
[]
merges
.
forEach
(
item
=>
{
ws
[
'!merges'
].
push
(
XLSX
.
utils
.
decode_range
(
item
))
})
}
if
(
autoWidth
)
{
/* 设置worksheet每列的最大宽度 */
const
colWidth
=
data
.
map
(
row
=>
row
.
map
(
val
=>
{
/* 先判断是否为null/undefined */
if
(
val
==
null
)
{
return
{
'wch'
:
10
}
}
else
if
(
val
.
toString
().
charCodeAt
(
0
)
>
255
)
{
/* 再判断是否为中文 */
return
{
'wch'
:
val
.
toString
().
length
*
2
}
}
else
{
return
{
'wch'
:
val
.
toString
().
length
}
}
}
}))
/* 以第一行为初始值 */
let
result
=
colWidth
[
0
]
for
(
let
i
=
1
;
i
<
colWidth
.
length
;
i
++
)
{
for
(
let
j
=
0
;
j
<
colWidth
[
i
].
length
;
j
++
)
{
if
(
result
[
j
]
&&
result
[
j
][
'wch'
]
<
colWidth
[
i
][
j
][
'wch'
])
{
result
[
j
][
'wch'
]
=
colWidth
[
i
][
j
][
'wch'
]
}))
/* 以第一行为初始值 */
let
result
=
colWidth
[
0
]
for
(
let
i
=
1
;
i
<
colWidth
.
length
;
i
++
)
{
for
(
let
j
=
0
;
j
<
colWidth
[
i
].
length
;
j
++
)
{
if
(
result
[
j
]
&&
result
[
j
][
'wch'
]
<
colWidth
[
i
][
j
][
'wch'
])
{
result
[
j
][
'wch'
]
=
colWidth
[
i
][
j
][
'wch'
]
}
}
}
}
// ws['!cols']设置单元格宽度, [{'wch': 10},{'wch': 10}] ===> 第一列和第二列设置了宽度
ws
[
'!cols'
]
=
result
ws
[
'!cols'
]
=
XlsWidth
;
}
/* add worksheet to workbook */
wb
.
SheetNames
.
push
(
wsName
)
wb
.
Sheets
[
wsName
]
=
ws
var
dataInfo
=
wb
.
Sheets
[
wb
.
SheetNames
[
0
]]
// ws['!cols']设置单元格宽度, [{'wch': 10},{'wch': 10}] ===> 第一列和第二列设置了宽度
ws
[
'!cols'
]
=
result
// 设置单元格框线
const
borderAll
=
{
top
:
{
style
:
'thin'
},
bottom
:
{
style
:
'thin'
},
left
:
{
style
:
'thin'
},
right
:
{
style
:
'thin'
ws
[
'!cols'
]
=
XlsWidth
;
}
}
// 给所有单元格加上边框,内容居中,字体,字号,标题表头特殊格式部分后面替换
for
(
var
i
in
dataInfo
)
{
if
(
i
==
'!ref'
||
i
==
'!merges'
||
i
==
'!cols'
||
i
==
'!rows'
||
i
==
'A1'
)
{}
else
{
dataInfo
[
i
+
''
].
s
=
{
border
:
borderAll
,
alignment
:
{
horizontal
:
'center'
,
vertical
:
'center'
},
font
:
{
name
:
'微软雅黑'
,
sz
:
12
}
/* add worksheet to workbook */
wb
.
SheetNames
.
push
(
wsName
)
wb
.
Sheets
[
wsName
]
=
ws
var
dataInfo
=
wb
.
Sheets
[
wb
.
SheetNames
[
0
]]
// 设置单元格框线
const
borderAll
=
{
top
:
{
style
:
'thin'
},
bottom
:
{
style
:
'thin'
},
left
:
{
style
:
'thin'
},
right
:
{
style
:
'thin'
}
}
}
const
arrabc
=
[
'A'
,
'B'
,
'C'
,
'D'
,
'E'
,
'F'
,
'G'
,
'H'
,
'I'
,
'J'
,
'K'
,
'L'
,
'M'
,
'N'
,
'O'
,
'P'
,
'Q'
,
'R'
,
'S'
,
'T'
,
'U'
,
'V'
,
'W'
,
'X'
,
'Y'
,
'Z'
]
// 给标题、表格描述信息、表头等部分加上特殊格式
arrabc
.
some
(
function
(
v
)
{
for
(
let
j
=
1
;
j
<
(
data
.
length
+
1
);
j
++
)
{
const
_v
=
v
+
j
if
(
dataInfo
[
_v
])
{
dataInfo
[
_v
].
s
=
{}
// 标题部分A1-Z1
dataInfo
[
'A'
+
j
].
s
=
{
// 给所有单元格加上边框,内容居中,字体,字号,标题表头特殊格式部分后面替换
for
(
var
i
in
dataInfo
)
{
if
(
i
==
'!ref'
||
i
==
'!merges'
||
i
==
'!cols'
||
i
==
'!rows'
||
i
==
'A1'
)
{}
else
{
dataInfo
[
i
+
''
].
s
=
{
border
:
borderAll
,
font
:
{
name
:
'微软雅黑'
,
sz
:
12
,
color
:
{
rgb
:
'000000'
},
bold
:
true
},
alignment
:
{
horizontal
:
'center'
,
vertical
:
'center'
}
}
dataInfo
[
'B'
+
j
].
s
=
{
border
:
borderAll
,
numFmt
:
'0'
,
font
:
{
name
:
'微软雅黑'
,
sz
:
12
,
color
:
{
rgb
:
'000000'
}
},
alignment
:
{
horizontal
:
'right'
,
vertical
:
'center'
}
}
dataInfo
[
v
+
j
].
s
=
{
border
:
borderAll
,
numFmt
:
'0.00'
,
font
:
{
name
:
'微软雅黑'
,
sz
:
12
,
color
:
{
rgb
:
'000000'
}
},
alignment
:
{
horizontal
:
'right'
,
vertical
:
'center'
sz
:
12
}
}
// 头部
if
(
j
==
1
)
{
dataInfo
[
v
+
j
].
s
=
{
}
}
const
arrabc
=
[
'A'
,
'B'
,
'C'
,
'D'
,
'E'
,
'F'
,
'G'
,
'H'
,
'I'
,
'J'
,
'K'
,
'L'
,
'M'
,
'N'
,
'O'
,
'P'
,
'Q'
,
'R'
,
'S'
,
'T'
,
'U'
,
'V'
,
'W'
,
'X'
,
'Y'
,
'Z'
]
// 给标题、表格描述信息、表头等部分加上特殊格式
arrabc
.
some
(
function
(
v
)
{
for
(
let
j
=
1
;
j
<
(
data
.
length
+
1
);
j
++
)
{
const
_v
=
v
+
j
if
(
dataInfo
[
_v
])
{
// 确保单元格存在
// 设置基础样式
dataInfo
[
_v
].
s
=
{
border
:
borderAll
,
font
:
{
name
:
'微软雅黑'
,
sz
:
18
,
color
:
{
rgb
:
'000000'
},
bold
:
true
sz
:
12
,
color
:
{
rgb
:
'000000'
}
},
alignment
:
{
horizontal
:
'center'
,
vertical
:
'center'
},
fill
:
{
fgColor
:
{
rgb
:
'f0f0f0'
}
}
// 设置第一行(标题)的特殊样式
if
(
j
===
1
)
{
dataInfo
[
_v
].
s
=
{
border
:
borderAll
,
font
:
{
name
:
'微软雅黑'
,
sz
:
18
,
color
:
{
rgb
:
'000000'
},
bold
:
true
},
alignment
:
{
horizontal
:
'center'
,
vertical
:
'center'
},
fill
:
{
fgColor
:
{
rgb
:
'f0f0f0'
}
}
}
}
}
// 百分比 %
if
(
percent
.
length
!=
0
)
{
for
(
let
index
=
0
;
index
<
percent
.
length
;
index
++
)
{
if
(
j
==
percent
[
index
])
{
dataInfo
[
v
+
percent
[
index
]].
s
=
{
numFmt
:
'0.00%'
,
border
:
borderAll
,
font
:
{
name
:
'微软雅黑'
,
sz
:
12
,
color
:
{
rgb
:
'000000'
}
},
alignment
:
{
horizontal
:
'right'
,
vertical
:
'center'
},
fill
:
{
fgColor
:
{
rgb
:
'FFF8DC'
}
}
// 设置数值列的格式(如果需要)
if
(
v
!==
'A'
)
{
// 非第一列
dataInfo
[
_v
].
s
=
{
...
dataInfo
[
_v
].
s
,
numFmt
:
'0.00'
}
}
// 设置百分比列的格式
if
(
percent
.
includes
(
j
))
{
dataInfo
[
_v
].
s
=
{
...
dataInfo
[
_v
].
s
,
numFmt
:
'0.00%'
,
fill
:
{
fgColor
:
{
rgb
:
'FFF8DC'
}
}
}
}
}
}
}
})
})
var
wbout
=
XLSX
.
write
(
wb
,
{
bookType
:
bookType
,
bookSST
:
false
,
// 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
type
:
'binary'
})
saveAs
(
new
Blob
([
s2ab
(
wbout
)],
{
type
:
'application/octet-stream'
}),
`
${
filename
}
.
${
bookType
}
`
)
var
wbout
=
XLSX
.
write
(
wb
,
{
bookType
:
bookType
,
bookSST
:
false
,
// 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
type
:
'binary'
})
saveAs
(
new
Blob
([
s2ab
(
wbout
)],
{
type
:
'application/octet-stream'
}),
`
${
filename
}
.
${
bookType
}
`
)
return
true
}
catch
(
error
)
{
console
.
error
(
'Excel导出错误:'
,
error
)
throw
error
// 抛出错误以便调用者处理
}
}
// 主要修改内容在这里
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment