vue 导入excel并转为json发送给后端

这篇具有很好参考价值的文章主要介绍了vue 导入excel并转为json发送给后端。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

vue 导入excel并转为json发送给后端

可以处理.xlsx , .csv , .xls 格式的文件

  1. 安装插件
# 用于操作excel .xlsx  .xls
npm install xlsx --save    

# papaparse用于操作.csv 文件 jschardet编码解析
npm install papaparse --save   
npm install jschardet --save    
  1. 完整代码
<template>
<div>
  <!-- 1. 上传 导入 -->
  <el-upload action accept=".xlsx,.csv,.xls" :auto-upload="false" :on-change="handleImportFile" :show-file-list="false">
    <el-button icon="el-icon-upload2">导入</el-button>
  </el-upload>
</div>
</template>

<script>
// 2. 引入插件
// import xlsx from "xlsx";  // 使用这种方式引入时报错了
import * as xlsx from "xlsx";
import Papa from "papaparse";

export default {
  data() {
    return {
      // 3.添加属性
      changeCnToEn: {
        姓名: "name",
        年龄: 'age'

      },
    };
  },

  method: {
    // 4. 处理选择文件回调
    async handleImportFile() {
      // 获取文件类型
      const fileType = e.name.split(".")[e.name.split(".").length - 1];
      let excelArr = "";
      switch (fileType) {
        case "csv":
          excelArr = await this.importCsv(e.raw);
          break;
        case "CSV":
          excelArr = await this.importCsv(e.raw);
          break;
        case "xlsx":
          excelArr = await this.importXls(e.raw);
          break;
        case "xls":
          excelArr = await this.importXls(e.raw);
          break;
      }

      console.log(excelArr); // 数组对象 就是Excel里的数据
      setTimeout(() => {
        // 发给后端
        // this.httpUpload(excelArr);
      }, 500);
    },

     // 7.  请求后端接口
    httpUpload(excelArr) {
      const params = {
        xxx: excelArr, // 表格数据
      }
      request({
        url: '',
        method: 'post',
        params: leadData
      }).then(res => {
        console.log(res, 'res');
      })
    },


    // 5. 解析excel为JSON 
    // 上传xlsx xls文件
    async importXls(file) {
      if (!file) return;
      let data = await this.readFile(file);
      // type :'binary' 类型为二进制
      let eleData = xlsx.read(data, {
        type: "binary"
      });
      let eleDataSheet = eleData.Sheets[eleData.SheetNames[0]];
      eleData = xlsx.utils.sheet_to_json(eleDataSheet); // 将解析出的数据转换为json格式(xlsx自带的方法)
      // eleData = eleData.length >1? eleData[1] : eleData[0]
      const arr = [];
      console.log(Object.keys(this.changeCnToEn));
      eleData.forEach((item) => {
        const userInfo = {};
        Object.keys(item).forEach((key) => {
          userInfo[this.changeCnToEn[key]] = item[key];
        });
        arr.push(userInfo);
      });
      return arr;
    },

    
    // 把文件按照二进制方式读取
    readFile(file) {
      return new Promise((resolve) => {
        let reader = new FileReader();
        reader.readAsBinaryString(file);
        reader.onload = (ev) => {
          resolve(ev.target.result);
        };
      });
    },

    // 6. 解析csv文件为JSON
    // 上传文件解析csv
    async importCsv(file) {
      return new Promise((resolve) => {
        let fReader = new FileReader();
        fReader.readAsDataURL(file);
        fReader.onload = (evt) => {
          // 检查编码
          let encoding = this.checkEncoding(evt.target.result);
          // 将csv转换成二维数组
          Papa.parse(file, {
            encoding,
            complete: (res) => {
              // UTF8 \r\n与\n混用时有可能会出问题
              let data = res.data;
              if (data[data.length - 1] == "") {
                //去除最后的空行
                data.pop();
              }
              const dataKeys = Object.values(this.changeCnToEn);
              let resArr = [];
              data.forEach((element, index) => {
                const resInfo = {};
                if (index > 0) {
                  dataKeys.forEach((item, j) => {
                    resInfo[item] = element[j];
                  });
                  resArr.push(resInfo);
                }
              });
              console.log(resArr);
              // console.log(data)
              resolve(resArr);
            },
          });
        };
      });
    },
    // 编码转换
    checkEncoding(base64Str) {
      // 这种方式得到的是一种二进制串
      let str = atob(base64Str.split(";base64,")[1]);
      // 要用二进制格式
      const jschardet = require("jschardet");
      let encoding = jschardet.detect(str);
      encoding = encoding.encoding;
      if (encoding === "windows-1252") {
        encoding = "ANSI";
      }
      return encoding;
    },

  }

};
</script>


