184 lines
4.4 KiB
JavaScript
184 lines
4.4 KiB
JavaScript
import * as XLSX from 'xlsx'
|
||
import FileSaver from 'file-saver';
|
||
import XLSXStyle from 'xlsx-style-medalsoft';
|
||
|
||
let OMS = {};
|
||
|
||
// 导出Excel-单表格Excel 带样式
|
||
OMS.downLoadXlsx = ({ dom = 'el-table', name = '文件', ColumnWdth = [] }) => {
|
||
let table = document.getElementById(dom);
|
||
// 因为element-ui的表格的fixed属性导致多出一个table,会下载重复内容,这里删除掉
|
||
if (table.querySelector('.el-table__fixed')) {
|
||
table.removeChild(table.querySelector('.el-table__fixed'));
|
||
}
|
||
if (table.querySelector('.el-table__fixed-right')) {
|
||
table.removeChild(table.querySelector('.el-table__fixed-right'));
|
||
}
|
||
|
||
let et = XLSX.utils.table_to_book(table, { raw: true }); //此处传入table的DOM节点,raw为true表示单元格为文本格式(未加工)
|
||
let wbs = et.Sheets.Sheet1;
|
||
// 删掉末尾空行
|
||
Object.keys(wbs).forEach((item, index) => {
|
||
|
||
if (!item.startsWith('!') && wbs[item].v == '') {
|
||
delete wbs[item];
|
||
}
|
||
});
|
||
|
||
//设置表格列宽度
|
||
if (ColumnWdth.length === 0) {
|
||
for (let i = 0; i < 30; i++) {
|
||
wbs['!cols'][i] = { wch: 12.5 };
|
||
}
|
||
} else {
|
||
ColumnWdth.forEach((item, i) => {
|
||
console.log(i)
|
||
if(i==0){ wbs['!rows'][i] = { hpt: 69.75 };}
|
||
else if(i==4){ wbs['!rows'][i] = { hpt: 33 };}
|
||
// else{
|
||
// const value = cell.v;
|
||
// const length = value.length || 0;
|
||
// const newHeight = Math.ceil(length / 10) + 1; // 每10个字符设置行高加1
|
||
// worksheet[XLSX.utils.encode_row(row)].h = newHeight * 20; // 假设单位是EMU(English Metric Unit)
|
||
// }
|
||
wbs['!cols'][i] = { wch: item };
|
||
});
|
||
}
|
||
//循环遍历每一个表格,设置样式
|
||
for (const key in wbs) {
|
||
if(key == 'A1'){
|
||
wbs[key].v =wbs[key].v.replaceAll(" ","\r\n");
|
||
|
||
wbs[key].s = {
|
||
font: {
|
||
sz: 11, //字体大小
|
||
bold: false, //加粗
|
||
name: '宋体', //字体
|
||
color: {
|
||
rgb: '000000', //十六进制,不带#
|
||
},
|
||
},
|
||
alignment: {
|
||
//文字居中
|
||
horizontal: 'left',
|
||
vertical: 'center',
|
||
wrapText: true, //文本自动换行
|
||
},
|
||
border: {
|
||
// 设置边框
|
||
top: { style: 'thin' },
|
||
bottom: { style: 'thin' },
|
||
left: { style: 'thin' },
|
||
right: { style: 'thin' },
|
||
},
|
||
};
|
||
}else if(key == 'A2'){
|
||
wbs[key].s = {
|
||
font: {
|
||
sz: 16, //字体大小
|
||
bold: true, //加粗
|
||
name: '宋体', //字体
|
||
color: {
|
||
rgb: '000000', //十六进制,不带#
|
||
},
|
||
},
|
||
alignment: {
|
||
//文字居中
|
||
horizontal: 'center',
|
||
vertical: 'center',
|
||
wrapText: false, //文本自动换行
|
||
},
|
||
border: {
|
||
// 设置边框
|
||
top: { style: 'thin' },
|
||
bottom: { style: 'thin' },
|
||
left: { style: 'thin' },
|
||
right: { style: 'thin' },
|
||
},
|
||
};
|
||
}
|
||
else if (!key.startsWith('!')) {
|
||
wbs[key].s = {
|
||
font: {
|
||
sz: 11, //字体大小
|
||
bold: false, //加粗
|
||
name: '宋体', //字体
|
||
color: {
|
||
rgb: '000000', //十六进制,不带#
|
||
},
|
||
},
|
||
alignment: {
|
||
//文字居中
|
||
horizontal: 'center',
|
||
vertical: 'center',
|
||
wrapText: false, //文本自动换行
|
||
},
|
||
border: {
|
||
// 设置边框
|
||
top: { style: 'thin' },
|
||
bottom: { style: 'thin' },
|
||
left: { style: 'thin' },
|
||
right: { style: 'thin' },
|
||
},
|
||
};
|
||
}
|
||
}
|
||
|
||
const 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',
|
||
];
|
||
|
||
// 行列合并
|
||
let range = wbs['!merges'];
|
||
if (range) {
|
||
range.forEach((item) => {
|
||
let startColNumber = Number(item.s.r),
|
||
endColNumber = Number(item.e.r);
|
||
let startRowNumber = Number(item.s.c),
|
||
endRowNumber = Number(item.e.c);
|
||
const test = wbs[arr[startRowNumber] + (startColNumber + 1)];
|
||
for (let col = startColNumber; col <= endColNumber; col++) {
|
||
for (let row = startRowNumber; row <= endRowNumber; row++) {
|
||
wbs[arr[row] + (col + 1)] = test;
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
let etout = XLSXStyle.write(et, {
|
||
bookType: 'xlsx',
|
||
type: 'buffer',
|
||
});
|
||
try {
|
||
FileSaver.saveAs(new Blob([etout], { type: 'application/octet-stream' }), `${name}.xlsx`); //导出的文件名
|
||
} catch (e) {
|
||
throw e;
|
||
}
|
||
};
|
||
|
||
export default OMS; |