Vue3+XLSX+FileSaver导出导入功能

一、创建一个VUE项目

项目环境版本:

npm 8.5.5

node 16.15.0

vue-cli 4

 引入相关的依赖

npm install --save

 引入Element-plus和XLSX和File-saver相关的依赖

npm install element-plus

npm install xlsx

npm install file-saver

 

查看package.json

{
  "name": "xlsx-demo",
  "private": true,
  "version": "0.0.0",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "element-plus": "^2.2.12",
    "file-saver": "^2.0.2",
    "vue": "^3.2.25",
    "xlsx": "^0.16.0"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^2.3.3",
    "vite": "^2.9.9"
  }
}

二、写一个table表格文件  并为表格填充对应的值

<template>
  <div>
    <el-table :data="tableData" border style="width: 100%">
      <el-table-column type="index" label="序号" width="180" />
      <el-table-column prop="name" label="姓名" width="180" />
      <el-table-column prop="age" label="年龄" width="180" />
      <el-table-column prop="address" label="住址" />
    </el-table>
  </div>
</template>
<script setup>
import { reactive, ref } from "vue";

let tableData = reactive([
  {
    name: "张三",
    age: 18,
    address: "贵州贵阳云岩区XXX路街道",
  },
  {
    name: "张三222",
    age: 18,
    address: "贵州贵阳云岩区XXX路街道",
  },
  {
    name: "张三333",
    age: 18,
    address: "贵州贵阳云岩区XXX路街道",
  },
  {
    name: "张三444",
    age: 18,
    address: "贵州贵阳云岩区XXX路街道",
  },
  {
    name: "张三555",
    age: 18,
    address: "贵州贵阳云岩区XXX路街道",
  },
  {
    name: "张三666",
    age: 18,
    address: "贵州贵阳云岩区XXX路街道",
  },
  {
    name: "张三777",
    age: 18,
    address: "贵州贵阳云岩区XXX路街道",
  },
  {
    name: "张三888",
    age: 18,
    address: "贵州贵阳云岩区XXX路街道",
  },
  {
    name: "张三999",
    age: 18,
    address: "贵州贵阳云岩区XXX路街道",
  },
  {
    name: "张三000",
    age: 18,
    address: "贵州贵阳云岩区XXX路街道",
  },
]);
</script>
<style></style>

在APP中引入组件

<template>
  <div style="width: 1200px; margin: 50px auto">
    <el-button type="success">导出</el-button>
    <Table />
  </div>
</template>
<script setup>
import Table from "./components/Table.vue";
</script>
<style></style>

示例图:

 三、完成导出导入的业务逻辑

<template>
  <div style="width: 1200px; margin: 50px auto">
    <el-button type="success" @click="exportClick">导出</el-button>
    <Table />
  </div>
</template>
<script setup>
import Table from "./components/Table.vue";
//引入XLSX
import FileSaver from "file-saver";
import XLSX from "xlsx";

import { ElMessage } from "element-plus";

const exportClick = () => {
  //时候按照表格的原样导出  不对表格数据进行处理
  let xlsxParams = { row: true };

  //根据表格导出  可以根据json数据导出 json_to_sheet
  let wb = XLSX.utils.table_to_book(
    document.querySelector("#table"),
    xlsxParams
  );

  //写入
  let wbout = XLSX.write(wb, {
    bookType: "xlsx",
    bookSST: true,
    type: "array",
  });

  try {
    FileSaver.saveAs(
      new Blob([wbout], { type: "application/octet-stream" }),
      "数据导出.xlsx"
    );
  } catch (e) {
    if (typeof consloe !== undefined) {
      ElMessage.error({
        message: e.wbout,
        type: "error",
      });
    }
  }
  return wbout;
};
</script>

数据导出完成  示意图如下:

 四、数据导入功能

需要使用上传组件 需要引入icon字体图片

npm install @element-plus/icons-vue

编写导入功能代码

<template>
  <div style="width: 1200px; margin: 50px auto">
    <el-button type="success" @click="exportClick">导出</el-button>
    <el-button type="primary" @click="importClick">导入</el-button>
    <Table />

    <!-- 数据上传的功能 -->
    <el-dialog v-model="dialogFormVisible" title="数据导入">
      <el-upload
        class="upload-demo"
        drag
        action="/"
        :auto-upload="false"
        :on-change="handleSuccess"
      >
        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
        <div class="el-upload__text">将文件点击或者拖拽 <em>上传</em></div>
      </el-upload>
    </el-dialog>
  </div>
