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;
|