https://blog.csdn.net/u013592575/article/details/136716541
import XLSXfrom 'xlsx-js-style'
import FileSaverfrom 'file-saver'
export default {
// 三個(gè)參數(shù):sheetData末早、mergesHeader 和文件名然磷。
? ? exportSheetExcel(sheetData, mergerArr, fileName ='karlaExport.xlsx') {
const wb = XLSX.utils.book_new()// 創(chuàng)建一個(gè)新工作簿
? ? ? ? for (let i =0; i < sheetData.length; i++) {
const sheet = sheetData[i]
// 檢查數(shù)據(jù)項(xiàng)是否存在
? ? ? ? ? ? if (!sheet.data) {
continue // 如果數(shù)據(jù)項(xiàng)不存在姿搜,則跳過(guò)當(dāng)前循環(huán)
? ? ? ? ? ? }
const ws = XLSX.utils.aoa_to_sheet(sheet.data)// 將數(shù)據(jù)數(shù)組轉(zhuǎn)換為工作表
? ? ? ? ? ? // 設(shè)置合并單元格
? ? ? ? ? ? ws['!merges'] = sheet.merges && sheet.merges.length >0 ? [...sheet.merges, ...(mergerArr || [])] : mergerArr;
? ? ? ? ? ? // 設(shè)置列寬為自適應(yīng)
? ? ? ? ? ? if (sheet.data.length >0) {
ws['!cols'] = sheet.data[0].map((_, index) => ({wch:15 }))
}
// 設(shè)置行高
? ? ? ? ? ? if (sheet.rowHeights && sheet.rowHeights.length >0) {
ws['!rows'] = sheet.rowHeights.map((height) => ({hpt: height, hpx: height }))
}
const borderAll = {
top: {style:'thin' },
? ? ? ? ? ? ? ? bottom: {style:'thin' },
? ? ? ? ? ? ? ? left: {style:'thin' },
? ? ? ? ? ? ? ? right: {style:'thin' }
}
// 設(shè)置單元格樣式
? ? ? ? ? ? for (const keyin ws) {
if (ws.hasOwnProperty(key)) {
const cell = ws[key]
if (typeof cell ==='object') {
cell.s = {
border: borderAll,
? ? ? ? ? ? ? ? ? ? ? ? ? ? alignment: {
horizontal:'center',
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? vertical:'center',
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? wrapText:true
? ? ? ? ? ? ? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? ? ? ? ? ? ? font: {
sz:12,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? color: {
rgb:'000000'
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
},
? ? ? ? ? ? ? ? ? ? ? ? ? ? numFmt:'General',
? ? ? ? ? ? ? ? ? ? ? ? ? ? fill: {
fgColor: {rgb:'FFFFFF' }
}
}
}
}
}
XLSX.utils.book_append_sheet(wb, ws, sheet.name)// 將工作表添加到工作簿并指定名稱(chēng)
? ? ? ? }
const wbout = XLSX.write(wb, {bookType:'xlsx', type:'array' })// 將工作簿轉(zhuǎn)換為數(shù)組
? ? ? ? const file =new Blob([wbout], {type:'application/octet-stream' })// 創(chuàng)建Blob對(duì)象
? ? ? ? FileSaver.saveAs(file, fileName)// 下載文件
? ? },
? ? // 二維數(shù)組中空的數(shù)據(jù)設(shè)置為0
? ? emptyValues(array, defaultValue) {
for (let i =0; i < array.length; i++) {
for (let j =0; j < array[i].length; j++) {
if (array[i][j] ===null || array[i][j] ===undefined || array[i][j] ==='') {
array[i][j] = defaultValue
}
}
}
return array
},
? ? // 生成excel列表數(shù)據(jù)
? ? handleExcelTable(columnHeader, list) {
if (list.length ===0)return []
// 表頭
? ? ? ? const tableColumn =Object.keys([columnHeader][0])
// 表格生成的數(shù)據(jù)
? ? ? ? const sheet = [tableColumn]
list.forEach((item) => {
const row = tableColumn.map((column) => item[column])
sheet.push(row)
})
// 表頭匹配對(duì)應(yīng)的中文
? ? ? ? const firstRow = sheet[0].map((column) => columnHeader[column])
sheet[0] = firstRow
return sheet || []
}
}
const handleExport =async () => {
// 表格合并需要添加一行合并表頭
? const header =this.columns.map((item)=>item.label)
const key =this.columns.map((item)=>item.field)
console.log(key,'key');
? console.log(this.allData,'this.allData');
? let exportList=this.allData.map((item,index)=>([item.row_num,item.material_code,item.material_name,item.spec,item.unit_name,item.prod_model,item.jd,item.supplier_name,item.buy_cycle,item.prod_process,item.kc_num,item.dj_num,item.vmi_num,item.total_stock,item.avail_days,item.status,item.data_type]))
// 生成表格
? const sheet1 = {
name:'LeavePay',
? ? data: [header, ...exportList],? // 使用處理好的mock數(shù)據(jù)
? ? merges: [],
? ? rowHeights: [{hpx:20 }, {hpx:20 }]
}
// 合并:第0列、第1列致份、第三列、第四列绍载、第五列雇锡、第六列、第七列和第八列的相同值進(jìn)行行合并
? const mergedRows =new Map()
for (let i =1; i < sheet1.data.length; i++) {
const cellValue0 = sheet1.data[i][0]
const cellValue1 = sheet1.data[i][1]
const prevValue0 = sheet1.data[i -1][0]
const prevValue1 = sheet1.data[i -1][1]
if (
cellValue0 === prevValue0 &&
cellValue1 === prevValue1
) {
if (mergedRows.has(cellValue0)) {
// 更新合并的結(jié)束行索引
? ? ? ? mergedRows.get(cellValue0).end = i
}else {
// 添加新的合并信息
? ? ? ? mergedRows.set(cellValue0, {start: i -1, end: i })
}
}
}
// 添加行合并信息到mergesHeader
? for (const [value, { start, end }]of mergedRows.entries()) {
sheet1.merges.push({s: { r: start, c:0 }, e: { r: end, c:0 } })
sheet1.merges.push({s: { r: start, c:1 }, e: { r: end, c:1 } })
sheet1.merges.push({s: { r: start, c:2 }, e: { r: end, c:2 } })
sheet1.merges.push({s: { r: start, c:3 }, e: { r: end, c:3 } })
sheet1.merges.push({s: { r: start, c:4 }, e: { r: end, c:4 } })
sheet1.merges.push({s: { r: start, c:5 }, e: { r: end, c:5 } })
sheet1.merges.push({s: { r: start, c:6 }, e: { r: end, c:6 } })
sheet1.merges.push({s: { r: start, c:7 }, e: { r: end, c:7 } })
sheet1.merges.push({s: { r: start, c:8 }, e: { r: end, c:8 } })
sheet1.merges.push({s: { r: start, c:9 }, e: { r: end, c:9 } })
sheet1.merges.push({s: { r: start, c:10 }, e: { r: end, c:10 } })
sheet1.merges.push({s: { r: start, c:11 }, e: { r: end, c:11 } })
sheet1.merges.push({s: { r: start, c:12 }, e: { r: end, c:12 } })
sheet1.merges.push({s: { r: start, c:13 }, e: { r: end, c:13 } })
sheet1.merges.push({s: { r: start, c:14 }, e: { r: end, c:14 } })
sheet1.merges.push({s: { r: start, c:15 }, e: { r: end, c:15 } })
sheet1.merges.push({s: { r: start, c:16 }, e: { r: end, c:16 } })
}
// 合并表頭
? const mergesHeader = [
]
const sheetData = [sheet1]
// 導(dǎo)出
? OutExcelSheet.exportSheetExcel(sheetData, mergesHeader, `karla導(dǎo)出.xlsx`)
}
handleExport()