Commit 797e046a authored by 徐俊's avatar 徐俊

徐俊

parent 726212d9
...@@ -400,35 +400,58 @@ export default { ...@@ -400,35 +400,58 @@ export default {
}, },
exportEvaluationExcel () { exportEvaluationExcel () {
this.loading = true this.loading = true
const rowMarks = ['A', 'B', 'C', 'D', 'E', 'P', 'Q']
const rowMarks = ['A', 'B', 'C', 'D', 'K']
this.$api.statistical.getEvaluationExportExcel({ reportYear: this.reportYear, startRow: 3, rowMarks: rowMarks }).then(({ data = {} }) => { this.$api.statistical.getEvaluationExportExcel({
reportYear: this.reportYear,
startRow: 3,
rowMarks: rowMarks
}).then(({ data = {} }) => {
if (data) { if (data) {
this.eTableData = data.evaluationList this.eTableData = data.evaluationList
this.eMergeList = data.mergeList this.eMergeList = data.mergeList
import('@/views/utils/Export2Excel').then(excel => { import('@/views/utils/Export2Excel').then(excel => {
const multiHeader = [[this.reportYear + '项目评审结果列表', '', '']] // 标题 try {
const header = ['项目编号', '项目名称', '二级学科', '所属市州', '证件号', '专家姓名', '专家单位', '手机号', '评分', '评审内容', '平均分'] // 表头 const multiHeader = [[this.reportYear + '项目评审结果列表', '', '']]
const filterVal = ['projNo', 'projName', 'knowledgeName', 'unitName', 'certId', 'personName', 'expertUnitName', 'mobile', 'totalScore', 'remark', 'averageScore'] // 数据属性 const header = ['项目编号', '项目名称', '一级学科', '二级学科', '所属市州', '证件号', '专家姓名', '专家单位', '手机号', '专家类型', '专家评分', '评审类别', '是否支持立项', '评审内容', '评审状态', '总分', '最终得分']
const list = this.eTableData //请求来的数据 const filterVal = ['projNo', 'projName', 'parentName', 'knowledgeName', 'unitName', 'certId', 'personName', 'expertUnitName', 'mobile', 'expertTypeName', 'evaluationScore', 'evaluationTypeName', 'supportStateName', 'remark', 'auditStateName', 'totalScore', 'calculateScore']
const merges = ['A1:K1'].concat(this.eMergeList) //需要合并的单元格 const list = this.eTableData
const data = list.map(item => filterVal.map(j => item[j])) // 转换二维数组 const merges = ['A1:Q1'].concat(this.eMergeList)
const filename = this.reportYear + '项目评审结果列表' const data = list.map(item => filterVal.map(j => item[j]))
excel.exportJsonToExcel({ const filename = this.reportYear + '项目评审结果列表'
multiHeader, // 标题--非必要
header, // 表头 excel.exportJsonToExcel({
data, // 具体数据--二维数组 multiHeader,
merges, // 合并--非必要 header,
filename, // 下载文件名 data,
autoWidth: true, // 不自动调整列宽 merges,
}) filename,
autoWidth: true,
})
this.$message.success('导出成功')
} catch (err) {
console.error('Excel导出错误:', err)
this.$message.error(`导出失败: ${err.message || '未知错误'}`)
}
this.loading = false this.loading = false
this.eTableData = [] this.eTableData = []
this.eMergeList = [] 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 () { exportProjGroupScoreExcel () {
this.loading = true this.loading = true
......
...@@ -132,7 +132,7 @@ function sheet_from_array_of_arrays(data, opts) { ...@@ -132,7 +132,7 @@ function sheet_from_array_of_arrays(data, opts) {
var cell = { var cell = {
v: data[R][C] v: data[R][C]
} }
// 如果单元格所在的值为空,让其值为“” // 如果单元格所在的值为空,让其值为""
if (cell.v == null) { if (cell.v == null) {
cell.v = '' cell.v = ''
} }
...@@ -289,218 +289,181 @@ export function exportJsonToExcel({ ...@@ -289,218 +289,181 @@ export function exportJsonToExcel({
autoWidth = true, autoWidth = true,
bookType = 'xlsx', bookType = 'xlsx',
XlsWidth XlsWidth
} = {}) { } = {}) {
filename = filename || '导出excel文件' try {
data = [...data] filename = filename || '导出excel文件'
data.unshift(header) data = [...data]
for (let i = multiHeader.length - 1; i > -1; i--) { data.unshift(header)
data.unshift(multiHeader[i]) for (let i = multiHeader.length - 1; i > -1; i--) {
} data.unshift(multiHeader[i])
var wsName = 'SheetJS' }
var wb = new Workbook()
var ws = sheetFromArrayOfArrays(data)
if (merges.length > 0) { var wsName = 'SheetJS'
// ws[!merges]:存放一些单元格合并信息,是一个数组,每个数组由包含s和e构成的对象组成,s表示开始,e表示结束,r表示行,c表示列 var wb = new Workbook()
if (!ws['!merges']) ws['!merges'] = [] var ws = sheetFromArrayOfArrays(data)
merges.forEach(item => {
ws['!merges'].push(XLSX.utils.decode_range(item))
})
}
if (autoWidth) { if (merges.length > 0) {
/* 设置worksheet每列的最大宽度 */ if (!ws['!merges']) ws['!merges'] = []
const colWidth = data.map(row => row.map(val => { merges.forEach(item => {
/* 先判断是否为null/undefined */ ws['!merges'].push(XLSX.utils.decode_range(item))
if (val == null) { })
return { 'wch': 10 } }
} else if (val.toString().charCodeAt(0) > 255) { /* 再判断是否为中文 */
return { if (autoWidth) {
'wch': val.toString().length * 2 /* 设置worksheet每列的最大宽度 */
} const colWidth = data.map(row => row.map(val => {
} else { /* 先判断是否为null/undefined */
return { if (val == null) {
'wch': val.toString().length 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] let result = colWidth[0]
for (let i = 1; i < colWidth.length; i++) { for (let i = 1; i < colWidth.length; i++) {
for (let j = 0; j < colWidth[i].length; j++) { for (let j = 0; j < colWidth[i].length; j++) {
if (result[j] && result[j]['wch'] < colWidth[i][j]['wch']) { if (result[j] && result[j]['wch'] < colWidth[i][j]['wch']) {
result[j]['wch'] = colWidth[i][j]['wch'] result[j]['wch'] = colWidth[i][j]['wch']
}
} }
} }
}
// ws['!cols']设置单元格宽度, [{'wch': 10},{'wch': 10}] ===> 第一列和第二列设置了宽度 // ws['!cols']设置单元格宽度, [{'wch': 10},{'wch': 10}] ===> 第一列和第二列设置了宽度
ws['!cols'] = result 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'] = XlsWidth;
const borderAll = {
top: {
style: 'thin'
},
bottom: {
style: 'thin'
},
left: {
style: 'thin'
},
right: {
style: 'thin'
} }
}
// 给所有单元格加上边框,内容居中,字体,字号,标题表头特殊格式部分后面替换 /* add worksheet to workbook */
for (var i in dataInfo) { wb.SheetNames.push(wsName)
if ( wb.Sheets[wsName] = ws
i == '!ref' || var dataInfo = wb.Sheets[wb.SheetNames[0]]
i == '!merges' ||
i == '!cols' || // 设置单元格框线
i == '!rows' || const borderAll = {
i == 'A1' top: {
) {} else { style: 'thin'
dataInfo[i + ''].s = { },
border: borderAll, bottom: {
alignment: { style: 'thin'
horizontal: 'center', },
vertical: 'center' left: {
}, style: 'thin'
font: { },
name: '微软雅黑', right: {
sz: 12 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' ] // 给所有单元格加上边框,内容居中,字体,字号,标题表头特殊格式部分后面替换
for (var i in dataInfo) {
// 给标题、表格描述信息、表头等部分加上特殊格式 if (
arrabc.some(function(v) { i == '!ref' ||
for (let j = 1; j < (data.length + 1); j++) { i == '!merges' ||
const _v = v + j i == '!cols' ||
if (dataInfo[_v]) { i == '!rows' ||
dataInfo[_v].s = {} i == 'A1'
// 标题部分A1-Z1 ) {} else {
dataInfo['A' + j].s = { dataInfo[i + ''].s = {
border: borderAll, border: borderAll,
font: {
name: '微软雅黑',
sz: 12,
color: {
rgb: '000000'
},
bold: true
},
alignment: { alignment: {
horizontal: 'center', horizontal: 'center',
vertical: '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: { font: {
name: '微软雅黑', name: '微软雅黑',
sz: 12, sz: 12
color: {
rgb: '000000'
}
},
alignment: {
horizontal: 'right',
vertical: 'center'
} }
} }
// 头部 }
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, border: borderAll,
font: { font: {
name: '微软雅黑', name: '微软雅黑',
sz: 18, sz: 12,
color: { color: { rgb: '000000' }
rgb: '000000'
},
bold: true
}, },
alignment: { alignment: {
horizontal: 'center', horizontal: 'center',
vertical: '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) { if (v !== 'A') { // 非第一列
for (let index = 0; index < percent.length; index++) { dataInfo[_v].s = {
if (j == percent[index]) { ...dataInfo[_v].s,
dataInfo[v + percent[index]].s = { numFmt: '0.00'
numFmt: '0.00%', }
border: borderAll, }
font: {
name: '微软雅黑', // 设置百分比列的格式
sz: 12, if (percent.includes(j)) {
color: { dataInfo[_v].s = {
rgb: '000000' ...dataInfo[_v].s,
} numFmt: '0.00%',
}, fill: {
alignment: { fgColor: { rgb: 'FFF8DC' }
horizontal: 'right',
vertical: 'center'
},
fill: {
fgColor: {
rgb: 'FFF8DC'
}
}
} }
} }
} }
} }
} }
} })
})
var wbout = XLSX.write(wb, { var wbout = XLSX.write(wb, {
bookType: bookType, bookType: bookType,
bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性 bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
type: 'binary' type: 'binary'
}) })
saveAs( saveAs(
new Blob([s2ab(wbout)], { type: 'application/octet-stream' }), new Blob([s2ab(wbout)], { type: 'application/octet-stream' }),
`${filename}.${bookType}` `${filename}.${bookType}`
) )
return true
} catch (error) {
console.error('Excel导出错误:', error)
throw error // 抛出错误以便调用者处理
}
} }
// 主要修改内容在这里 // 主要修改内容在这里
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment