vue 写导出Excel文件(复杂表格多行多列合并的)

前些天产品提了个需求 要导出当前页面的数据,对于第一次写导出文件的我无从下手(之前都是后端写好丢给前端的),去网上搜了很多也没找到自己想要的效果。于是我科学上网了一波 找到了一个名为 xlsx-js-style 的包,然后根据这个包,完成了这个棘手的需求(我是前端小白),废话不多说,来上代码。

// 首先得先下载这个包
npm i xlsx-js-style  

// 然后在自己开发的文件夹里引入

import XLSXS from "xlsx-js-style";

这是完整代码,我用的是vue3哈  没用ts 代码很庸愚,你们可以到时候根据数据来进行push操作。

push数据的时候,看看你们的数据需要在哪一行下push ,然后从push那一行起 后面的数据都是像堆俄罗斯方块似的堆上去。

<template>
  <div>
    <button @click="exportToExcel">导出为Excel</button>
  </div>
</template>

<script setup>
  import {ref} from 'vue'
  // import { saveAs } from 'file-saver'
  // import XLSX  from 'xlsx-js-style'
  import XLSXS from "xlsx-js-style";

 
  const exportToExcel  = ()=>{
    // 创建一个新的工作簿
    const wb = XLSXS.utils.book_new();
    // sheet工作簿标题
    const sheetName = "xlsx导出带样式";
    // 创建数据行和样式
    let rowArray = [
      // 人才发展历程
      [{
        v: "人才发展历程",
        t: "s",
        s: {
          font: {
            name: "Courier",
            sz: 24,
            bold: true, 
            color:'b8ddb0'
          },
          fill: { fgColor: { rgb: '9e9e9e' } } 
        }
      }],
      [{
          v: "姓名",
          t: "s",
          s: {
            font: {
              name: "Courier",
              rgb: "E9E9E9"
            },
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
        },
        {
          v: "王大",
          t: "s",
          s: {
            font: {
              bold: true,
              color: {
                rgb: "FF0000"
              }
            }
          }
        },
        {
          v: "部门",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
        },
        {
          v: "管理服务部",
          t: "s",
          s: {
            alignment: {
              wrapText: true
            }
          }
        },
        {
          v: "岗位",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
        },
        {
          v: "web全栈开发",
          t: "s",
          s: {
            alignment: {
              wrapText: true
            }
          }
        },
      ],
      [{
          v: "入职时间",
          t: "s",
          s: {
            font: {
              name: "Courier",
              rgb: "E9E9E9"
            }
          }
        },
        {
          v: "2021.03.06",
          t: "s",
          s: {
            font: {
              bold: true,
              color: {
                rgb: "FF0000"
              }
            }
          }
        },
        {
          v: "司龄",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
        },
        {
          v: "8.5",
          t: "s",
          s: {
            alignment: {
              wrapText: true
            }
          }
        },
        {
          v: "职级职等",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
        },
        {
          v: "P4",
          t: "s",
          s: {
            alignment: {
              wrapText: true
            }
          }
        },
      ],
      [{
          v: "学历",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
        },
        {
          v: "本科",
          t: "s",
          s: {
            font: {
              bold: true,
              color: {
                rgb: "FF0000"
              }
            }
          }
        },
        {
          v: "毕业院校",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
        },
        {
          v: "南京科技大学苏州信息学院",
          t: "s",
          s: {
            alignment: {
              wrapText: true
            }
          }
        },
        {
          v: "专业",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
        },
        {
          v: "畜牧养殖",
          t: "s",
          s: {
            alignment: {
              wrapText: true
            }
          }
        },
      ],
      [{
          v: "诗选之星",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
        },
        {
          v: "总计:2次",
          t: "s",
          s: {
            font: {
              bold: true,
              color: {
                rgb: "FF0000"
              }
            },
            width:80
          }
        },
      ],
      [{
          v: "半年绩效",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
        },
        {
          v: "A:1次,A:1次,A:1次,A:1次,A:1次",
          t: "s",
          s: {
            // r:0,
            // c:0,
            // e:{r:3,c:0},
            font: {
              bold: true,
              color: {
                rgb: "FF0000"
              },
            },
          }
        },
      ],
      // 工作经历(由近到远填写)
      [{
        v: "工作经历(由近到远填写)",
        t: "s",
        s: {
          r:0,
          c:4,
          font: {
            name: "Courier",
            sz: 24,
            bold: true, 
            color:'b8ddb0'
          },
          fill: { fgColor: { rgb: '9e9e9e' } } 
        }
      }],
      // 表头
      [{
          v: "起止年月",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "工作单位",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "工作单位",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "在职岗位",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      }
    
      ],
      // 公司荣誉
      [{
        v: "公司荣誉",
        t: "s",
        s: {
          r:0,
          c:4,
          font: {
            name: "Courier",
            sz: 24,
            bold: true, 
            color:'b8ddb0'
          },
          fill: { fgColor: { rgb: '9e9e9e' } } 
        }
      }],
      // 表头
      [{
          v: "时间",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "荣誉类型",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "入选原因",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },

      ],
      // 学习历程
      [{
        v: "学习历程",
        t: "s",
        s: {
          r:0,
          c:4,
          font: {
            name: "Courier",
            sz: 24,
            bold: true, 
            color:'b8ddb0'
          },
          fill: { fgColor: { rgb: '9e9e9e' } } 
        }
      }],
      // 表头
      [{
          v: "学习时间",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "学习方式",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "学习课程",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "学习课程",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "地点",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "考核分数",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },

      ],
      // 调薪记录
      [{
        v: "调薪记录",
        t: "s",
        s: {
          r:0,
          c:4,
          font: {
            name: "Courier",
            sz: 24,
            bold: true, 
            color:'b8ddb0'
          },
          fill: { fgColor: { rgb: '9e9e9e' } } 
        }
      }],
      // 表头
      [{
          v: "时间",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "职级职等",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "综合薪资",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "类型",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "调整原因",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      

      ],
      // 年度积分

      [{
          v: "时间",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "年度积分",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "年度积分",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "年度积分",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "年度建议",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "年度建议",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },

      ],
      [{
          v: "时间",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "意见",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "采纳数量",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "任务",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "提出数量",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },
      {
          v: "采纳数量",
          t: "s",
          s: {
            fill: {
              fgColor: {
                rgb: "E9E9E9"
              }
            }
          }
      },

      ],
    ];
    // 创建带有行的工作表;将工作表添加到工作簿
    const ws = XLSXS.utils.aoa_to_sheet(rowArray,{raw:true});
    XLSXS.utils.book_append_sheet(wb, ws, sheetName);
    //默认最大列数
    let maxColumnNumber = 1; 
    rowArray.map(item=>item.length>maxColumnNumber?maxColumnNumber=item.length:'');
    //合并  #将第一行标题列合并
    ws['!merges'] = [ 
      // 人才发展历程
      XLSXS.utils.decode_range('A1:F1'),
      XLSXS.utils.decode_range('B5:F5'),
      XLSXS.utils.decode_range('B6:F6'),
      // 工作经历
      XLSXS.utils.decode_range('A7:F7'),
      XLSXS.utils.decode_range('A8:B8'),
      XLSXS.utils.decode_range('C8:D8'),
      XLSXS.utils.decode_range('E8:F8'),
      // 公司荣誉
      XLSXS.utils.decode_range('A9:F9'),
      XLSXS.utils.decode_range('C10:F10'),
      // 学习历程
      XLSXS.utils.decode_range('A11:F11'),
      XLSXS.utils.decode_range('C12:D12'),
      // 调薪历程
      XLSXS.utils.decode_range('A13:F13'),
      XLSXS.utils.decode_range('E14:F14'),
      // 年度积分
      XLSXS.utils.decode_range('A15:A16'),
      XLSXS.utils.decode_range('B15:D15'),
      XLSXS.utils.decode_range('E15:F15'),
    ];
    console.log(ws);
    //边框样式
    let borderStyle = {
      top: {
        style: "thin",
        color: {
          rgb: "000000"
        }
      },
      bottom: {
        style: "thin",
        color: {
          rgb: "000000"
        }
      },
      left: {
        style: "thin",
        color: {
          rgb: "000000"
        }
      },
      right: {
        style: "thin",
        color: {
          rgb: "000000"
        }
      }
    }
    //添加外边框
    rowArray.map((item,index)=>{
        for(let i=1;i<=maxColumnNumber;i++){
          if(!ws[''+String.fromCharCode(64 + parseInt(i))+(index+1)]){
            ws[''+String.fromCharCode(64 + parseInt(i))+(index+1)] = {v:'',t:'s',s:{border:borderStyle}};
            continue ;
          }
          //边框
          ws[''+String.fromCharCode(64 + parseInt(i))+(index+1)].s.border = borderStyle;

          //字体居中
          ws[''+String.fromCharCode(64 + parseInt(i))+(index+1)].s.alignment = { vertical: 'center', horizontal: 'center' } 
        }
    })
    //添加列宽
    ws['!cols'] = ([{
      width: 20
    }, {
      width: 20
    }, {
      width: 20
    }, {
      width: 20
    }, {
      width: 20
    }, {
      width: 20
    }
  ]);
    //添加行高
    ws['!rows'] = [
      { 'hpt': 40 }, 
      { 'hpt': 40 }, 
      { 'hpt': 40 }, 
      { 'hpt': 40 }, 
      { 'hpt': 40 }, 
      { 'hpt': 40 }, 
      { 'hpt': 40 },
      { 'hpt': 40 },
      { 'hpt': 40 },
      { 'hpt': 40 },
      { 'hpt': 40 },
      { 'hpt': 40 },
      { 'hpt': 40 },
      { 'hpt': 40 },
    ];
    // 将Excel文件写入浏览器  #导出
    XLSXS.writeFile(wb, sheetName+".xlsx");
  }
</script>

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值