Vue中如何导入并读取Excel数据

本文详细介绍如何在前端实现Excel文件的导入和数据读取,包括依赖安装、代码实现及数据处理方法,适用于Vue项目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上一篇文章中我们完成了对excel的导出操作(链接:https://blog.csdn.net/a736755244/article/details/99426520),那么如何导入excel并读取其中的数据呢?


一、导入并读取Excel功能从整体上来说两种方式,一是前端解析文件后将数据返回给后端,另一种是前端直接将Excel文档返回后台,由后台进行处理。使用哪种方法需要根据具体业务需求,下面简单介绍第一种方法:由前端解析数据

1、引入依赖

 npm install -S file-saver xlsx

 npm install -D script-loader

 npm install xlsx

2、在main.js中引入XLSX

import XLSX from 'xlsx'
Vue.use(XLSX)

3、前面环境和依赖完成之后,我们开始创建Import.vue页面,放一个button上传按钮。

各参数说明可参考官方文档:https://www.jianshu.com/p/84b727a4b58a

  <!--limit:最大上传数,on-exceed:超过最大上传数量时的操作  -->
    <el-upload
        class="upload-demo"
        action=""
        :on-change="handleChange"
        :on-remove="handleRemove"
        :on-exceed="handleExceed"
        :limit="limitUpload"
        accept="application/vnd.openxmlformats-    
        officedocument.spreadsheetml.sheet,application/vnd.ms-excel"
        :auto-upload="false">
    <el-button size="small" type="primary">点击上传</el-button>
    </el-upload>

4、定义所需要的方法,代码如下(为了美观,加入了一些提示语和提示框)

        //上传文件时处理方法  
        handleChange(file, fileList){
            this.fileTemp = file.raw;
            if(this.fileTemp){
                if((this.fileTemp.type == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') 
                    || (this.fileTemp.type == 'application/vnd.ms-excel')){
                    this.importfxx(this.fileTemp);
                } else {
                    this.$message({
                        type:'warning',
                        message:'附件格式错误,请删除后重新上传!'
                    })
                }
            } else {
                this.$message({
                    type:'warning',
                    message:'请上传附件!'
                })
            }
        },
        //超出最大上传文件数量时的处理方法
        handleExceed(){
            this.$message({
                type:'warning',
                message:'超出最大上传文件数量的限制!'
            })
            return;
        },
        //移除文件的操作方法
        handleRemove(file,fileList){
            this.fileTemp = null
        },

最重要的读取excel文件的方法:

         importfxx(obj) {
            let _this = this;
            let inputDOM = this.$refs.inputer;
            // 通过DOM取文件数据

            this.file = event.currentTarget.files[0];

            var rABS = false; //是否将文件读取为二进制字符串
            var f = this.file;

            var reader = new FileReader();
            //if (!FileReader.prototype.readAsBinaryString) {
            FileReader.prototype.readAsBinaryString = function(f) {
                var binary = "";
                var rABS = false; //是否将文件读取为二进制字符串
                var pt = this;
                var wb; //读取完成的数据
                var outdata;
                var reader = new FileReader();
                reader.onload = function(e) {
                    var bytes = new Uint8Array(reader.result);
                    var length = bytes.byteLength;
                    for (var i = 0; i < length; i++) {
                        binary += String.fromCharCode(bytes[i]);
                    }
                    //此处引入,用于解析excel
                    var XLSX = require("xlsx");
                    if (rABS) {
                        wb = XLSX.read(btoa(fixdata(binary)), {
                        //手动转化
                        type: "base64"
                        });
                    } else {
                        wb = XLSX.read(binary, {
                        type: "binary"
                        });
                    }
                    outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]); 
                    //outdata就是读取的数据(不包含标题行即表头,表头会作为对象的下标)
                    //此处可对数据进行处理
                    // let arr = [];
                    // outdata.map(v => {
                    //     let obj = {}
                    //     obj.code = v['Code']
                    //     obj.name = v['Name']
                    //     obj.pro = v['province']
                    //     obj.cit = v['city']
                    //     obj.dis = v['district']
                    //     arr.push(obj)
                    // });
                    // _this.da=arr;
                    // _this.dalen=arr.length;
                    return arr;
                };
                reader.readAsArrayBuffer(f);
            };
            if (rABS) {
                reader.readAsArrayBuffer(f);
            } else {
                reader.readAsBinaryString(f);
            }
        }

