ExcelJS 初学者教程:在 Vue 项目中实现表格数据导出

1. 引言

ExcelJS 是一个强大的 JavaScript 库,用于创建、读取和修改 Excel 文件。在前端开发中,常常需要将表格数据导出为 Excel 文件,ExcelJS 能很好地满足这一需求。本教程将结合 Vue 项目,详细介绍如何使用 ExcelJS 实现表格数据导出功能。

2. 环境准备

2.1 创建 Vue 项目

如果你还没有 Vue 项目,可以使用 Vue CLI 创建一个新的项目:

bash 复制代码
bash
npm install -g @vue/cli
vue create exceljs-demo
cd exceljs-demo

2.2 安装 ExcelJS

在项目根目录下,使用 npm 或 yarn 安装 ExcelJS:

csharp 复制代码
bash
npm install exceljs
# 或者
yarn add exceljs

3. 案例场景

假设我们有一个 Vue 项目,页面上有一个表格展示报关单表体数据,现在需要将这些数据导出为 Excel 文件。

4. ExcelJS 基础使用步骤

4.1 引入 ExcelJS

在需要使用 ExcelJS 的组件中引入该库:

xml 复制代码
imForm.vue

<script setup>
import ExcelJS from 'exceljs';
// ... 其他引入代码 ...
</script>

4.2 创建工作簿和工作表

在导出函数中,首先创建一个 Workbook 对象,然后添加一个工作表:

xml 复制代码
imForm.vue
<script setup>
// ... 已有代码 ...

const exportTable = async () => {
  // ... 检查数据是否为空的代码 ...

  const filename = '表体数据';
  const sheetname = '表体数据';
  // 创建一个新的工作簿
  const workbook = new ExcelJS.Workbook();
  // 在工作簿中添加一个工作表
  const worksheet = workbook.addWorksheet(sheetname);

  // ... 后续代码 ...
};

// ... 已有代码 ...
</script>

4.3 定义表头和列配置

根据表格数据的结构,定义 Excel 表格的表头和列配置:

xml 复制代码
imForm.vue

<script setup>
// ... 已有代码 ...

const columnsConfig = [
  { prop: "gNo", label: "项号" },
  { prop: "contrItem", label: getLabelByProp('contrItem') },
  // ... 其他列配置 ...
];

const exportTable = async () => {
  // ... 已有代码 ...

  const columns = [];
  columnsConfig.forEach((field) => {
    if (field.label && field.prop) {
      columns.push({
        header: typeof field.label === 'function' ? field.label() : field.label,
        key: field.prop
      });
    }
  });
  // 将列配置应用到工作表中
  worksheet.columns = columns;

  // ... 后续代码 ...
};

// ... 已有代码 ...
</script>

4.4 添加数据到工作表

将表格数据添加到工作表的行中:

xml 复制代码
imDeclarationForm.vue
Apply
<script setup>
// ... 已有代码 ...

const exportTable = async () => {
  // ... 已有代码 ...

  // 将表格数据添加到工作表中
  worksheet.addRows(tableData.value);

  // ... 后续代码 ...
};

// ... 已有代码 ...
</script>

4.5 导出 Excel 文件

将工作簿转换为二进制数据,创建 Blob 对象,然后通过创建 <a> 标签模拟点击实现文件下载:

xml 复制代码
imForm.vue

<script setup>
// ... 已有代码 ...

const exportTable = async () => {
  // ... 已有代码 ...

  try {
    // 将工作簿转换为二进制数据
    const buffer = await workbook.xlsx.writeBuffer();
    // 创建 Blob 对象
    const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
    // 创建临时 URL
    const url = window.URL.createObjectURL(blob);
    // 创建 <a> 标签
    const a = document.createElement('a');
    a.href = url;
    a.download = `${filename}.xlsx`;
    // 模拟点击下载
    a.click();
    // 释放临时 URL
    window.URL.revokeObjectURL(url);
    ElNotification({
      title: '成功',
      message: '表格导出成功',
      type: 'success',
    });
  } catch (error) {
    console.error('导出表格失败:', error);
    ElNotification({
      title: '失败',
      message: '表格导出失败',
      type: 'error',
    });
  }
};

// ... 已有代码 ...
</script>

4.6 添加导出按钮

在模板中添加一个按钮,绑定导出函数:

xml 复制代码
imDeclarationForm.vue
Apply
<template>
  <!-- ... 已有代码 ... -->
  <el-card>
    <el-button type="primary" @click="exportTable">导出表格</el-button>
    <el-table :data="tableData" style="width: 100%" border stripe @row-click="handleRowClick">
      <!-- ... 表格列配置 ... -->
    </el-table>
  </el-card>
  <!-- ... 已有代码 ... -->
</template>

5. 总结

通过以上步骤,我们在 Vue 项目中使用 ExcelJS 实现了表格数据导出为 Excel 文件的功能。主要步骤包括引入 ExcelJS、创建工作簿和工作表、定义表头和列配置、添加数据到工作表以及导出文件。ExcelJS 还提供了丰富的 API 用于样式设置、合并单元格等高级操作,你可以根据实际需求进一步探索。

6. 注意事项

  • 确保在使用 ExcelJS 前已经正确安装该库。
  • 处理异步操作时,要注意错误处理,避免出现未捕获的异常。
  • 导出大文件时,可能会影响性能,需要考虑优化。
相关推荐
一水鉴天14 分钟前
统一对象拓扑(UOT)设计全链定稿:从三件事分离到三继承 之1 20261010(豆包“查看聊天内容”继续)
前端·css
杨杰39817 分钟前
我给嵌入式设备写了个 6MB 的 JavaScript 运行时(xuan)
javascript
栖凤25 分钟前
Java 的 try-catch 在 Agent 里失效了,我用了 5 个模式才兜住
java·前端·python
粥里有勺糖26 分钟前
视野修炼第136期 | 前端小恐龙"Deno"被收购
前端·github·ai编程
修炼的dance30 分钟前
页面塞了13.88 MB字体,导出的PDF只有71 KB
前端
qq_3691736331 分钟前
如何将 AI 生成的 HTML 网页发布成在线链接?不用自己搭建服务器
前端·人工智能·html·效率工具·html 发布
风花一世月38 分钟前
⚡ 我把一座含氢能源园区搬进了浏览器(五类能流实时算守恒,在线直接玩)
前端·人工智能
羲云1 小时前
Claude 越界事件之后:Agent 权限设计为什么不能只靠提示词
前端
行者全栈架构师1 小时前
【鸿蒙心迹】鸿蒙网络请求架构实战——@ohos.net.http 到 Axios 封装、拦截器与统一错误处理(HarmonyOS 7.x)
前端·算法·架构
全栈Agent 小李1 小时前
【无标题】
前端·后端·agent·ai编程·全栈·cursor·mcp