抽取工具类文章来源地址https://www.toymoban.com/news/detail-643255.html

  • excelUtil.js
import * as xlsx from "xlsx";
import Papa from "papaparse";

// 使用:
/**
const excelArr = await xlsxToJson(file.raw);
const excelArr = await csvToJson(file.raw);
console.log(excelArr); // 数组对象 就是Excel里的数据
 */


/**
 * 将xlsx, xls格式excel文件转为json数据
 * @param {*} file excel文件
 * @param {*} tableHeadCnToEn excel表头文字和字段的对应  示例: { 姓名: 'name', 年龄: 'age'  }
 * @returns 
 */
export async function xlsxToJson(file, tableHeadCnToEn) {
  if (!file) return;
  // 读取file文件的内容(转换为json格式)
  let data = await readFile(file);
  // console.log(data); //解析出的二进制文件
  // type :'binary' 类型为二进制
  let eleData = xlsx.read(data, { type: "binary" });
  let eleDataSheet = eleData.Sheets[eleData.SheetNames[0]];
  eleData = xlsx.utils.sheet_to_json(eleDataSheet); // 将解析出的数据转换为json格式(xlsx自带的方法)
  const arr = [];
  eleData.forEach((item) => {
    const userInfo = {};
    Object.keys(item).forEach((key) => {
      userInfo[tableHeadCnToEn[key]] = item[key];
    });
    arr.push(userInfo);
  });
  return arr;
}

/**
 * 将csv格式excel文件转为json数据
 * @param {*} file excel文件
 * @param {*} tableHeadCnToEn excel表头文字和字段的对应  示例: { 姓名: 'name', 年龄: 'age'  }
 * @returns 
 */
export async function csvToJson(file, tableHeadCnToEn) {
  return new Promise((resolve) => {
    let fReader = new FileReader();
    fReader.readAsDataURL(file);
    fReader.onload = (evt) => {
      // 检查编码
      let encoding = checkEncoding(evt.target.result);
      // 将csv转换成二维数组
      Papa.parse(file, {
        encoding,
        complete: (res) => {
          // UTF8 \r\n与\n混用时有可能会出问题
          let data = res.data;
          if (data[data.length - 1] == "") {
            //去除最后的空行
            data.pop();
          }
          const dataKeys = Object.values(tableHeadCnToEn);
          let resArr = [];
          data.forEach((element, index) => {
            const resInfo = {};
            if (index > 0) {
              dataKeys.forEach((item, j) => {
                resInfo[item] = element[j];
              });
              resArr.push(resInfo);
            }
          });
          resolve(resArr);
        },
      });
    };
  });
}

// 把文件按照二进制方式读取
function readFile(file) {
  return new Promise((resolve) => {
    let reader = new FileReader();
    reader.readAsBinaryString(file);
    reader.onload = (ev) => {
      resolve(ev.target.result);
    };
  });
}

// 编码转换
function checkEncoding(base64Str) {
  // 这种方式得到的是一种二进制串
  let str = atob(base64Str.split(";base64,")[1]);
  // 要用二进制格式
  const jschardet = require("jschardet");
  let encoding = jschardet.detect(str);
  encoding = encoding.encoding;
  if (encoding === "windows-1252") {
    encoding = "ANSI";
  }
  return encoding;
}
  • 使用工具类方式 实现excel文件转json, 完整代码
<template>
<div>
  <!-- 1. 上传 导入 -->
  <el-upload action accept=".xlsx,.csv,.xls" :auto-upload="false" :on-change="handleImportFile" :show-file-list="false">
    <el-button icon="el-icon-upload2">导入</el-button>
  </el-upload>
</div>
</template>

<script>
import { xlsxToJson, csvToJson } from "@/utils/excelUtil.js";
export default {
  data() {
    return {
      // 3.添加属性
      changeCnToEn: {
        姓名: "name",
        年龄: 'age'

      },
    };
  },

  method: {
    // 4. 处理选择文件回调
    async handleImportFile() {
      // 获取文件类型
     const fileType = e.name.split(".")[e.name.split(".").length - 1];
      let excelArr = "";
      switch (fileType) {
        case "csv":
          excelArr = await csvToJson(e.raw, this.changeCnToEn);
          break;
        case "CSV":
          excelArr = await csvToJson(e.raw, this.changeCnToEn);
          break;
        case "xlsx":
          excelArr = await xlsxToJson(e.raw, this.changeCnToEn);
          break;
        case "xls":
          excelArr = await xlsxToJson(e.raw, this.changeCnToEn);
          break;
      }

      console.log(excelArr); // 数组对象 就是Excel里的数据
      setTimeout(() => {
        // 发给后端
        // this.httpUpload(excelArr);
      }, 500);
    },

     // 7.  请求后端接口
    httpUpload(excelArr) {
      const params = {
        xxx: excelArr, // 表格数据
      }
      request({
        url: '',
        method: 'post',
        params: leadData
      }).then(res => {
        console.log(res, 'res');
      })
    },
  }

};
</script>

