上传本地.xlsx(.xls)文件,实现页面表格数据预览

预览的表格数据如下图

在这里插入图片描述

element-ui 里面的组件
 <el-dialog title="新建任务" :visible.sync="dialogTableVisible" fullscreen>
      <div class="app-container home">
        <div>
          <div class="crenter">
            <div class="flex-box">
              <el-form :model="form">
                <el-form-item label="任务名称:" label-width="100px">
                  <el-input v-model="form.name" autocomplete="off"></el-input>
                </el-form-item>
              </el-form>
              <div style="margin-right: 10px">
                <el-button @click="handleDownLoad" type="success"
                  >下载模版</el-button
                >
              </div>
            </div>
            <div class="up-box" style="margin-bottom: 50px">
              <p>上传文件:</p>
              <el-upload
                ref="upload"
                class="upload-demo"
                :on-change="onChange"
                drag
                action="javascript:void(0)"
                multiple
                accept=".xlsx,.xls"
                :on-exceed="exceed"
                :limit="1"
                :on-remove="remove"
                :http-request="uploadFile"
              >
                <el-button type="primary">上传文件</el-button>
              </el-upload>
            </div>

            <div v-if="newArrList.length" style="text-align: center">
              <!-- 表格数据 -->
              <el-table border :data="newArrList" style="width: 100%">
                <el-table-column
                  prop="fgsm"
                  label="分公司名"
                  align="center"
                ></el-table-column>
                <el-table-column
                  prop="fjm"
                  label="分局名"
                  align="center"
                ></el-table-column>
                <el-table-column
                  prop="wgm"
                  label="网格名"
                  align="center"
                ></el-table-column>
                <el-table-column
                  prop="jzm"
                  label="基站名"
                  align="center"
                ></el-table-column>
                <el-table-column
                  prop="lac"
                  label="LAC"
                  align="center"
                ></el-table-column>
                <el-table-column
                  prop="cell"
                  label="CELL"
                  align="center"
                ></el-table-column>
              </el-table>

              <!-- 分页 -->
              <div style="margin-top: 15px">
                <el-pagination
                  @size-change="handleSizeChange"
                  @current-change="handleCurrentChange"
                  :current-page="currentPage"
                  :page-sizes="[3, 5, 7]"
                  :page-size="pageSize"
                  layout="total, sizes, prev, pager, next, jumper"
                  :total="listTable.length"
                >
                </el-pagination>
              </div>
            </div>
            <div
              v-if="newArrList.length"
              style="
                display: flex;
                align-item: center;
                justify-content: center;
                margin-top: 60px;
              "
            >
              <el-button @click="handleUpload" style="" type="primary"
                >提交</el-button
              >
            </div>
          </div>
        </div>
      </div>
    </el-dialog>
下载xlsx插件(不要下载最新版本,亲测最新版本下载的文件打不开!!!)

在这里插入图片描述

`npm install xlsx@0.16.8 --save`
   <script>
   //引入xlsx 
   import XLSX from "xlsx";
    //解析excel 生成表格
    async uploadFile(params) {
    //   console.log("params", params);
      const _file = params.file;
      const fileReader = new FileReader();
      fileReader.onload = (ev) => {
        try {
          const data = ev.target.result;
          // console.log(data)
          const workbook = XLSX.read(data, {
            type: "binary",
          });
          for (let sheet in workbook.Sheets) {
            //循环读取每个文件
            const sheetArray = XLSX.utils.sheet_to_json(workbook.Sheets[sheet]);
            //若当前sheet没有数据,则continue
            if (sheetArray.length == 0) {
              continue;
            }
            console.log("读取文件");
            console.log(sheetArray.slice(1));  //删除模版数据的第一行
            for (let item in sheetArray.slice(1)) {
              let rowTable = {};
              //这里的rowTable的属性名注意要与上面表格的prop一致
              //sheetArray的属性名与上传的表格的列名一致
              rowTable.cell = sheetArray[item].CELL;
              rowTable.lac = sheetArray[item].LAC;
              rowTable.fgsm = sheetArray[item].分公司名;
              rowTable.fjm = sheetArray[item].分局名;
              rowTable.jzm = sheetArray[item].基站名;
              rowTable.wgm = sheetArray[item].网格名;
              this.listTable.push(rowTable);
              this.newArrList = this.queryByPage();
            }
          }
        } catch (e) {
          this.$message.warning("文件类型不正确!");
        }
      };
      fileReader.readAsBinaryString(_file);
    },
    //前端实现分页
     handleSizeChange(val) {
      this.pageSize = val;
      // this.getResultsData();
      this.newArrList = this.queryByPage();
      console.log(`每页 ${val}`);
    },
    handleCurrentChange(val) {
      this.currentPage = val;
      // this.getResultsData();
      this.newArrList = this.queryByPage();
      console.log(`当前页: ${val}`);
    },
    // 实现分页的方法
    queryByPage() {
      // 起始位置 = (当前页 - 1) x 每页的大小
      const start = (this.currentPage - 1) * this.pageSize;
      console.log(start);
      // 结束位置 = 当前页 x 每页的大小
      const end = this.currentPage * this.pageSize;

      return this.listTable.slice(start, end);
    },
