使用 exceljs 导出数据为 Excel 文件

在 Vue3 中使用 exceljs 导出数据为 Excel 文件的步骤如下:


1. 安装依赖

首先安装 exceljsfile-saver(用于保存文件):

bash 复制代码
npm install exceljs file-saver

2. 创建导出工具函数

在项目中创建一个工具函数(如 exportToExcel.js),用于生成 Excel 文件并触发下载。

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

/**
 * 导出数据为 Excel 文件
 * @param {Array} data - 要导出的数据
 * @param {Array} headers - 表头配置
 * @param {string} fileName - 文件名(不含扩展名)
 */
export const exportToExcel = async (data, headers, fileName = 'export') => {
  // 创建工作簿
  const workbook = new ExcelJS.Workbook();
  const worksheet = workbook.addWorksheet('Sheet 1');

  // 添加表头
  worksheet.columns = headers.map(header => ({
    header: header.title, // 表头显示名称
    key: header.key,      // 数据字段名
    width: header.width || 20, // 列宽(可选)
  }));

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

  // 生成 Excel 文件
  const buffer = await workbook.xlsx.writeBuffer();

  // 保存文件
  const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
  saveAs(blob, `${fileName}.xlsx`);
};

3. 在 Vue 组件中使用

在 Vue 组件中调用导出函数。

示例代码:

vue 复制代码
<template>
  <button @click="handleExport">导出 Excel</button>
</template>

<script setup>
import { ref } from 'vue';
import { exportToExcel } from './utils/exportToExcel';

// 模拟数据
const data = ref([
  { id: 1, name: '张三', age: 25, department: '技术部' },
  { id: 2, name: '李四', age: 30, department: '市场部' },
  { id: 3, name: '王五', age: 28, department: '财务部' },
]);

// 表头配置
const headers = [
  { title: 'ID', key: 'id', width: 10 },
  { title: '姓名', key: 'name', width: 20 },
  { title: '年龄', key: 'age', width: 10 },
  { title: '部门', key: 'department', width: 30 },
];

// 导出逻辑
const handleExport = () => {
  exportToExcel(data.value, headers, '员工信息');
};
</script>

4. 功能说明

  • 表头配置headers 定义了 Excel 文件的表头,title 是显示名称,key 是对应数据的字段名。
  • 数据格式data 是一个对象数组,每个对象的字段名需要与 headers 中的 key 对应。
  • 文件保存 :使用 file-saversaveAs 方法将生成的 Excel 文件保存到本地。

5. 扩展功能

5.1 自定义样式

可以为表头或数据行添加样式:

javascript 复制代码
// 设置表头样式
worksheet.getRow(1).eachCell(cell => {
  cell.font = { bold: true, color: { argb: 'FFFFFF' } };
  cell.fill = {
    type: 'pattern',
    pattern: 'solid',
    fgColor: { argb: '4F81BD' },
  };
  cell.alignment = { vertical: 'middle', horizontal: 'center' };
});

// 设置数据行样式
worksheet.eachRow((row, rowNumber) => {
  if (rowNumber > 1) {
    row.eachCell(cell => {
      cell.font = { size: 12 };
      cell.alignment = { vertical: 'middle', horizontal: 'left' };
    });
  }
});

5.2 合并单元格

合并单元格示例:

javascript 复制代码
worksheet.mergeCells('A1:D1'); // 合并 A1 到 D1
worksheet.getCell('A1').value = '员工信息表';

5.3 导出图片

如果需要导出图片,可以使用 addImage 方法:

javascript 复制代码
const imageId = workbook.addImage({
  filename: 'path/to/image.png',
  extension: 'png',
});
worksheet.addImage(imageId, 'A10:B15');

6. 注意事项

  1. 数据量较大时 :如果数据量较大(如超过 10 万行),建议分批次写入或使用流式写入(stream.xlsx)。
  2. 浏览器兼容性file-saver 依赖浏览器的 BlobURL.createObjectURL,现代浏览器均支持。
  3. 性能优化:对于复杂表格,尽量减少样式操作,避免性能问题。

7. 完整代码

以下是完整的工具函数和组件代码:

工具函数 (exportToExcel.js)

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

export const exportToExcel = async (data, headers, fileName = 'export') => {
  const workbook = new ExcelJS.Workbook();
  const worksheet = workbook.addWorksheet('Sheet 1');

  // 添加表头
  worksheet.columns = headers.map(header => ({
    header: header.title,
    key: header.key,
    width: header.width || 20,
  }));

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

  // 生成文件
  const buffer = await workbook.xlsx.writeBuffer();
  const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
  saveAs(blob, `${fileName}.xlsx`);
};

Vue 组件

vue 复制代码
<template>
  <button @click="handleExport">导出 Excel</button>
</template>

<script setup>
import { ref } from 'vue';
import { exportToExcel } from './utils/exportToExcel';

const data = ref([
  { id: 1, name: '张三', age: 25, department: '技术部' },
  { id: 2, name: '李四', age: 30, department: '市场部' },
  { id: 3, name: '王五', age: 28, department: '财务部' },
]);

const headers = [
  { title: 'ID', key: 'id', width: 10 },
  { title: '姓名', key: 'name', width: 20 },
  { title: '年龄', key: 'age', width: 10 },
  { title: '部门', key: 'department', width: 30 },
];

const handleExport = () => {
  exportToExcel(data.value, headers, '员工信息');
};
</script>

通过以上步骤,你可以在 Vue3 项目中轻松实现数据导出为 Excel 文件的功能!

内容为ai生成,不喜勿喷

相关推荐
程序员与背包客_CoderZ1 小时前
Node.js异步编程——Callback回调函数实现
前端·javascript·node.js·web
非凡ghost2 小时前
Pale Moon:速度优化的Firefox定制浏览器
前端·firefox
清灵xmf2 小时前
从 Set、Map 到 WeakSet、WeakMap 的进阶之旅
前端·javascript·set·map·weakset·weakmap
11054654012 小时前
11、参数化三维产品设计组件 - /设计与仿真组件/parametric-3d-product-design
前端·3d
爱笑的林羽3 小时前
Mac M系列 安装 jadx-gui
前端·macos
运维@小兵3 小时前
vue使用路由技术实现登录成功后跳转到首页
前端·javascript·vue.js
肠胃炎3 小时前
React构建组件
前端·javascript·react.js
酷爱码3 小时前
HTML5表格语法格式详解
前端·html·html5
hello_ejb33 小时前
聊聊JetCache的缓存构建
java·前端·缓存
堕落年代3 小时前
SpringSecurity当中的CSRF防范详解
前端·springboot·csrf