</template>
<script setup>
import { reactive, ref } from "vue";
import Table from "./components/Table.vue";
//引入XLSX
import FileSaver from "file-saver";
import XLSX from "xlsx";

import { ElMessage } from "element-plus";
import { UploadFilled } from "@element-plus/icons-vue";

//数据导出
const exportClick = () => {
  //时候按照表格的原样导出  不对表格数据进行处理
  let xlsxParams = { row: true };

  //根据表格导出  可以根据json数据导出 json_to_sheet
  let wb = XLSX.utils.table_to_book(
    document.querySelector("#table"),
    xlsxParams
  );

  //写入
  let wbout = XLSX.write(wb, {
    bookType: "xlsx",
    bookSST: true,
    type: "array",
  });

  try {
    FileSaver.saveAs(
      new Blob([wbout], { type: "application/octet-stream" }),
      "数据导出.xlsx"
    );
  } catch (e) {
    if (typeof consloe !== undefined) {
      ElMessage.error({
        message: e.wbout,
        type: "error",
      });
    }
  }
  return wbout;
};

//数据导入
let dialogFormVisible = ref(false);
const importClick = () => {
  dialogFormVisible.value = !dialogFormVisible.value;
};

//文件上传成功
let tabelData = reactive([]);
let fileData = ref("");
function handleSuccess(file) {
  fileData = file;
  readExcel();
}

function readExcel() {
  const files = fileData;
  if (!files) {
    // 没有文件
    return false;
  } else if (!/\.(xls|xlsx)$/.test(files.name.toLowerCase())) {
    Error("请上传xls或者xlsx文件");
    return false;
  }
  const fileReader = new FileReader();
  fileReader.onload = (e) => {
    try {
      const data = e.target.result;
      const workbook = XLSX.read(data, {
        type: "binary",
      });
      if (workbook.SheetNames.length >= 1) {
        ElMessage.success("导入成功");
      }
      // 取第一张表
      const wsname = workbook.SheetNames[0];
      // 生成json表格内容
      const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname]);
      console.log(ws);
      batcnUserList.length = 0;
      batchLength.value = ws.length;
      ws.map((item) => {
        batcnUserList.push(item);
      });
    } catch (e) {
      return false;
    }
  };
  fileReader.readAsBinaryString(files.raw);
}
</script>

 导入功能完成 示例图如下

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要在Vue 2.x中使用Element UI来导入导出Excel,你需要安装element-ui和file-saver插件。 首先,在Vue项目中使用npm或yarn安装Element UI和file-saver插件: ``` npm install element-ui file-saver --save ``` 然后,在Vue组件中引入所需的文件: ```javascript import { Button, Table } from 'element-ui' import XLSX from 'xlsx' import FileSaver from 'file-saver' ``` 在组件中,你需要定义导入导出Excel的方法。下面是一个简单的示例: ```javascript methods: { // 导入Excel handleImportExcel(file) { const reader = new FileReader() reader.onload = (e) => { const data = new Uint8Array(e.target.result) const workbook = XLSX.read(data, { type: 'array' }) const worksheet = workbook.Sheets[workbook.SheetNames[0]] const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 }) // 处理导入的Excel数据 console.log(jsonData) } reader.readAsArrayBuffer(file.raw) }, // 导出Excel handleExportExcel() { const jsonData = [ ['姓名', '年龄', '性别'], ['张三', 18, '男'], ['李四', 20, '女'] ] const worksheet = XLSX.utils.aoa_to_sheet(jsonData) const workbook = XLSX.utils.book_new() XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1') const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }) const excelData = new Blob([excelBuffer], { type: 'application/octet-stream' }) FileSaver.saveAs(excelData, 'example.xlsx') } } ``` 最后,在模板中使用Element UI的Button和Table组件,分别绑定导入导出Excel的方法: ```html <template> <div> <el-button type="primary" @change="handleImportExcel">导入Excel</el-button> <el-table :data="tableData"> <!-- 表格内容 --> </el-table> <el-button type="success" @click="handleExportExcel">导出Excel</el-button> </div> </template> ``` 这样,你就可以在Vue项目中使用Element UI来导入导出Excel了。当用户选择一个Excel文件时,`handleImportExcel`方法将会被触发,并将Excel数据转换为JSON数据进行处理。而`handleExportExcel`方法则会将JSON数据转换为Excel文件并进行下载。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

菜鸟学习JAVA开发

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

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

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

打赏作者

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

抵扣说明:

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

余额充值