利用ExcelJS封装一个excel表格的导出

ExcelJS 操作和写入Excel 文件。

直接上代码,js部分:
exportFn.js

javascript 复制代码
import ExcelJS from 'exceljs';
import { saveAs } from 'file-saver';

export function exportExcleUtils(tHeader, filterVal, listData, fileName) {
  //设置工作簿属性
  const workbook = new ExcelJS.Workbook();
  workbook.creator = 'Me';
  workbook.lastModifiedBy = 'Her';
  workbook.created = new Date();
  workbook.modified = new Date();
  workbook.lastPrinted = new Date();
  //添加工作薄
  const worksheet = workbook.addWorksheet('sheet1');
  //计算标题宽
  let colWidth = calculateColumnWidth(tHeader);
  console.log(colWidth);
  let style = { alignment: { vertical: 'middle', horizontal: 'center' } };
  let columns = [];
  for (let i = 0; i < tHeader.length; i++) {
    let header = {
      header: tHeader[i],
      key: filterVal[i] ? filterVal[i] : i + '',
      width: colWidth[i] ? colWidth[i] + 20 : 10,
      style: JSON.parse(JSON.stringify(style)),
    };
    columns.push(header);
  }
  worksheet.columns = columns;

  //添加数据
  listData.forEach((item) => {
    worksheet.addRow(item);
  });

  worksheet.getRow(1).font = { name: '宋体', family: 4, size: 16, bold: true };

  fileName = fileName + '.xlsx';
  workbook.xlsx.writeBuffer().then((data) => {
    let blob = new Blob([data], {
      type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    });
    saveAs(blob, fileName);
  });
}

export function calculateColumnWidth(tHeader) {
  let colWidth = [];
  //计算列宽
  for (let i = 0; i < tHeader.length; i++) {
    if (colWidth[i] && colWidth[i] < tHeader[i].length) {
      colWidth[i] = tHeader[i].length * 2;
    } else if (colWidth[i] === undefined) {
      colWidth[i] = tHeader[i].length * 2;
    }
  }
  return colWidth;
}

举个栗子:

javascript 复制代码
//从公共函数中拿出
import { exportExcleUtils } from '@/libs/exportFn';
...
...
...
//再写个按钮
    <el-button type="primary" @click="exportFn">导出按钮</el-button>
...
...
...

    //导出
    exportFn() {
      let loadingInstance = Loading.service({
        text: '正在导出,请稍等...',
      });

      let table = this.selectedRowArr;
		//表头
      let tHeader = [
		     'a',
		     'b',
		     'c',
		     'd',
      ];
		//数据的里字段
      let filterVal = [
	        'person',
	    	'dog',
	    	'cat',
	    	'pig',
      ];
      let fileName = '导出的表文件名';
      loadingInstance.close();
      exportExcleUtils(tHeader, filterVal, table, fileName);
    },

PS:上文的selectedRowArr变量是我项目里的,自己去塞数据,数组对象形式

相关推荐
超哥--6 小时前
B站视频内容智能分析系统(九):React 前端与管理面板
前端·react.js·前端框架
Cutecat_9 小时前
视频字幕处理工具横向:提取模式 vs 编辑模式,该如何选择
android·前端·ios·语音识别
dsyyyyy11019 小时前
JavaScript变量
开发语言·javascript·ecmascript
qq_422152579 小时前
PDF 加水印工具怎么选?2026 年文档版权保护方案对比
前端·pdf·github
kyriewen9 小时前
手写 Promise.all、race、any:不到 30 行代码,解决并发异步的所有姿势
前端·javascript·面试
brucelee18610 小时前
OpenClaw 浏览器控制(Chrome MCP)完整教程
前端·chrome
ct97811 小时前
React 状态管理方案深度对比
开发语言·前端·react
胡志辉的博客11 小时前
深入浅出理解浏览器事件循环:从一道输出题讲到 Chrome 源码
前端·javascript·chrome·chromium·event loop
代码不加糖11 小时前
js中不会冒泡的事件有哪些?
前端·javascript·vue.js
懂懂tty11 小时前
Vue2与Vue3之间API差异
前端·javascript·vue.js