当前位置:首页 > VUE

vue报表导出实现

2026-01-19 00:02:24VUE

使用 vue-json-excel 插件实现导出

安装插件依赖:

npm install vue-json-excel --save

在 main.js 中注册组件:

import JsonExcel from 'vue-json-excel'
Vue.component('downloadExcel', JsonExcel)

模板中使用示例:

<download-excel
  :data="json_data"
  :fields="json_fields"
  name="导出文件名.xls">
  <button>导出Excel</button>
</download-excel>

数据格式示例:

export default {
  data() {
    return {
      json_fields: {
        '姓名': 'name',
        '年龄': 'age',
        '城市': 'city'
      },
      json_data: [
        {name: '张三', age: 28, city: '北京'},
        {name: '李四', age: 32, city: '上海'}
      ]
    }
  }
}

使用 xlsx 库实现复杂导出

安装 xlsx 库:

npm install xlsx --save

核心导出方法:

import XLSX from 'xlsx'

exportExcel() {
  const worksheet = XLSX.utils.json_to_sheet(this.tableData)
  const workbook = XLSX.utils.book_new()
  XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1')
  XLSX.writeFile(workbook, '导出数据.xlsx')
}

处理复杂表头:

const headers = [
  { header: '姓名', key: 'name', width: 20 },
  { header: '年龄', key: 'age', width: 10 }
]
const data = this.tableData.map(item => ({
  name: item.username,
  age: item.userAge
}))
const worksheet = XLSX.utils.json_to_sheet(data, { header: headers })

实现前端分页数据全量导出

获取所有数据方法:

async exportAllData() {
  const res = await api.getAllData() // 替换为实际API调用
  const worksheet = XLSX.utils.json_to_sheet(res.data)
  const workbook = XLSX.utils.book_new()
  XLSX.utils.book_append_sheet(workbook, worksheet, '全部数据')
  XLSX.writeFile(workbook, '全部数据.xlsx')
}

自定义样式和格式

使用 xlsx-style 库:

npm install xlsx-style --save

设置单元格样式示例:

import XLSX from 'xlsx-style'

const ws = XLSX.utils.json_to_sheet(data)
ws['A1'].s = {
  font: { bold: true, color: { rgb: 'FF0000' } },
  fill: { fgColor: { rgb: 'FFFF00' } }
}

服务端生成导出文件

前端请求示例:

exportExcel() {
  window.location.href = '/api/export/excel?params=' + this.queryParams
}

Node.js 服务端示例:

const excel = require('exceljs')

router.get('/export/excel', async (req, res) => {
  const workbook = new excel.Workbook()
  const worksheet = workbook.addWorksheet('报表')

  // 添加数据
  worksheet.addRows(data)

  res.setHeader(
    'Content-Type',
    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  )
  res.setHeader(
    'Content-Disposition',
    'attachment; filename=report.xlsx'
  )

  await workbook.xlsx.write(res)
  res.end()
})

大数据量分片导出

前端分片请求实现:

vue报表导出实现

async chunkedExport(total) {
  const chunkSize = 5000
  const chunks = Math.ceil(total / chunkSize)
  let allData = []

  for(let i=0; i<chunks; i++) {
    const res = await api.getData({
      page: i+1,
      size: chunkSize
    })
    allData = allData.concat(res.data)
  }

  this.exportToExcel(allData)
}

标签: 报表vue
分享给朋友:

相关文章

vue实现共享屏幕

vue实现共享屏幕

共享屏幕的基本实现 在Vue中实现共享屏幕功能通常需要结合浏览器的getDisplayMedia API。以下是一个基础实现示例: <template> <div>…

vue 实现jqslidedown

vue 实现jqslidedown

在 Vue 中实现类似 jQuery 的 slideDown 效果,可以通过 Vue 的过渡系统或 CSS 动画结合动态样式绑定来实现。以下是几种实现方式: 使用 Vue Transition 组件…

vue tag实现

vue tag实现

Vue 标签实现方法 在 Vue 中实现标签功能可以通过多种方式完成,常见场景包括动态标签生成、标签输入框、标签管理等。以下是几种典型实现方案: 动态标签列表渲染 使用 v-for 指令渲染标签数组…

vue实现抖动

vue实现抖动

Vue 实现抖动效果 在 Vue 中实现抖动效果可以通过 CSS 动画或 JavaScript 动画库来实现。以下是几种常见的方法: 使用 CSS 动画 通过定义 @keyframes 动画并在 V…

vue实现treeselect

vue实现treeselect

Vue TreeSelect 实现方法 使用 Vue 实现 TreeSelect 组件可以通过以下几种方式完成,包括使用现成的第三方库或自行封装组件。 使用第三方库 推荐使用成熟的第三方 TreeS…

vue实现双向

vue实现双向

Vue 实现双向绑定的方法 Vue 的双向绑定主要通过 v-model 指令实现,它结合了数据绑定和事件监听,适用于表单元素(如 input、select、textarea 等)。以下是几种常见的实现…