前端导出带样式的excel文件

Jiafeng

分类: JavaScript 0 0

前言

  • 前端导出excel的方式有很多,如:js-export-excel;xlsx+file-saver,这两种方式添加样式都比较繁琐,这里采用xlsx-js-style实现
  • 文档地址

导出方法

  1. import XLSX from 'xlsx-js-style';
  2. // 导出表头默认样式
  3. const THeaderStyle = {
  4. // font 字体属性
  5. font: {
  6. bold: true,
  7. sz: 12
  8. },
  9. // alignment 对齐方式
  10. alignment: {
  11. vertical: 'center', // 垂直居中
  12. horizontal: 'center', // 水平居中
  13. },
  14. // fill 颜色填充属性
  15. fill: {
  16. fgColor: { rgb: 'f2f3f5' },
  17. },
  18. // border style
  19. border: {
  20. top: { style: 'thin', color: { rgb: '909399' } },
  21. right: { style: 'thin', color: { rgb: '909399' } },
  22. bottom: { style: 'thin', color: { rgb: '909399' } },
  23. left: { style: 'thin', color: { rgb: '909399' } }
  24. }
  25. }
  26. /**
  27. * json数据导出excel
  28. * @param params columns:表头数据 data:表格数据 excelName:导出的文件名 autoWidth: 自适应列宽
  29. * @returns
  30. */
  31. export const exportExcel = (params: { columns: any[], data: any[], excelName?: string, autoWidth?: boolean }) => {
  32. const { columns, data, excelName, autoWidth = true } = params
  33. const THeader: any = [], filterVal: any = [];
  34. columns.forEach((item: { label: any; prop: any; }) => {
  35. THeader.push({
  36. v: item.label,
  37. t: 's',
  38. s: THeaderStyle
  39. })
  40. filterVal.push(item.prop)
  41. })
  42. const TData = data.map(v => filterVal.map((j: string | number) => v[j]))
  43. const sheetData = [[...THeader], ...TData]
  44. const sheet = XLSX.utils.aoa_to_sheet(sheetData);// aoa_to_sheet 将二维数组转成 sheet
  45. // 自适应列宽
  46. if (autoWidth) {
  47. // 设置worksheet每列的最大宽度
  48. const colWidth = sheetData.map(row => row.map((val: { toString: () => { (): any; new(): any; charCodeAt: { (arg0: number): number; new(): any; }; length: number; }; } | null) => {
  49. // 先判断是否为null/undefined
  50. if (val == null) {
  51. return {
  52. 'width': 10
  53. }
  54. }
  55. // 再判断是否为中文
  56. else if (val.toString().charCodeAt(0) > 255) {
  57. return {
  58. 'width': val.toString().length * 2 + 2
  59. }
  60. } else {
  61. return {
  62. 'width': val.toString().length + 2
  63. }
  64. }
  65. }))
  66. // 以第一行为初始值
  67. const result = colWidth[0]
  68. for (let i = 1; i < colWidth.length; i++) {
  69. for (let j = 0; j < colWidth[i].length; j++) {
  70. if (result[j]['width'] < colWidth[i][j]['width']) {
  71. result[j]['width'] = colWidth[i][j]['width']
  72. }
  73. }
  74. }
  75. // 将result添加到sheet中
  76. sheet['!cols'] = result
  77. }
  78. // 设置表头行高
  79. const rows = [{ hpx: 20 }]
  80. sheet['!rows'] = rows; // 将rows添加到sheet中,设置行高
  81. // 设置合并单元格
  82. // const merges = [
  83. // { s: { r: 0, c: 0 }, e: { r: 0, c: 6 } },
  84. // { s: { r: 1, c: 1 }, e: { r: 1, c: 2 } },
  85. // { s: { r: 1, c: 3 }, e: { r: 1, c: 4 } },
  86. // { s: { r: 1, c: 5 }, e: { r: 1, c: 6 } },
  87. // { s: { r: 1, c: 0 }, e: { r: 2, c: 0 } },
  88. // ]
  89. // sheet['!merges'] = merges; // 将merges添加到sheet中
  90. // 创建虚拟的 workbook
  91. const workbook = XLSX.utils.book_new();
  92. // 向 workbook 中添加 sheet
  93. XLSX.utils.book_append_sheet(workbook, sheet, 'sheet名称');
  94. // 导出 workbook
  95. XLSX.writeFile(workbook, `${excelName ? (excelName.includes('.xlsx') ? excelName : excelName + '.xlsx') : 'excel名称.xlsx'}`);
  96. }
  • 0人 Love
  • 0人 Haha
  • 0人 Wow
  • 0人 Sad
  • 0人 Angry

作者简介: Jiafeng

共 0 条评论关于 “前端导出带样式的excel文件”

发表评论

昵称、邮箱为必填项,电子邮件地址不会被公开