前端导出excel实战(xlsx库和exceljs库)

一. 概览

前端导出excel是比较常见的需求,比如下载excel模板和批量导出excel。目前比较常用的库有xlsx和excel,接下来就着两种方式进行梳理。

二. 下载模板

xlsx库实现:

示例核心代码如下:

javascript 复制代码
const excelColumn = {
    details: {
      materialName: '物料名称',
      applyCount: '请购数量',
      unit: '单位',
      unitPrice: '单价',
      use: '用途',
      remark: '备注',
    },
  };
 function downloadTemplate(key, name) {
    const book = utils.book_new();

    // 实例化一个Sheet
    const sheet = utils.json_to_sheet(
      [
        Object.values(excelColumn[key]).reduce((p: any, c: string) => {
          p[c] = '';
          return p;
        }, {}),
      ],
      {
        header: Object.values(excelColumn[key]),
      },
    );

    // 将Sheet写入工作簿
    utils.book_append_sheet(book, sheet, 'Sheet1');

    // 写入文件,直接触发浏览器的下载
    writeFile(book, `${name}.xlsx`);
  }

代码分析:

javascript 复制代码
 // 实例化一个Sheet
    const sheet = utils.json_to_sheet(
      [
        Object.values(excelColumn[key]).reduce((p: any, c: string) => {
          p[c] = '';
          return p;
        }, {}),
      ],
      {
        header: Object.values(excelColumn[key]),
      },
    );
  1. utils.json_to_sheet第一个参数是为了得到一个诸如 {物料名称: '' ", 数量: " "}的数据,通过reduce方法实现对象属性的累加;
  2. header: Object.values(excelColumn[key]): 第二个参数是为了得到的表头的集合,诸如["物料名称","数量"]
javascript 复制代码
 utils.book_append_sheet(book, sheet, 'Sheet1');
  1. sheet1是定义工作簿的名称

exceljs库实现

示例核心代码如下:

javascript 复制代码
 const excelHeadColums = [
    {
      header: '物料名称',
      key: 'materialName',
      width: 12,
    },
    {
      header: '请购数量',
      key: 'applyCount',
      width: 14,
    },
    {
      header: '单位',
      key: 'unit',
      width: 14,
    }
  ];



const downLoadTemp = () => {
    // 创建工作簿
    const workbook = new ExcelJS.Workbook();
    // 添加工作表
    const sheet1 = workbook.addWorksheet('sheet1');
    sheet1.columns = excelHeadColums;
    data.value.details.forEach((item) => {
      sheet1.addRow(item);
    });
    // 导出表格
    workbook.xlsx.writeBuffer().then((buffer) => {
      let _file = new Blob([buffer], {
        type: 'application/octet-stream',
      });
      FileSaver.saveAs(_file, '模板.xlsx');
    });
  };

代码分析:

原理基本同xlsx,只不过相比之下,exceljs库更为强大,可以自定义导出的excel的样式

三. 批量导出

xlsx库:

javascript 复制代码
function exportExcel<T>(
    name: string,
    key: string,
    colFn?: (d: T) => Record<string, any>,
    {
      format,
    }: {
      format?: (d: T, c: string) => string;
    } = {},
  ) {
    const book = utils.book_new();
    const tableData = data.value![key].map((d) =>
      colFn
        ? colFn(d)
        : (Object.keys(excelColumn[key]).reduce((p, c) => {
            p[excelColumn[key][c]] = format ? format(d, c) : d[c];
            return p;
          }, {}) as any),
    );

    const sheet = utils.json_to_sheet(tableData, {
      header: Object.keys(tableData[0]),
    });

    utils.book_append_sheet(book, sheet, 'Sheet1');

    writeFile(book, `${name}.xlsx`);
  }

exceljs库:

javascript 复制代码
const exportReturnData = (hkDetails) => {
  // 创建工作簿
  const workbook = new ExcelJS.Workbook();
  // 添加工作表
  const sheet1 = workbook.addWorksheet('sheet1');
  sheet1.columns = receiptTableHeadColums;
  const hkColumsData = hkDetails;
  hkColumsData.forEach((item) => {
    sheet1.addRow(item);
  });
  // 设置表头样式
  const titleCell = sheet1.getRow(1);
  // 设置第一行的高度
  titleCell.height = 30;
  // 设置第一行的字体样式
  titleCell.font = {
    bold: true,
  };
  // 设置第一行文字对齐方式
  titleCell.alignment = {
    vertical: 'middle',
    horizontal: 'center',
  };
  // 设置第一行单元格的背景色
  titleCell.fill = {
    type: 'pattern',
    pattern: 'solid',
    fgColor: {
      argb: 'FFDFEAFC',
    },
  };
  // 导出表格
  workbook.xlsx.writeBuffer().then((buffer) => {
    let _file = new Blob([buffer], {
      type: 'application/octet-stream',
    });
    FileSaver.saveAs(_file, '数据表.xlsx');
  });
}; 

代码分析:

  1. 原理基本同下载模板,另附exceljs库样式调整的基本应用。

四. excel库的其它基本使用

excel库除了设置单元格样式外,另外常见的使用有设置单元格下拉框,限制某个单元格不可编辑等

1. 设置下拉框

核心代码

javascript 复制代码
const sheet1 = workbook.addWorksheet('sheet1');
for (let i = 2; i < totalExcelLength + 1; i++) {
    
    sheet1.getCell(`M${i}`).dataValidation = {
      type: 'list',
      allowBlank: true,
      formulae: [`"中标,流标"`],
    };
    sheet1.getCell(`N${i}`).dataValidation = {
      type: 'list',
      allowBlank: true,
      formulae: [`"最高价,最低价"`],
    };
  }

2. 限制某个单元格不可编辑

核心代码

javascript 复制代码
sheet1.protect('yourpassword', {
      selectLockedCells: true,
      selectUnlockedCells: true,
    });
    //解锁可编辑列
    const unlockColumns = isInitProcess ? [9, 10, 11] : [13, 14];
    unlockColumns.forEach((columnIndex) => {
      sheet1.getColumn(columnIndex).eachCell((cell, rowNumer) => {
        if (rowNumer !== 1) {
          // 跳过标题行
          cell.protection = { locked: false };
        }
      });
    });

另外还有exceljs还有其它很多强大的功能,在这就不一一举例。

五. 参考文章

这一定是前端导出Excel界的天花板
exceljs使用文档

相关推荐
GISer_Jing7 分钟前
2025前端面试热门题目——计算机网络篇
前端·计算机网络·面试
m0_748245529 分钟前
吉利前端、AI面试
前端·面试·职场和发展
理想不理想v21 分钟前
webpack最基础的配置
前端·webpack·node.js
pubuzhixing24 分钟前
开源白板新方案:Plait 同时支持 Angular 和 React 啦!
前端·开源·github
2401_8576009535 分钟前
SSM 与 Vue 共筑电脑测评系统:精准洞察电脑世界
前端·javascript·vue.js
2401_8576009535 分钟前
数字时代的医疗挂号变革:SSM+Vue 系统设计与实现之道
前端·javascript·vue.js
GDAL35 分钟前
vue入门教程:组件透传 Attributes
前端·javascript·vue.js
2402_857583491 小时前
基于 SSM 框架的 Vue 电脑测评系统:照亮电脑品质之路
前端·javascript·vue.js
web150850966411 小时前
在uniapp Vue3版本中如何解决webH5网页浏览器跨域的问题
前端·uni-app
Yvemil71 小时前
《开启微服务之旅:Spring Boot Web开发举例》(一)
前端·spring boot·微服务