到了这里,关于vue 导入excel并转为json发送给后端的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Excel 导入导出(前端处理:xslx)(后端处理:hutool+poi || Easy Excel )

      目录 Excel 导入导出(前端处理:xslx) 代码示例 导入Excel数据 将数据封装好后传给后端  导出数据 预览(vue-office/excel\\\"……;docx-preview) Excel 导入导出(后端处理:hutool+poi || Easy Excel ) 前端 后端使用Hutool处理Excel 文件 Hutool-poi是针对Apache POI的封装,因此需要用户自行引入

    2024年01月24日
    浏览(39)
  • 如何解决前端传递数据给后端时精度丢失问题

    有时候我们在进行修改操作时,发现修改既不报错也不生效。我们进行排查后发现服务器端将数据返回给前端时没有出错,但是前端js将数据进行处理时却出错了,因为id是Long类型的,而js在处理后端返回给前端的Long类型数据时只能处理前16位,后3位进行了四舍五入操作,例

    2024年02月09日
    浏览(31)
  • vue传递给后端时间格式问题

    首先前端使用moment.js进行处理 解释: @DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)设定接受前端传递过来的时间格式 @JsonFormat(timezone = “GMT+8”, pattern = “yyyy-MM-dd HH:mm:ss”)注解:把数据库中datetime的格式取出来转化为yyyy-MM-dd HH:mm:ss格式。

    2024年02月09日
    浏览(33)
  • 前端Get Post Put Delect请求 传参数 不传参数给后端

    Get请求不传参、Get请求传不是实体类的参数、Get请求传实体类的参数 Post 请求不传参数、Post请求传不是实体类的参数、Post请求传实体类的参数  总是分不清,其中Delect 请求使用的地方很少就先记录Delete请求吧 前端 前端跳后端 后端 前端 前端跳后端 后端 前端 前端跳后端 后

    2024年02月07日
    浏览(51)
  • vue使用axios发送post请求携带json body参数,后端使用@RequestBody进行接收

    最近在做自己项目中,做一个非常简单的新增用户场景,但是使用原生axios发送post请求的时候,还是踩了不少坑的。 唉,说多了都是泪,小小一个新增业务,在自己前后端一起开发的时候,硬是搞了好久。 下面就把问题总结分享下,防止后人再踩坑。 首先先看下我的接口定

    2024年02月02日
    浏览(39)
  • vue3中将后端传来的json文件转成excel下载到本地

            在浏览器中将JSON格式数据以excel文件的形式下载。该组件是基于[this thread] (https://stackoverflow.com/questions/17142427/javascript-to-export-html-table-to-excel)提出的解决方案。支持Vue3.2.25及以上版本使用 重要提示! Microsoft Excel中的额外提示         此组件中实现的方法使用H

    2024年02月15日
    浏览(30)
  • 前端vue+elementui导出复杂(单元格合并,多级表头)表格el-table转为excel导出

    需求 :前端对el-table表格导出 插件 : npm install xlsx -S npm install file-saver --save 原理 :直接导出el-table的表格里面的数据,这样就会存在缺点,只会导出当前页面的数据,如果需要导出全部数据,可以自己重新渲染一个全部数据不可见的el-table表格,来导出就可以了 扩展 :经过

    2024年02月04日
    浏览(54)
  • Go语言项目后端使用gin框架接收前端发送的三种格式数据(form-data,json,Params)

    使用gin框架的BindJSON方法,将前端的json格式数据将后端的结构体相绑定,从而获取到前端所发送的数据,并返回给前端 1.将前端发送过来的数据全部返回 2.将前端发送过来的json格式数据选择性返回   使用gin框架的PostForm方法,从而获取到前端form格式的参数 使用gin框架中的

    2024年02月01日
    浏览(36)
  • Vue前端实现excel的导入、导出、打印功能

    导入导出依赖: npm install xlsx@0.16.9 npm install xlsx-style@0.8.13 --save 安装xlsx-style,运行报错 This relative module was not found: ./cptable in ./node_modules/xlsx-style@0.8.13@xlsx-style/dist/cpexcel.js 解决报错 在node_modulesxlsx-styledistcpexcel.js 807行 的 var cpt = require(\\\'./cpt\\\' + \\\'able\\\'); 改为: var cpt = cptable; 打印

    2023年04月08日
    浏览(34)
  • JSON串转为excel

    2024年02月16日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包