web前端使用xlsx和file-saver实现前端表格table数据导出Excel功能

前言

在前端开发中,经常需要将前端页面显示的table表格数据导出为Excel文件。本文将介绍如何使用xlsx和file-saver这两个库来实现一个简单易用的Excel导出功能,并将其封装为可复用的Vue Composition API Hook。

技术栈

  • xlsx:一个强大的电子表格处理库,支持读取、解析和编写多种电子表格格式
  • file-saver:一个简单的文件保存解决方案,兼容大多数现代浏览器

实现代码解析

首先,我们来看完整的实现代码:

import * as XLSX from 'xlsx'
import { saveAs } from 'file-saver'

/**
 * 导出Excel文件hooks
 * @Author ZhangJun
 * @param tableData 要导出的表格数据(需要双向绑定的ref)
 * @Date  2025/5/29 10:00
 * @param fileName 文件名
 * @param columns 表头配置:{[表头key]:[表头名称]}
 * @param sheetName 工作表名
 * @param fileType 文件类型('xlsx' | 'xlsm' | 'xlsb' | 'xls' | 'xla' | 'biff8' | 'biff5' | 'biff2' | 'xlml' | 'ods' | 'fods' | 'csv' | 'txt' | 'sylk' | 'slk' | 'html' | 'dif' | 'rtf' | 'prn' | 'eth' | 'dbf')
 * @constructor
 */
export const useExcel = (tableData = [], columns = {}, { fileName = 'test', sheetName = 'Sheet1', fileType = 'xlsx' }) => {
  // 导出 Excel 文件
  const exportExcel = () => {
    // 获取表头的键名
    const headers_keys = Object.keys(columns)
    //按表头过滤要下载的数据
    const excelData =
      tableData.value.map(record => {
        const obj = {}
        headers_keys.forEach(key => {
          const name = columns[key]
          obj[name] = record[key]
        })
        return obj
      }) || []

    // 创建工作簿
    const workbook = XLSX.utils.book_new()

    // 将表格数据转换为工作表
    const worksheet = XLSX.utils.json_to_sheet(excelData)

    // 将工作表添加到工作簿
    XLSX.utils.book_append_sheet(workbook, worksheet, sheetName)

    // 生成 Excel 文件
    const excelBuffer = XLSX.write(workbook, {
      bookType: fileType, // 工作簿类型
      type: 'array', // 输出类型
    })

    // 创建 Blob 对象
    const blob = new Blob([excelBuffer], { type: 'application/octet-stream' })

    // 保存文件
    saveAs(blob, `${fileName}.${fileType}`)
  }

  return {
    exportExcel,
  }
}

功能详解

参数说明

  1. tableData:需要导出的表格数据,是一个Vue的ref响应式对象
  2. columns:表头配置对象,格式为{[表头key]: [表头名称]}
  3. 配置选项:
    • fileName:导出的文件名,默认为"test"
    • sheetName:Excel工作表名称,默认为"Sheet1"
    • fileType:文件类型,支持多种格式,默认为"xlsx"

实现步骤

  1. 数据预处理

    • 首先获取表头的键名
    • 根据表头配置过滤数据,只保留需要的字段,并将键名转换为配置的表头名称
  2. 创建工作簿和工作表

    • 使用XLSX.utils.book_new()创建一个新的工作簿
    • 使用XLSX.utils.json_to_sheet()将处理后的数据转换为工作表
  3. 组装Excel文件

    • 将工作表添加到工作簿中
    • 使用XLSX.write()生成Excel文件的二进制数据
  4. 文件下载

    • 创建Blob对象
    • 使用file-saversaveAs方法触发文件下载

使用方法

在Vue组件中使用这个Hook非常简单:

import { ref } from 'vue'
import { useExcel } from './useExcel'

export default {
  setup() {
    const tableData = ref([
      { id: 1, name: '张三', age: 25 },
      { id: 2, name: '李四', age: 30 },
    ])
    
    const columns = {
      id: 'ID',
      name: '姓名',
      age: '年龄'
    }
    
    const { exportExcel } = useExcel(tableData, columns, {
      fileName: '用户数据',
      sheetName: '用户列表'
    })
    
    return {
      exportExcel
    }
  }
}

然后在模板中添加一个导出按钮:

<button @click="exportExcel">导出Excel</button>

优点

  1. 封装良好:将复杂的Excel导出逻辑封装在一个Hook中,使用简单
  2. 配置灵活:支持自定义文件名、工作表名和文件格式
  3. 表头映射:可以通过columns参数灵活配置表头显示名称
  4. 类型安全:支持多种Excel文件格式

扩展建议

  1. 添加样式支持:可以扩展功能,支持单元格样式、合并单元格等高级特性
  2. 大数据量优化:对于大数据量导出,可以考虑分片处理或使用Web Worker
  3. 国际化支持:可以根据需要添加多语言支持
  4. 进度提示:对于大量数据导出,可以添加导出进度提示

