rhb-server/mes-ui/rhb-app/common/exceltool.js
2025-10-20 11:14:41 +08:00

184 lines
4.4 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;