</script>
在Vue中预览docx、doc、pdf、xlsxlsx文件,可以使用第三方库来实现。 对于docx、doc、xlsxlsx文件,可以使用`js-xlsx`库来进行解析和预览。该库可以将Excel文件转换为JSON格式,而对于Word文件,可以使用`docx.js`库来进行解析和预览。 对于pdf文件,可以使用`pdf.js`库来进行预览。该库可以通过Canvas将PDF文件渲染成图片,然后在Vue中显示。 下面是一个示例代码,演示如何使用上述库来预览不同类型的文件: ```html <template> <div> <div v-if="fileType === 'docx' || fileType === 'doc'"> <div v-html="docContent"></div> </div> <div v-else-if="fileType === 'xls' || fileType === 'xlsx'"> <table> <tr v-for="row in excelData"> <td v-for="cell in row">{{ cell }}</td> </tr> </table> </div> <div v-else-if="fileType === 'pdf'"> <canvas ref="pdfCanvas"></canvas> </div> </div> </template> <script> import XLSX from 'xlsx'; import Docx from 'docx'; import pdfjsLib from 'pdfjs-dist'; export default { data() { return { fileType: '', docContent: '', excelData: [], }; }, mounted() { // 根据文件类型进行解析和预览 if (this.fileType === 'docx' || this.fileType === 'doc') { const reader = new FileReader(); reader.onload = (event) => { const content = event.target.result; const doc = new Docx(); doc.load(content); this.docContent = doc.getHtml(); }; reader.readAsArrayBuffer(this.file); } else if (this.fileType === 'xls' || this.fileType === 'xlsx') { const reader = new FileReader(); reader.onload = (event) => { const content = event.target.result; const workbook = XLSX.read(content, { type: 'array' }); const sheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[sheetName]; this.excelData = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); }; reader.readAsArrayBuffer(this.file); } else if (this.fileType === 'pdf') { const canvas = this.$refs.pdfCanvas; const ctx = canvas.getContext('2d'); pdfjsLib.getDocument(this.file).promise.then((pdf) => { pdf.getPage(1).then((page) => { const viewport = page.getViewport({ scale: 1.5 }); canvas.height = viewport.height; canvas.width = viewport.width; page.render({ canvasContext: ctx, viewport, }); }); }); } }, props: { file: { type: File, required: true, }, }, created() { // 根据文件后缀名判断文件类型 const fileExtension = this.file.name.split('.').pop(); if (fileExtension === 'docx' || fileExtension === 'doc') { this.fileType = 'docx'; } else if (fileExtension === 'xls' || fileExtension === 'xlsx') { this.fileType = 'xls'; } else if (fileExtension === 'pdf') { this.fileType = 'pdf'; } }, }; </script> ``` 在上述代码中,根据文件后缀名判断文件类型,然后使用不同的库进行解析和预览。对于Word文件,使用`docx.js`库将文件解析为HTML格式,然后在Vue中显示;对于Excel文件,使用`js-xlsx`库将文件解析为JSON格式,然后在Vue中生成表格;对于PDF文件,使用`pdf.js`库将文件渲染成图片,然后在Vue中显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吃葡萄不吐葡萄皮嘻嘻

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

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

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

打赏作者

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

抵扣说明:

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

余额充值