5、获取的数据及展示如下:

6、相关代码已经上传Github,地址如下:
https://github.com/736755244/Import

二、由于大家使用的后台框架多种多样,此处不对第二种方法做举例说明,有时间会逐渐完善此种方法


欢迎交流学习,有问题欢迎留言探讨。


 

### 在 Vue3 中实现导入 Excel 表格数据 要在 Vue3 项目中实现导入 Excel 功能,可以借助第三方库 `xlsx` 或者基于此库封装的工具来完成。以下是详细的解决方案: #### 使用 xlsx 库解析 Excel 数据 `xlsx` 是一个强大的 JavaScript 库,用于读取和写入 Excel 文件。它支持多种文件格式(如 `.xls`, `.xlsx`),且可以在浏览器环境中运行。 安装依赖: ```bash npm install xlsx ``` 创建一个方法用来解析上传的 Excel 文件: ```javascript import XLSX from 'xlsx'; function handleFileUpload(event) { const file = event.target.files[0]; if (!file) return; const reader = new FileReader(); reader.onload = function(e) { const data = new Uint8Array(e.target.result); const workbook = XLSX.read(data, { type: 'array' }); // 获取第一个工作表名称 const sheetName = workbook.SheetNames[0]; // 将工作表转换为 JSON 格式的数据 const worksheet = workbook.Sheets[sheetName]; const jsonData = XLSX.utils.sheet_to_json(worksheet); console.log('Parsed Data:', jsonData); // 输出解析后的数据 }; reader.readAsArrayBuffer(file); } ``` 上述代码通过监听文件输入事件获取用户上传的文件,利用 `FileReader` 和 `xlsx` 解析其内容[^2]。 #### 结合 Element Plus 的文件上传组件 如果希望提供更友好的用户体验,可以结合 Element Plus 提供的 `<el-upload>` 组件简化文件选择流程。以下是一个完整的示例: HTML 部分: ```html <template> <div> <el-upload class="upload-demo" :auto-upload="false" accept=".xlsx,.xls" @change="handleFileChange"> <el-button>点击上传</el-button> </el-upload> <!-- 展示解析后的表格 --> <el-table v-if="parsedData.length > 0" :data="parsedData" style="width: 100%"> <el-table-column prop="date" label="日期"></el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="address" label="地址"></el-table-column> </el-table> </div> </template> ``` JavaScript 部分: ```javascript <script setup> import { ref } from 'vue'; import XLSX from 'xlsx'; import { ElMessage } from 'element-plus'; // 可选:提示消息框 const parsedData = ref([]); function handleFileChange(event) { const file = event.raw; if (file.type !== 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' && file.type !== 'application/vnd.ms-excel') { ElMessage.error('仅支持 .xlsx 和 .xls 文件'); return; } const reader = new FileReader(); reader.onload = function(e) { const data = new Uint8Array(e.target.result); const workbook = XLSX.read(data, { type: 'array' }); const sheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[sheetName]; const jsonData = XLSX.utils.sheet_to_json(worksheet); parsedData.value = jsonData; // 更新响应式变量 }; reader.readAsArrayBuffer(file); } </script> ``` 以上代码实现了从本地加载 Excel 文件将其内容展示在一个表格中的功能。 #### 注意事项 - 如果 Excel 文件结构复杂或者存在多个 Sheet,则需要额外逻辑遍历所有 Sheet 提取所需数据。 - 对于大数据量的情况,建议优化内存管理以防止性能瓶颈。 - 用户界面应清晰说明支持的文件类型以及可能存在的限制条件。 --- ###
评论 51
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值