import {utils} from "xlsx"; import FileSaver from 'file-saver' import XLSX from "xlsx-style-vite"; /** * 导出excel * @param $table 表格html dom元素 * @param columnLength 列长度 * @param excelName 导出文件名称 * @param bigWidthIndex 更宽列的索引 * @param bigWidthArray 更宽列数组索引 */ export function exportExcel($table, columnLength, excelName, bigWidthIndex,bigWidthArray) { //从el-table表生成工作簿对象 //使用原始的格式,保留表格中的格式如%、小数末尾的0等 let workbook = utils.table_to_book($table, { raw: true }); //列宽,需要导出的表格有多少列这里的i就小于多少 // if(bigWidthArray&&bigWidthArray.length>0){ // for (let i = 1; i < columnLength; i++) { // for (let j = 0; j < bigWidthArray.length; j++) { // console.log('bigWidthArray[j]',bigWidthArray[j]) // if (i === bigWidthArray[j]) { // workbook.Sheets.Sheet1["!cols"].push({wpx: 300}); // } // } // workbook.Sheets.Sheet1["!cols"].push({wpx: 100}); // } // }else { for (let i = 1; i < columnLength; i++) { if (i === bigWidthIndex) { workbook.Sheets.Sheet1["!cols"].push({wpx: 300}); } workbook.Sheets.Sheet1["!cols"].push({wpx: 100}); } // } //设置单元格样式 for (const key in workbook.Sheets.Sheet1) { if ( key !== "!cols" && key !== "!fullref" && key !== "!merges" && key !== "!ref" && key !== "!rows" ) { //这里的s就是具体的样式,如果想设置不一样的样式可以看xlsx-style文档 workbook.Sheets.Sheet1[key].s = { //边框 border: { top: {style: "thin"}, bottom: {style: "thin"}, left: {style: "thin",}, right: {style: "thin",} }, //对齐 alignment: { horizontal: "center", vertical: "center", wrapText: true } }; } } //修改合并单元格样式 let arr = ["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"]; //由于导出时合并单元格只识别左上角的单元格,合并单元格中其他单元格 //并不会存在,所以需要识别合并单元格中除左上角单元格外的单元格并添加 //带样式的单元格到其中,不理解可以看四中的第2点。 try { for (let item of workbook.Sheets.Sheet1["!merges"]) { let style = { border: { top: {style: "thin"}, bottom: {style: "thin"}, left: {style: "thin",}, right: {style: "thin",} }, alignment: { horizontal: "center", vertical: "center", wrapText: true } }; let merge_s = {t: "s", v: "", s: style}; if (item.s.c === item.e.c) { //纵向合并,其中c为字母r为数字 let star = item.s.r; let end = item.e.r; for (let i = star + 1; i <= end; i++) { workbook.Sheets.Sheet1[arr[item.s.c] + (i + 1)] = merge_s; } } else { //横向合并 let star = item.s.c; let end = item.e.c; for (let i = star; i < end; i++) { workbook.Sheets.Sheet1[arr[i + 1] + Number(item.s.r + 1)] = merge_s; } } } } catch (e) { } //将表格数据中的字符串转ArrayBuffer function s2ab(s) { let buf = new ArrayBuffer(s.length); let view = new Uint8Array(buf); for (let i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xff; return buf; } //这里的属性可以参考xlsx-style文档 let wbout = XLSX.write(workbook, { bookType: "xlsx", bookSST: false, type: "binary" }); try { FileSaver.saveAs( new Blob([s2ab(wbout)], {type: "application/octet-stream"}), `${excelName}.xlsx` ); } catch (e) { if (typeof console !== "undefined") console.log(e, wbout); } }