纯前端实现excel模板下载、上传到table表格

2024-03-12  本文已影响0人  85d8c4f3886f

需求介绍

点击“模板下载”按钮,下载excel模板,填写好数据之后点击“批量上传”按钮将数据push进下方的表格中,如果手机号与表格中的重复,或者是与excel其他行重复,这条数据不进行push操作,整体弹框提交时才会与后端进行交互。


image.png

相关技术栈、组件

vue3+antDesignVue(a-upload组件)+xlsx

具体实现

模板下载

 <a href="/static/模板.xlsx" download="模板">
      <a-button @click="" class="ml-10" v-if="showUpload">模板下载</a-button>
 </a>

这个功能很简单,需要注意的就是模板的位置需要放在\public\static\下面

image.png

批量下载

npm i xlsx
<a-upload
    v-if="showUpload"
    class="ml-10"
    v-model:file-list="fileList"
    name="file"
    action="/"
    @change="handleChange"
    :showUploadList="false"
 >
      <a-button> 批量上传 </a-button>
 </a-upload>
const handleChange = async (info) => {
      if (info.file.status != "error") return;
      const types = info.file.name.split(".")[1];
      const fileType = ["xlsx", "xls"].some((item) => item === types);
      if (!fileType) {
        proxy.$smallMsgFn("请上传正确的模板文件","error");
        return;
      }
      let dataBinary = await readFile(info.file);
      let workBook = xlsx.read(dataBinary, {
        type: "binary",
        cellDates: true,
      });
      let workSheet = workBook.Sheets[workBook.SheetNames[0]];
      const excelData = xlsx.utils.sheet_to_json(workSheet, { header: 1 });
      let arr = [];
      excelData.forEach((v, i) => {
        if (i == 0) return;
        if (v && v.length > 0) {
          let flag =
            !tabObj.tableData.some((i) => i.phone == v[3]) &&
            !arr.some((i) => i.phone == v[3]);
          if (flag) {
            arr.push({
              // rowId: v[0],
              userName: v[1],
              validate: v[2]?dayjs(v[2]).format("YYYY-MM-DD"):'',
              phone: v[3]?.toString(),
            });
          } else {
            proxy.$smallMsgFn("请上传正确格式的数据","error");
            return;
          }
        }
      });
      tabObj.tableData = [...tabObj.tableData, ...arr];
      tabObj.tableDataCopy = [...tabObj.tableDataCopy, ...arr];
    };
 const readFile = (file) => {
      return new Promise((resolve) => {
        let reader = new FileReader();
        reader.readAsBinaryString(file.originFileObj);
        reader.onload = (ev) => {
          resolve(ev.target?.result);
        };
      });
    };

有几个点需要注意下:

大功告成!

上一篇 下一篇

猜你喜欢

热点阅读