純前端實(shí)現(xiàn)excel模板下載丢习、上傳到table表格

需求介紹

點(diǎn)擊“模板下載”按鈕,下載excel模板淮悼,填寫(xiě)好數(shù)據(jù)之后點(diǎn)擊“批量上傳”按鈕將數(shù)據(jù)push進(jìn)下方的表格中咐低,如果手機(jī)號(hào)與表格中的重復(fù),或者是與excel其他行重復(fù)袜腥,這條數(shù)據(jù)不進(jìn)行push操作见擦,整體彈框提交時(shí)才會(huì)與后端進(jìn)行交互钉汗。


image.png

相關(guān)技術(shù)棧、組件

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

具體實(shí)現(xiàn)

模板下載

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

這個(gè)功能很簡(jiǎn)單鲤屡,需要注意的就是模板的位置需要放在\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("請(qǐng)上傳正確的模板文件","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("請(qǐng)上傳正確格式的數(shù)據(jù)","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);
        };
      });
    };

有幾個(gè)點(diǎn)需要注意下:

  • 1.if (info.file.status != "error") return;根據(jù)官方文檔顯示损痰,上傳的狀態(tài)有很多種:uploading done error removed,寫(xiě)的時(shí)候發(fā)現(xiàn)uploading狀態(tài)不是只出現(xiàn)一次酒来,往表格push數(shù)據(jù)的時(shí)候會(huì)重復(fù)卢未,所以用的error狀態(tài)做判斷,保證onchange里面的方法都只執(zhí)行一次
  • 2.a-upload組件會(huì)將file外面再封裝一層堰汉,所以file.originFileObj才是真正的源文件辽社,不然的話reader.readAsBinaryString會(huì)報(bào)錯(cuò)Failed to execute ‘readAsBinaryString’ on ‘FileReader ‘: parameter 1 is not of type ‘Blob‘
    打印onchange的入?yún)?png
  • 3.在往table中push的時(shí)候,需要注意數(shù)據(jù)的格式翘鸭,比如我這里的手機(jī)號(hào)在excel中默認(rèn)是Number類型滴铅,但接口請(qǐng)求的時(shí)候需要String格式。

大功告成就乓!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末汉匙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子档址,更是在濱河造成了極大的恐慌盹兢,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件守伸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡浦妄,警方通過(guò)查閱死者的電腦和手機(jī)尼摹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)剂娄,“玉大人蠢涝,你說(shuō)我怎么就攤上這事≡呐常” “怎么了和二?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)耳胎。 經(jīng)常有香客問(wèn)我惯吕,道長(zhǎng),這世上最難降的妖魔是什么怕午? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任废登,我火速辦了婚禮,結(jié)果婚禮上郁惜,老公的妹妹穿的比我還像新娘堡距。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布羽戒。 她就那樣靜靜地躺著缤沦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪易稠。 梳的紋絲不亂的頭發(fā)上缸废,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音缩多,去河邊找鬼呆奕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛衬吆,可吹牛的內(nèi)容都是我干的梁钾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼逊抡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼姆泻!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起冒嫡,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拇勃,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后孝凌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體方咆,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年蟀架,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓣赂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡片拍,死狀恐怖煌集,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捌省,我是刑警寧澤苫纤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站纲缓,受9級(jí)特大地震影響卷拘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜色徘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一恭金、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧褂策,春花似錦横腿、人聲如沸颓屑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)揪惦。三九已至,卻和暖如春罗侯,著一層夾襖步出監(jiān)牢的瞬間器腋,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工钩杰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纫塌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓讲弄,卻偏偏與公主長(zhǎng)得像措左,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子避除,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容