经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
如何使用vue实现前端导入excel数据
来源:jb51  时间:2023/4/26 8:50:07  对本文有异议

前言

继前边的vue的导出功能后,自己又去在网上搜了vue导入excel一些文章,自己通过对代码的整理和调整,实现了vue导入excel的功能。

一、主界面先引入导入组件

1.这段主要是中间的那段excel-import标签的那部分代码,loadList是后边导入成功后,子组件要调用的方法,这个方法是导入成功后,刷新表格数据的

  1. <a-space class="crud-buttons">
  2. <a-button @click="handleEdit" type="primary">
  3. <a-icon type="edit"></a-icon>
  4. 修改
  5. </a-button>
  6. <excel-import @fatherMethod="loadList"></excel-import>
  7. <a-button @click="exportData" type="danger" :loading="btnLoading"> <a-icon type="upload" />导出</a-button>
  8. <a-button type="primary" @click="grantWelfare">
  9. <a-icon type="plus"></a-icon>
  10. 发放
  11. </a-button>
  12. </a-space>

路径根据你们的要求自行修改

  1. import excelImport from "../../components/excel-import"

二、封装excel-import组件

1.首先是template代码(这里用的是ant vue desgin框架的组件)

  1. <template>
  2. <div class="import">
  3. <a-button @click="exportData" type="primary"><a-icon type="import" />导入</a-button>
  4. <a-modal v-model="visible" title="导入数据" @ok="handleOk" @cancel="handleCancel" width="400px">
  5. <a-upload-dragger :file-list="fileList" :multiple="false"
  6. :before-upload="beforeUpload" :remove="removeFile">
  7. <p class="ant-upload-drag-icon">
  8. <a-icon type="inbox"/>
  9. </p>
  10. <p class="ant-upload-hint">
  11. 仅允许导入xls、xlsx格式文件
  12. </p>
  13. </a-upload-dragger>
  14. </a-modal>
  15. </div>
  16. </template>

2.引入接口

  1. import WelfareApi from '@/api/master/welfare'

3.js代码methods

  1. exportData(){
  2. this.visible=true
  3. },
  4. async handleOk(){
  5. if (this.data.length === 0) {
  6. this.$message.error("请选择要上传的文件")
  7. } else {
  8. const data=await WelfareApi.importExcelData(this.data)
  9. this.$message.success(data.message)
  10. this.visible=false;
  11. this.fileList=[]
  12. this.$emit('fatherMethod');
  13. }
  14. },
  15. handleCancel(){
  16. this.fileList=[]
  17. this.visible=false
  18. },
  19. // 文件上传前的钩子
  20. beforeUpload(file) {
  21. const isXslx =
  22. file.type ===
  23. "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" || file.type === "application/vnd.ms-excel";
  24. const isLt2M = file.size / 1024 / 1024 < 2;
  25. if (!isXslx) {
  26. this.$message.error("附件格式错误,请删除后重新上传!");
  27. }
  28. if (isXslx) {
  29. if (this.fileList.length == 0) {
  30. this.fileList = [...this.fileList, file]
  31. this.importfxx(this.fileList);
  32. } else {
  33. this.$message.error("仅能选择一个文件进行上传!")
  34. }
  35. }
  36. if (!isLt2M) {
  37. this.$message.error("上传文件大小不能超过 2MB!");
  38. }
  39. return false
  40. },
  41. removeFile(file) {
  42. const index = this.fileList.indexOf(file);
  43. const newFileList = this.fileList.slice();
  44. newFileList.splice(index, 1);
  45. this.fileList = newFileList;
  46. },
  47. importfxx(obj) {
  48. let _this = this;
  49. let inputDOM = this.$refs.inputer;
  50. // 通过DOM取文件数据
  51. this.file = event.currentTarget.files[0];
  52. let rABS = false; //是否将文件读取为二进制字符串
  53. let f = this.file;
  54. let reader = new FileReader();
  55. FileReader.prototype.readAsBinaryString = function (f) {
  56. let binary = "";
  57. let rABS = false; //是否将文件读取为二进制字符串
  58. let pt = this;
  59. let wb; //读取完成的数据
  60. let outdata;
  61. let reader = new FileReader();
  62. reader.onload = function (e) {
  63. let bytes = new Uint8Array(reader.result);
  64. let length = bytes.byteLength;
  65. for (let i = 0; i < length; i++) {
  66. binary += String.fromCharCode(bytes[i]);
  67. }
  68. //此处引入,用于解析excel
  69. let XLSX = require("xlsx");
  70. if (rABS) {
  71. wb = XLSX.read(btoa(fixdata(binary)), {
  72. //手动转化
  73. type: "base64"
  74. });
  75. } else {
  76. wb = XLSX.read(binary, {
  77. type: "binary"
  78. })
  79. }
  80. outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);
  81. //outdata就是读取的数据(不包含标题行即表头,表头会作为对象的下标)
  82. //此处可对数据进行处理
  83. let arr = [];
  84. outdata.map(v => {
  85. let obj = {}
  86. obj.id = v['序号']
  87. obj.dpStage = v['DP班号']
  88. obj.traineeName = v['学员姓名']
  89. obj.name = v['收货人姓名']
  90. obj.mobile = v['收货人电话']
  91. obj.province = v['省']
  92. obj.city = v['市']
  93. obj.district = v['区']
  94. obj.detailAddr = v['详细地址']
  95. obj.expressName = v['快递名称']
  96. obj.expressNumber = v['快递编号']
  97. obj.expressTime = v['发货时间']
  98. obj.statusName = v['状态']
  99. arr.push(obj)
  100. });
  101. _this.data=arr;
  102. _this.dalen=arr.length;
  103. return arr;
  104. };
  105. reader.readAsArrayBuffer(f);
  106. };
  107. if (rABS) {
  108. reader.readAsArrayBuffer(f);
  109. } else {
  110. reader.readAsBinaryString(f);
  111. }
  112. }

这里有几点注意的地方

在对outdata处理的时候,例如obj.id=v['序号']

这里的id就是传给后端的对象集合中对象的属性名,后端也要用对应的model接收

这里的序号就是excel表格的表头列名,一定要文字对应,不然会导入失败

三.附加提示(后端也要写的小伙伴可以参考下边建议哈)

我们传给后端的数据,应该是一个集合形式,在后端一般需要对数据进行处理,因为我们要把数据insert到我们的数据库中去,当然可能会有重复的数据(比如说导入的是用户信息,数据库里存在这个人的,你要导入的excel也存在)如果要求是修改的话,这时候就要根据的唯一标识(id,或者是电话、身份证号等等)来分情况做处理到底是新增还是修改。最后我还建议可以设置两个变量,一个来记录成功导入数据库的记录数量,一个记录覆盖(修改)记录的数量,然后返回给前端。

四.总结

以上就是今天要讲的内容,本文介绍了vue导入excel的使用,主要就是在前端把要导入的excel进行处理,最后把整理好的数据传给后端,添加进数据库中。

到此这篇关于如何使用vue实现前端导入excel数据的文章就介绍到这了,更多相关vue前端导入excel数据内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号