Vue項目導入導出文件功能以及導出文件後亂碼問題及解決
vue項目導入導出功能
1.導出
導出功能其實很簡單,隻需要調用後端的接口即可,不過有一些需要註意的地方,具體代碼如下所示:
這是導出按鈕,定義導出的點擊事件:
<a-button type="primary" @click="downExcel"> <template #icon> <UploadOutlined /> </template> 導出 </a-button>
js部分,調用接口,導出文件:
// 導出excel const downExcel = () => { if (state.selectedRowKeys.length == 0) { Message.warning("請先選擇需要導出的數據") return } // const date = moment(new Date()).format("YYYY-MM") const params = { exportUserIds: state.selectedRowKeys } const hideLoading = message.loading("文件導出中...", 0) apiDownExcel(params) .then((res: any) => { if (res.status == 200) { const system = window.navigator.platform == "Win32" ? "window" : "mac" const link = document.createElement("a") const blob = new Blob([res.data], { type: "application/vnd.ms-excel" }) link.href = URL.createObjectURL(blob) link.download = `月度薪資.${system == "mac" ? "xlw" : "xls"}` //下載的文件名 document.body.appendChild(link) link.click() document.body.removeChild(link) } }) .finally(() => { setTimeout(hideLoading, 0) }) }
在這裡需要註意的是:
點擊導出按鈕,接口跑通後,文件會成功導出,不過打開文件會出現亂碼,這個時候我們需要配置下接口,具體代碼如下所示:
// 導出月度薪資 export const apiDownExcel = (params: object) => { return request({ url: "/api/slaughter_smart/mySalaryMonthResult/exportExcel", method: "post", data: params, responseType: "blob", }) }
需要設置 ** responseType: “blob” ** 即可正常打開該文件。
2.導入
導入功能也不難,ant-design-vue已經封裝瞭上傳組件,我們按照upload上傳組件開發即可,具體代碼如下所示:
<a-upload name="file" action="/api/slaughter_smart/mySalaryMonthResult/importExcel" :headers="{ Authorization: token, 'Muyuan-Auth': token }" accept=".xls,.xlsx" :multiple="false" :showUploadList="false" @change="uploadChangeHandle > <a-button type="primary"> <template #icon> <DownloadOutlined /> </template> 導入 </a-button> </a-upload>
解析:
action是上傳文件請求的路徑,headers裡面設置瞭token,accept表示接受文件的格式,multiple表示是否上傳多個文件,showUploadList表示是否展示uploadList,@change則表示上傳文件改變時的狀態,上傳文件有三種狀態,分別是uploading、done以及error。
使用action作為上傳文件的接口路徑,通常是沒有攜帶token的,所以需要在請求頭裡自定義帶上token。
文件上傳後js部分代碼:
// 文件狀態 -- 上傳文件後更新列表 const uploadChangeHandle = (data: any) => { if (data.file.status == "done") { Message.success("文件導入成功") getList() } if (data.file.status == "error") { Message.error(data.file.response.message ? data.file.response.message : "文件導入失敗") getList() } }
當然,還有其他的情況,還可以使用自定義上傳的方式,通過customRequest覆蓋默認上傳的方式
3.另一種方法實現文件上傳
接口部分:
// 導入月度薪資 export const apiImportExcel = (params: any) => { return request({ url: '/api/slaughter_smart/mySalaryMonthResult/importExcel', method: 'post', data: params, headers: { 'Content-Type': 'multipart/form-data' } }) }
html部分:
<!-- 導入模板彈框 --> <a-modal title="導入" :visible="modalDate.importVisivle" @cancel="cancelModal" :maskClosable="false" :footer="null" :width="540"> <div> <a-button type="primary" ghost @click="downloadTemplateClick"> <template #icon> <DownloadOutlined /> </template> 模板下載 </a-button> <div style="font-size: 14px;color: #FF4122;font-weight: 400;margin-top: 5px">(註:請按照模板進行設計,如與模板不符將無法錄入)</div> </div> <div style="margin-top: 30px"> <a-upload :showUploadList="false" accept=".xls,.xlsx,xlw" :customRequest="customRequestChange"> <a-button type="primary" ghost v-if="!modalDate.fileList.length"> <UploadOutlined /> 上傳文件 </a-button> <a-button type="primary" ghost disabled v-else> <UploadOutlined /> 上傳文件 </a-button> </a-upload> <div class="martp_15"> <div class="dis_flex flex_y_center" v-for="(item, index) in modalDate.fileList" :key="index"> <i class="iconfont icon-paperclip marrt_10" style="font-size: 14px;color: #0194FE"></i> <span style="color: #0194FE">{{ item.name }}</span> <i class="iconfont icon-icon_close_remove" style="font-size: 20px;margin-left: 15px" @click.stop="deleteFileClick(index)"></i> </div> </div> </div> <div class="text_right" style="margin-top: 20px"> <a-button class="marrt_15" type="primary" v-prevent-click @click="imporSaveClick">確認</a-button> <a-button @click="cancelModal" >取消</a-button > </div> </a-modal>
該彈框打開後效果如下圖所示:
js部分:
// 自定義導入 const customRequestChange = (options: any) => { modalDate.fileList.push(options.file) } // 點擊確認上傳文件 const imporSaveClick = () => { if (modalDate.fileList.length == 0) { message.warning("請選擇上傳的文件") return false } const params = new FormData() modalDate.fileList.forEach((item: any)=> { params.append("file", item) }) apiImportExcel(params).then((res: any)=>{ if (res.data.status == 200 && res.data.rel) { getList() message.success("上傳成功!") modalDate.importVisivle = false modalDate.fileList = [] }else { message.error(res.data.message) } }) }
該寫法隻能上傳一個文件!!!
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- vue+elementUl導入文件方式(判斷文件格式)
- 如何使用vue實現前端導入excel數據
- 一文詳解如何根據後端返回的url下載json文件
- vue封裝組件之上傳圖片組件
- 詳解Vue ElementUI手動上傳excel文件到服務器