vue-json数据导出Excel

1、安装依赖

npm i -S file-saver
npm i -S xlsx

2、在src目录下新建excel文件夹,新建file.js,并引入依赖

import { saveAs } from 'file-saver'
import XLSX from 'xlsx/dist/xlsx.full.min'

或者如下引入:

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

3、创建file.js文件内容

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

/**
 * fn 字符串转字符流
 * @param s
 * @returns {ArrayBuffer}
 */
function datenum (v, date1904) {
  if (date1904) v += 1462
  let epoch = Date.parse(v)
  return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000)
}
function s2ab (s) {
  let buf = new ArrayBuffer(s.length)
  let view = new Uint8Array(buf)
  for (let i = 0; i !== s.length; ++i) {
    view[i] = s.charCodeAt(i) & 0xFF
  }
  return buf
}

function data2ws (data) {
  const ws = {}
  const range = {s: {c: 10000000, r: 10000000}, e: {c: 0, r: 0}}
  for (let R = 0; R !== data.length; ++R) {
    for (let C = 0; C !== data[R].length; ++C) {
      if (range.s.r > R) range.s.r = R
      if (range.s.c > C) range.s.c = C
      if (range.e.r < R) range.e.r = R
      if (range.e.c < C) range.e.c = C
      const cell = { v: data[R][C] }
      if (cell.v == null) continue
      const cellRef = XLSX.utils.encode_cell({c: C, r: R})
      if (typeof cell.v === 'number') cell.t = 'n'
      else if (typeof cell.v === 'boolean') cell.t = 'b'
      else if (cell.v instanceof Date) {
        cell.t = 'n'
        cell.z = XLSX.SSF._table[14]
        cell.v = datenum(cell.v)
      } else {
        cell.t = 's'
      }
      ws[cellRef] = cell
    }
  }
  if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range)
  return ws
}

function Workbook () {
  if (!(this instanceof Workbook)) {
    return new Workbook()
  }
  this.SheetNames = []
  this.Sheets = {}
}

export function toExcel ({th, data, fileName, fileType, sheetName}) {
  /*
  * th => 表头
  * data => 数据
  * fileName => 文件名
  * fileType => 文件类型
  * sheetName => sheet页名
  */
  data.unshift(th)
  const wb = new Workbook()
  const ws = data2ws(data)
  sheetName = sheetName || 'sheet1'
  wb.SheetNames.push(sheetName)
  wb.Sheets[sheetName] = ws
  fileType = fileType || 'xlsx'
  var wbout = XLSX.write(wb, {bookType: fileType, bookSST: false, type: 'binary'})
  fileName = fileName || '列表'
  saveAs(new Blob([s2ab(wbout)], {type: 'application/octet-stream'}), `${fileName}.${fileType}`)
}

4、在组件中引入file.js

import toExcel from '@/excel/file'

5、在组件中调用toExcel方法导出excel

<template>
  <div>
    <el-button @click="loadExcel()">下载excel文件</el-button>
  </div>
</template>

<script>
import { toExcel } from '@/assets/js/file'
export default {
  data () {
    return {
      excelData: [
        {
          name: '张三',
          birthday: new Date('1990-01-01'),
          sex: '男',
          age: 28
        },
        {
          name: '李四',
          birthday: new Date('1991-01-01'),
          sex: '女',
          age: 27
        }
      ]
    }
  },
  methods: {
    loadExcel () {
      const th = ['姓名', '生日', '性别', '年龄']
      const filterVal = ['name', 'birthday', 'sex', 'age']
      const data = this.excelData.map(v => filterVal.map(k => v[k]))
      const [fileName, fileType, sheetName] = ['测试下载', 'xlsx', '测试页']
      console.log(th, data, fileName, fileType, sheetName)
      toExcel({th, data, fileName, fileType, sheetName})
    }
  }
}
</script>

github项目地址:https://github.com/xiaoaiai/vue-xlsx-test

拓展:

动态设置表头及过滤json数据项

原网址为:https://blog.csdn.net/qq_40099900/article/details/80931319

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是使用vue-json-excel导出xlsx的步骤: 1.首先,安装vue-json-excel依赖包: ```shell npm install vue-json-excel --save ``` 2.在main.js引入vue-json-excel并注册为全局组件: ```javascript import Vue from 'vue' import App from './App.vue' import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; import JsonExcel from "vue-json-excel"; // 引入vue-json-excel Vue.component("downloadExcel", JsonExcel); // 注册为全局组件 Vue.use(ElementUI); new Vue({ render: h => h(App), }).$mount('#app') ``` 3.在需要导出Excel的组件,使用downloadExcel组件并传入数据和表头信息: ```html <template> <div> <download-excel :data="tableData" :columns="tableColumns" :filename="'excel文件名'" :sheetname="'sheet名称'" :title="'表格标题'" :autoWidth="true" :mergeCell="[]" > <el-button type="primary">导出Excel</el-button> </download-excel> </div> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 18, gender: '男' }, { name: '李四', age: 20, gender: '女' }, { name: '王五', age: 22, gender: '男' } ], tableColumns: [ { label: '姓名', field: 'name' }, { label: '年龄', field: 'age' }, { label: '性别', field: 'gender' } ] } } } </script> ``` 其,data为需要导出数据,columns为表头信息,filename为导出Excel文件名,sheetname为sheet名称,title为表格标题,autoWidth为是否自动调整列宽,mergeCell为需要合并的单元格信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值