Vue使用el-upload解析excel文件以表格形式显示;txt文件以文档形式显示

el-upload有一个on-change事件
文件状态改变时会触发该事件
文件状态改变时会触发该事件
在这里插入图片描述
代码如下:
解析excel的方法中:elTableData存放的是内容,sheetNameList 存放的是标题
解析txt的方法中:textareaData 存放的是内容

 /*
    选取文件后显示在输入框内
    */
    //on-change文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用
    changeList(param) {
      console.log("param内容",param)
      const privateKeyFile = this.$refs.upload.uploadFiles[0].raw;
      //截取导入文件后缀判断文件类型
      var index = param.name.lastIndexOf("."); //获取“.”最后一次出现的位置
      var behindString = param.name.substring(index + 1);
  if (
        behindString.toUpperCase() == "XLSX" ||
        behindString.toUpperCase() == "XLS" //导入文件为excel类型
      ) {
        let _this = this;
        _this.file2Xce(param).then((item) => {
          //解析以后展示表格
          const [head, ...data] = item[0].sheet;
          const elTableData = [];
          data.forEach((row) => {
            const elTableRow = {};
            row.forEach((column, idx) => {
              elTableRow[idx] = column;
            });
            elTableData.push(elTableRow);
          });

          this.tableHead = head;
     
          //将全部的数据放入itemLists,用于sheet名选择框内容改变时判断sheet名
          this.itemLists = item;
          if (item && item.length > 0) {
            // xlsxJson就是解析出来的json数据,数据格式如下
            // [{sheetName: sheet1, sheet: sheetData }]
            this.sheetNameList = item.map((value, i) => {
              return {
                label: value.sheetName,
                value: value.sheetName,
                idx: i,
              };
            });
          }
        });
      } else if (behindString.toUpperCase() == "TXT") {
        //导入文件为txt类型
        const privateKeyFile = this.$refs.upload.uploadFiles[0].raw;
        if (privateKeyFile.size > 1024 * 1024) {
          this.$message({
            type: "warning",
            message: "该文件过大无法预览,请选择小于1M的文件进行预览",
          });
          return;
        }
        let reader = new FileReader();
        if (typeof FileReader === "undefined") {
          this.$message({
            type: "warning",
            message: "您的浏览器不支持FileReader接口",
          });
          return;
        }

        reader.readAsText(privateKeyFile, "gb2312");

        let that = this;
        // 不用that的话可以用箭头函数,不然会出现指向错误
        reader.onload = function (e) {
          that.textareaData = e.target.result;
        };
      } else {
        this.$message({
          type: "warning",
          message: "只能上传excel表格或者txt文件",
        });
        
        this.$refs.upload.clearFiles();//清空上传列表
        return;
      }
    },



    file2Xce(file) {
      return new Promise(function (resolve, reject) {
        const reader = new FileReader();
        reader.onload = function (e) {
          const data = e.target.result;
          this.wb = XLSX.read(data, {
            type: "array",
          });
          const result = [];
          this.wb.SheetNames.forEach((sheetName) => {
            result.push({
              sheetName: sheetName,
              sheet: XLSX.utils.sheet_to_json(this.wb.Sheets[sheetName], {
                header: 1,
              }),
            });
          });
          resolve(result);
        };
        reader.readAsArrayBuffer(file.raw);
      });
    },

以表格形式显示解析后的excel内容html代码如下

   <el-table
          border
          class="importTableClass"
          :data="tableDataList"
          style="width: 59%"
        >
          <el-table-column
            :show-overflow-tooltip="true"
            v-for="(head, idx) in tableHead"
            :prop="String(idx)"
            :key="idx"
            :label="head"
            width="180"
          >
          </el-table-column>
        </el-table>

txt的内容可以直接用textarea显示
注意点:
这个方法我实现的是导入文件预览的功能,只支持导入excel或者txt格式的文件,并对txt文件的大小进行了限制,避免解析预览造成长时间卡顿;

这个方法现只支持解析gb2312编码格式的txt文件excel文件不存在编码的问题;
如果更完善一点,应该先判断txt文件的编码格式,再用不同的解码格式去解析txt文件,现在如果上传其他编码格式的txt文件,解析出来中文就是乱码,暂未找到解决方法,如有方法解决请大佬指教!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
使用Element UI的el-upload组件上传Excel文件并预览可以分为以下几个步骤: 1. 安装Element UI和xlsx依赖。在命令行中执行以下命令: ``` npm install element-ui xlsx --save ``` 2. 在Vue组件中引入Element UI和xlsx。例如: ```javascript import { ElUpload, ElButton } from 'element-ui'; import XLSX from 'xlsx'; ``` 3. 在Vue组件中使用el-upload组件创建文件上传并预览的功能。例如: ```html <template> <el-upload class="upload-demo" action="" :on-change="handleFileUpload" :before-upload="beforeUpload" :file-list="fileList" :auto-upload="false" :accept=".xlsx, .xls" :show-file-list="false"> <el-button size="small" type="primary">点击上传</el-button> <div slot="tip" class="el-upload__tip">只能上传Excel文件</div> </el-upload> <table> <thead> <tr> <th v-for="header in headers" :key="header">{{ header }}</th> </tr> </thead> <tbody> <tr v-for="(row, index) in data" :key="index"> <td v-for="(value, key) in row" :key="key">{{ value }}</td> </tr> </tbody> </table> </template> ``` 4. 在Vue组件中定义beforeUpload方法,用于限制只能上传Excel文件。例如: ```javascript beforeUpload(file) { const fileType = file.name.split('.').pop(); if (fileType !== 'xlsx' && fileType !== 'xls') { this.$message.error('只能上传Excel文件'); return false; } } ``` 5. 在Vue组件中定义handleFileUpload方法,用于处理上传的Excel文件。例如: ```javascript handleFileUpload(file) { const reader = new FileReader(); reader.onload = (e) => { const data = e.target.result; const workbook = XLSX.read(data, { type: 'binary' }); const sheetName = workbook.SheetNames[0]; const sheet = workbook.Sheets[sheetName]; const jsonData = XLSX.utils.sheet_to_json(sheet, { header: 1 }); this.headers = jsonData[0]; this.data = jsonData.slice(1); }; reader.readAsBinaryString(file.raw); } ``` 6. 在Vue组件中定义fileList、headers和data变量,用于存储上传的Excel文件信息和解析后的数据。例如: ```javascript data() { return { fileList: [], headers: [], data: [] }; } ``` 7. 根据需要自定义样式和其他功能。例如: ```css .upload-demo { margin-top: 20px; width: 100%; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值