vue 导出表格 xlsx

① vue2

一、安装xlsx库和file-saver 

npm install xlsx

npm install file-saver

 二、编写文件位置src/utils/htmlToExcel.js

import FileSaver from "file-saver";
import XLSX from 'xlsx';

const htmlToExcel = {
    getExcel(dom,title="标题") {
        let excelTitle = title
        let wb = XLSX.utils.table_to_book(document.querySelector(dom))
        let wbout = XLSX.write(wb, { bookType: "xlsx", bookSST: true, type: "array"})
        try {
            FileSaver.saveAs(
                new Blob([wbout], { type: "application/octet-stream"}),
                excelTitle + ".xlsx"
            )
        }catch(e) {
            if (typeof console !== "undefined") console.log(e, wbout)
        }
        return wbout
    }
}

export default htmlToExcel

三、使用

<template>
  <div>
    <el-button type="primary" style="margin: 20px" @click="handerExcelFn">导出</el-button>
    <el-table :data="tableData" @selection-change="handleSelectionChange">
      <el-table-column type="selection" align="center"></el-table-column>
      <el-table-column prop="name" label="姓名" align="center"></el-table-column>
      <el-table-column prop="gender" label="性别" align="center"></el-table-column>
      <el-table-column prop="date" label="时间" align="center"></el-table-column>
      <el-table-column label="详细地址" align="center">
        <el-table-column prop="province" label="省份" align="center"></el-table-column>
        <el-table-column prop="city" label="市区" align="center"></el-table-column>
        <el-table-column prop="address" label="地址" align="center"></el-table-column>
        <el-table-column prop="zip" label="邮编" align="center"></el-table-column>
      </el-table-column>
      <el-table-column fixed="right" label="操作" align="center">
        <template>
          <el-button type="text" size="small">查看</el-button>
          <el-button type="text" size="small">编辑</el-button>
        </template>
      </el-table-column>
    </el-table>
    <el-dialog title="表格保存预览" width="70%" :visible.sync="selectDialogType">
      <el-table :data="selectData" id="selectTable" height="380px">
        <el-table-column prop="name" label="姓名" align="center"></el-table-column>
        <el-table-column prop="gender" label="性别" align="center"></el-table-column>
        <el-table-column prop="date" label="时间" align="center"></el-table-column>
        <el-table-column label="详细地址" align="center">
          <el-table-column prop="province" label="省份" align="center"></el-table-column>
          <el-table-column prop="city" label="市区" align="center"></el-table-column>
          <el-table-column prop="address" label="地址" align="center"></el-table-column>
          <el-table-column prop="zip" label="邮编" align="center"></el-table-column>
        </el-table-column>
      </el-table>
      <div slot="footer" class="dialog-footer">
          <el-button type="primary" @click="exportExcel">确定保存</el-button>
        </div>
    </el-dialog>
  </div>
</template>
<script>
import htmlToExcel from '../utils/htmlToExcel'
export default {
  data() {
    return {
      tableData: [
        {
          name: '小黑',
          gender:'男',
          date:'2024-01-01',
          province: '上海',
          city: '普陀区',
          address: '上海市普陀区金沙路 1518 弄',
          zip: '200333',
        },
        {
          name: '小白',
          gender:'男',
          date:'2024-01-01',
          province: '上海',
          city: '普陀区',
          address: '上海市普陀区金沙路 1518 弄',
          zip: '200333',
        },
        {
          name: '小绿',
          gender:'男',
          date:'2024-01-01',
          province: '上海',
          city: '普陀区',
          address: '上海市普陀区金沙路 1518 弄',
          zip: '200333',
        },
        {
          name: '小蓝',
          gender:'男',
          date:'2024-01-01',
          province: '上海',
          city: '普陀区',
          address: '上海市普陀区金沙路 1518 弄',
          zip: '200333',
        },
        {
          name: '小紫',
          gender:'男',
          date:'2024-01-01',
          province: '上海',
          city: '普陀区',
          address: '上海市普陀区金沙路 1518 弄',
          zip: '200333',
        },
      ],
      selectData: [],
      selectDialogType:false
    }
  },
  methods: {
    handerExcelFn() {
      if (this.selectData.length < 1) {
        this.$message.error('请选择要导出的内容')
        return false
      }
      this.selectDialogType = true
    },
    handleSelectionChange(val) {
      this.selectData = val
    },
    exportExcel() {
      htmlToExcel.getExcel('#selectTable', '表格数据')
    },
  },
}
</script>

② vue3

