前端导出自适应列宽的Excel
介绍
要根据用户选择将数据导出成自适应列宽的Excel,
这边使用了exceljs库来实现。
实现
引入库
使用包管理工具引入库。
我使用的是pnpm
在需要用到的地方引入库。
1 2
| import * as XLSX from "xlsx";
|
实现
通过workbook创建生成excel文件。
自适应列宽是通过正则判断内容是中文还是英文。中文长度为2.1,英文长度为1.1。统计每列最长的列,并设置列宽。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| const data = [ ["ID", "名称",....], ... ]; if (data.length == 1) { return ElMessage.warning("请选择要导出的行"); }
const workbook = XLSX.utils.book_new(); const worksheet = XLSX.utils.aoa_to_sheet(data);
const headsWidth = Object.keys(data[0]).map(value => { if (/.*[\u4e00-\u9fa5]+.*$/.test(value)) { return parseFloat(value.toString().length * 2.1); } else { return parseFloat(value.toString().length * 1.1); } });
const rowsWidth = data.map(item => {
const maxValue = Object.values(item).map((value, index) => { let valueWidth; if (/.*[\u4e00-\u9fa5]+.*$/.test(value as string)) { valueWidth = parseFloat(value.toString().length * 2.1); } else { valueWidth = parseFloat(value.toString().length * 1.1); } return Math.max(valueWidth, headsWidth[index]); }); return maxValue; });
let aotuWidth = []; rowsWidth.map((row, index) => { let maxWidth = []; row.map((value, i) => { if (index === 0) { maxWidth.push({ wch: value }); } else { maxWidth.push({ wch: Math.max(value, aotuWidth[i].wch) }); } }); aotuWidth = maxWidth; });
worksheet["!cols"] = aotuWidth; XLSX.utils.book_append_sheet(workbook, worksheet, "表格1"); XLSX.writeFile(workbook, "用户表格.xlsx");
|
参考资料
SheetJS 中文网
使用xlsx.js导出为excel,并实现自适应列宽
Vue3 exceljs库实现前端导入导出Excel
关于本人
HaiYao的博客
Git主页