总结

通过xlsxfile-saver的组合,我们可以轻松实现前端Excel导出功能。本文介绍的useExcel Hook提供了一种简洁、可复用的解决方案,可以快速集成到Vue项目中,满足大多数导出需求。

对于更复杂的需求,可以基于这个Hook进行扩展,或者直接使用xlsx库提供的更多高级功能。

### 回答1: Vue中的el-table组件是一个强大的表格组件,它可以方便地展示大量数据,并且支持分页功能。同时,借助前端file-saver,我们可以实现将el-table中的数据导出Excel文件。 要实现这个功能,首先需要在Vue项目中安装file-saver库。可以使用npm或者yarn命令进行安装。 安装完毕后,我们可以在需要导出Excel的页面中引入file-saver库。 import { saveAs } from 'file-saver'; 在el-table数据源中,我们通常会使用一个数组来存储表格数据。假设我们的表格数据tableData,我们可以通过将这个数组转换为Excel文件来实现导出功能。 首先将表格数据转换为二维数组的形式,使得每一行的数据存储在一个小数组中。 const exportData = tableData.map(row => { return Object.values(row); }); 然后,我们可以使用file-saver库提供的saveAs函数来将数据导出Excel文件。我们需要将二维数组导出为一个csv格式的文本文件,并使用saveAs函数保存文件。 const csvContent = exportData.map(row => row.join(",")).join("\n"); const blob = new Blob(["\ufeff" + csvContent], { type: "text/csv;charset=utf-8" }); saveAs(blob, "export.csv"); 在上述代码中,我们首先将二维数组通过mapjoin方法转换为一个csv格式的字符串,然后使用Blob创建一个Blob对象,最后使用saveAs函数将Blob对象保存为一个名为export.csv的文件。 通过上述步骤,我们就可以实现在Vue中使用file-saver库将el-table中的分页数据导出Excel文件。导出的文件可以方便地在Excel中查看处理。 ### 回答2: Vue的el-table组件FileSaver,可以实现前端导出Excel导出分页数据功能。 首先,我们需要引入el-tableFileSaver库,并确保已经正确配置了Vue项目。然后,在组件中使用el-table,并将分页数据绑定到el-table的data属性上。 接下来,我们需要添加一个导出按钮,用于触发导出操作。当按钮被点击时,我们可以通过el-table的方法将分页数据转换为一个二维数组,并使用FileSaver库将该数组导出Excel文件。 具体实现步骤如下: 1. 引入el-tableFileSaver库: ``` import FileSaver from 'file-saver'; import { ElTable, ElTableColumn } from 'element-ui'; ``` 2. 在组件中使用el-table,并将分页数据绑定到data属性上: ``` <template> <el-table :data="tableData"> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> ... </el-table> </template> <script> export default { data() { return { tableData: [], // 分页数据 ... }; }, ... }; </script> ``` 3. 添加一个导出按钮,并在按钮的点击事件中执行导出操作: ``` <template> <el-table :data="tableData"> ... </el-table> <el-button @click="exportExcel">导出Excel</el-button> </template> <script> export default { ... methods: { exportExcel() { const data = this.$refs.table.store.states.data; // 获取所有数据 const columns = this.$refs.table.columns.map(column => column.label); // 获取表头 const tableData = [columns, ...data]; // 构造二维数组 const worksheet = XLSX.utils.aoa_to_sheet(tableData); const workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }); const blob = new Blob([excelBuffer], { type: 'application/octet-stream' }); FileSaver.saveAs(blob, 'data.xlsx'); }, ... } }; </script> ``` 以上代码通过el-table的$refs属性获取到el-table的实例,从而可以获取到所有数据表头,并进行导出操作。最后使用FileSaver库将二维数组保存为Excel文件,文件名为data.xlsx。 通过以上步骤,我们可以实现vue el-table前端导出Excel导出分页数据功能。 ### 回答3: 在使用vue el-tablefile-saver前端导出Excel时,默认情况下只会导出当前展示页面的数据,无法导出分页数据。但我们可以通过以下步骤来实现导出分页数据功能。 首先,我们需要手动获取所有需要导出数据。可以通过向后端发送请求获取所有数据的接口,并在前端将返回的数据进行合并。 然后,使用file-saver库将合并后的数据导出Excel文件。可以使用Blob对象将数据转换为二进制文件,再通过saveAs方法将二进制文件保存为Excel文件。 最后,展示给用户下载链接或直接自动下载导出Excel文件。 这样,我们就可以实现使用vue el-tablefile-saver前端导出分页数据功能。 需要注意的是,如果数据量较大,一次性获取全部数据可能会影响前端性能用户体验。因此,可以考虑在导出功能中添加限制,例如设置最大导出数量或者提供导出当前页导出全部数据的选项供用户选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端程序员_花姐夫Jun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值