使用 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生成,不喜勿喷

相关推荐
小小坤9 分钟前
前端基于AI生成H5 vue3 UI组件
前端·javascript·vue.js
既见君子24 分钟前
透明视频
前端
竹等寒28 分钟前
Go红队开发—web网络编程
开发语言·前端·网络·安全·web安全·golang
lhhbk31 分钟前
angular中下载接口返回文件
前端·javascript·angular·angular.js
YUELEI11836 分钟前
Vue使用ScreenFull插件实现全屏切换
前端·javascript·vue.js
我自纵横20231 小时前
第一章:欢迎来到 HTML 星球!
前端·html
发财哥fdy1 小时前
3.12-2 html
前端·html
ziyu_jia1 小时前
React 组件测试【React Testing Library】
前端·react.js·前端框架
祈澈菇凉1 小时前
如何在 React 中实现错误边界?
前端·react.js·前端框架
撸码到无法自拔1 小时前
❤React-组件的新旧生命周期
前端·javascript·react.js·前端框架·ecmascript