exportExcel.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import * as XLSX from "xlsx-js-style";
  2. /**
  3. * 导出Excel表格
  4. * @param header 生成excel的表头 []
  5. * @param data 生成excel的内容 []
  6. * @param merges 生成excel的合并单元格
  7. * @param name 生成excel的文件名,如:abc.xlsx
  8. * */
  9. export const exportExcel = (header, data, merges, name) => {
  10. const workbook = XLSX.utils.book_new(); // 创建一个工作表
  11. const worksheet = XLSX.utils.aoa_to_sheet([header, ...data]);// 将工作表添加到工作簿
  12. // 设置worksheet每列的最大宽度
  13. const colWidth = data.map(d => d.map(val => {
  14. let wch = 10;
  15. // 是否为中文
  16. if (val) wch = val.toString().split("").map(str => str.charCodeAt() > 255 && 2 || 1).reduce((p, v) => p + v);
  17. return { wch };
  18. }));
  19. // 以第一行为初始值
  20. let result = colWidth[0];
  21. for (let i = 1; i < colWidth.length; i++) {
  22. for (let j = 0; j < colWidth[i].length; j++) {
  23. if (result[j]["wch"] < colWidth[i][j]["wch"]) result[j]["wch"] = colWidth[i][j]["wch"];
  24. }
  25. }
  26. header.forEach((val, i) => {
  27. if (result[i]["wch"] < val.length * 2) result[i]["wch"] = val.length * 2;
  28. });
  29. worksheet["!cols"] = result;
  30. // 合并单元格
  31. worksheet["!merges"] = merges;
  32. // 设置居中
  33. for (let i in worksheet) {
  34. if (worksheet[i].v) worksheet[i].s = { alignment: { horizontal: "center", wrapText: true, vertical: "center" } };
  35. }
  36. XLSX.utils.book_append_sheet(workbook, worksheet); // 生成Excel文件
  37. XLSX.writeFile(workbook, name);
  38. }