<template>
  <el-row>
    <el-col :span="24">
      <el-card>
        <el-button style="margin: 20px" type="primary" @click="toExport"
          >导出</el-button
        >
        <el-table :data="data.tableData" :stripe="true" :border="true">
          <el-table-column type="index" align="center" />
          <el-table-column prop="date" label="时间" align="center" />
          <el-table-column prop="name" label="姓名" align="center" />
          <el-table-column prop="birthday" label="生日" align="center" />
          <el-table-column prop="phone" label="手机号" align="center" />
          <el-table-column prop="mailbox" label="邮箱" align="center" />
        </el-table>
      </el-card>
    </el-col>
  </el-row>
</template>
<script setup>
import { reactive } from "vue";
const data = reactive({
  tableData: [
    {
      date: "2016-05-03",
      name: "Tom",
      birthday: "2000-01-01",
      phone: "13568925406",
      mailbox: "2514889516@qq.com",
    },
    {
      date: "2016-05-03",
      name: "Tom",
      birthday: "2000-01-01",
      phone: "13568925406",
      mailbox: "2514889516@qq.com",
    },
    {
      date: "2016-05-03",
      name: "Tom",
      birthday: "2000-01-01",
      phone: "13568925406",
      mailbox: "2514889516@qq.com",
    },
    {
      date: "2016-05-03",
      name: "Tom",
      birthday: "2000-01-01",
      phone: "13568925406",
      mailbox: "2514889516@qq.com",
    },
    {
      date: "2016-05-03",
      name: "Tom",
      birthday: "2000-01-01",
      phone: "13568925406",
      mailbox: "2514889516@qq.com",
    },
  ],
});

const toExport = () => {
  // service.question.page().then((res) => {
  //模拟请求的数据
  let res = data.tableData;
  var str = "时间,姓名,生日,手机号,邮箱";
  for (let i = 0; i < res.length; i++) {
    let data = res[i];
    str += "\n";
    str += data.date + ",";
    str += data.name + ",";
    str += data.birthday + ",";
    str += data.phone + ",";
    str += data.mailbox + ",";
  }
  var blob = new Blob([str], { type: "text/plain;charset=utf-8" });
  //解决中文乱码问题
  blob = new Blob([String.fromCharCode(0xfeff), blob], { type: blob.type });
  let object_url = window.URL.createObjectURL(blob);
  var link = document.createElement("a");
  link.href = object_url;
  link.download = "导出用户信息.xls";
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
  window.URL.revokeObjectURL(object_url);
  // }).catch((err)=>{})
};
</script>

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Vue中使用XLSX导出嵌套表格,您需要安装和导入XLSX插件。XLSX插件支持将数据导出为Excel文件。以下是一些步骤: 1. 安装XLSX插件: ``` npm install xlsx ``` 2. 在Vue组件中导入XLSX: ``` import XLSX from 'xlsx' ``` 3. 创建一个方法来导出表格: ``` exportTable() { const wb = XLSX.utils.book_new() // 创建一个名为“Sheet1”的工作表 const ws1 = XLSX.utils.json_to_sheet(this.tableData) // 创建一个名为“Sheet2”的工作表 const ws2 = XLSX.utils.json_to_sheet(this.nestedTableData) // 将工作表添加到工作簿中 XLSX.utils.book_append_sheet(wb, ws1, 'Sheet1') XLSX.utils.book_append_sheet(wb, ws2, 'Sheet2') // 将工作簿转换为二进制文件 const wbout = XLSX.write(wb, {bookType: 'xlsx', type: 'binary'}) // 下载Excel文件 saveAs(new Blob([s2ab(wbout)], {type: 'application/octet-stream'}), 'table.xlsx') } ``` 在这个例子中,我们创建了两个工作表(`ws1`和`ws2`),并将它们添加到工作簿中。我们使用`XLSX.write`方法将工作簿转换为二进制文件,然后将其下载到本地计算机。 4. 创建一个辅助函数`s2ab`,用于将字符串转换为ArrayBuffer: ``` function s2ab(s) { const buf = new ArrayBuffer(s.length) const view = new Uint8Array(buf) for (let i=0; i<s.length; i++) view[i] = s.charCodeAt(i) & 0xFF return buf } ``` 这个函数将字符串转换为ArrayBuffer,以便我们可以将其下载为Excel文件。 5. 添加一个按钮或其他触发器,以调用`exportTable`方法: ``` <button @click="exportTable">Export Table</button> ``` 以上是使用XLSX导出表格嵌套表格的基本步骤。您可以根据需要修改代码,以适应您的应用程序需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值