Excel下载模板文件和导入文件的步骤

一、配置api

// 题目导入模板下载接口
export function exportTemplate() {return request({url: '/edu/question/exportTemplate',method: 'get',//必加header: {headers: {'Content-Type': 'application/x-download'},},responseType: "blob",//必加})
}
// 题目模板数据导入接口
export function importTemplate(file) {const data = new FormData()//必加data.append('file', file)//必加return request({url: '/edu/question/import',method: 'post',data})
}

二、vue中引用Api

import {exportTemplate,importTemplate,
} from "@/api/edu/question";

三、引用下载文件的方法

//引用下载文件的方法
import { download } from "@/utils/excel";
方法:/utils/excel
/*** 通用js方法封装处理* Copyright (c) 2019*//*** 参数处理* @param {*} params  参数*/// 封装exceljs
import ExcelJS from 'exceljs'
import FileSaver from 'file-saver'export function tansParams(params) {let result = ''for (const propName of Object.keys(params)) {const value = params[propName]let part = `${encodeURIComponent(propName)}=`if (value !== null && value !== '' && typeof value !== 'undefined') {if (typeof value === 'object') {for (const key of Object.keys(value)) {if (value[key] !== null &&value[key] !== '' &&typeof value[key] !== 'undefined') {let params = `${propName}[${key}]`let subPart = `${encodeURIComponent(params)}=`result += `${subPart + encodeURIComponent(value[key])}&`}}} else {result += `${part + encodeURIComponent(value)}&`}}}return result
}// 验证是否为blob格式
export function blobValidate(data) {return data.type !== 'application/json'
}// export function getSrc(url) {
//   return `https://${url}`
// }// 得到字典某个值的内容
export function getDictLabel(dict, value) {let res = dict.filter((item) => item.value === value)return res[0]
}// promise 只执行一次
export function oncePromise(fn, p = null) {return function (...arg) {// eslint-disable-next-line no-return-assignreturn p || (p = fn(...arg).finally(() => (p = null)))}
}/*** 导出数据到Excel方法* @param {Array[Object]} config.data 表格数据* @param {Array[String]} config.fields 字段列表* @param {Array[String]} config.headers excel表头列表[[]],可以是多级表头[['A1','B1'],['A2','B2']]* @param {Array[Object]} config.merges 需要合并的单元格,需要考虑表头的行数[{row:1, col:1, rowspan: 1, colspan: 2}]* @param {Array[Object]} config.attrs 单元格样式配置* @param {Array[Object]} config.views 工作表视图配置* @param {Array[Number]} columnsWidth 每个字段列对应的宽度* @param {Object} config.protect 工作表保护【此配置会保护全表,一般推荐只针对单元格进行保护配置】* @param {String} sheetName 工作表名称,默认从sheet1开始* @param {String} fileName excel文件名称*/
export function exportDataToExcel(config, fileName) {if (!config) returnconst options = {fileName: fileName || `导出excel文件【${Date.now()}】.xlsx`,worksheets: [],}if (!Array.isArray(config)) {config = [config]}config.forEach((item) => {// 深拷贝data【JSON.stringify有缺陷,可自行换成_.cloneDeep】const data = JSON.parse(JSON.stringify(item.data))const results = data.map((obj) => item.fields.map((key) => obj[key])) // 生成完整excel数据let excelData = []excelData = excelData.concat(item.headers).concat(results) // 单元格合并处理【excel数据的第一行/列是从1开始】let excelMerges = []excelMerges = item.merges.map((m) => [m.row + 1,m.col + 1,m.row + m.rowspan,m.col + m.colspan,]) // 单元格配置处理【excel数据的第一行/列是从1开始】let excelAttrs = []excelAttrs = item.attrs.map((attr) => {attr.rowStart += 1attr.rowEnd += 1attr.colStart += 1attr.colEnd += 1return attr})options.worksheets.push({data: excelData,merges: excelMerges,attrs: excelAttrs,views: item.views,columnsWidth: item.columnsWidth,protect: item.protect,sheetName: item.sheetName,})})createExcel(options)
}// 创建Excel文件方法
async function createExcel(options) {if (!options.worksheets.length) return // 创建工作簿const workbook = new ExcelJS.Workbook()for (let i = 0; i < options.worksheets.length; i++) {const sheetOption = options.worksheets[i] // 创建工作表const sheet = workbook.addWorksheet(sheetOption.sheetName || `sheet${i + 1}`) // 添加数据行sheet.addRows(sheetOption.data) // 配置视图sheet.views = sheetOption.views // 单元格合并处理【开始行,开始列,结束行,结束列】if (sheetOption.merges) {sheetOption.merges.forEach((item) => {sheet.mergeCells(item)})} // 工作表保护if (sheetOption.protect) {const res = await sheet.protect(sheetOption.protect.password,sheetOption.protect.options)} // 单元格样式处理if (sheetOption.attrs.length) {sheetOption.attrs.forEach((item) => {const attr = item.attr || {} // 获取开始行-结束行; 开始列-结束列const { rowStart } = itemconst { rowEnd } = itemconst { colStart } = itemconst { colEnd } = itemif (rowStart) {// 设置行for (let r = rowStart; r <= rowEnd; r++) {// 获取当前行const row = sheet.getRow(r)if (colStart) {// 列设置for (let c = colStart; c <= colEnd; c++) {// 获取当前单元格const cell = row.getCell(c)Object.keys(attr).forEach((key) => {// 给当前单元格设置定义的样式cell[key] = attr[key]})}} else {// 未设置列,整行设置【大纲级别】Object.keys(attr).forEach((key) => {row[key] = attr[key]})}}} else if (colStart) {// 未设置行,只设置了列for (let c = colStart; c <= colEnd; c++) {// 获取当前列,整列设置【大纲级别】const column = sheet.getColumn(c)Object.keys(attr).forEach((key) => {column[key] = attr[key]})}} else {// 没有设置具体的行列,则为整表设置Object.keys(attr).forEach((key) => {sheet[key] = attr[key]})}})} // 列宽设置if (sheetOption.columnsWidth) {for (let j = 0; j < sheet.columns.length; j++) {sheet.columns[j].width = sheetOption.columnsWidth[j]}}} // 生成excel文件workbook.xlsx.writeBuffer().then((buffer) => {// application/octet-stream 二进制数据FileSaver.saveAs(new Blob([buffer], { type: 'application/octet-stream' }),options.fileName)})
}// 下载文件流文件
export const download = (res, type, filename) => {// 创建blob对象,解析流数据const blob = new Blob([res], {// 设置返回的文件类型// type: 'application/pdf;charset=UTF-8' 表示下载文档为pdf,如果是word则设置为msword,excel为'application/vnd.ms-excel'type,}) // 这里就是创建一个a标签,等下用来模拟点击事件const a = document.createElement('a') // 兼容webkix浏览器,处理webkit浏览器中href自动添加blob前缀,默认在浏览器打开而不是下载const URL = window.URL || window.webkitURL // 根据解析后的blob对象创建URL 对象const href = URL.createObjectURL(blob) // 下载链接a.href = href // 下载文件名,如果后端没有返回,可以自己写a.download = '文件.pdf'a.download = filenamedocument.body.appendChild(a) // 点击a标签,进行下载a.click() // 收尾工作,在内存中移除URL 对象document.body.removeChild(a)window.URL.revokeObjectURL(href)
}

三、添加点击事件下载

HTML:

<template><!-- 导入对话框 --><el-dialog:title="title":visible.sync="localImportShow"width="600px"@close="localImportClose"append-to-body><el-form ref="form" :model="form" :rules="rules" label-width="80px"><el-row><el-col :span="24"><el-form-item label="下载模板" prop="downloadTemplate"><el-button type="primary" @click="downloadCClick">下载<i class="el-icon-download"></i></el-button></el-form-item></el-col></el-row><el-row><el-col :span="24"><el-form-item label="导入数据" prop="file"><el-uploadref="uploadExcel"class="upload-btn"action="#":auto-upload="false"accept=".xls, .xlsx":show-file-list="true":file-list="form.file":on-change="change":on-remove="handleRemove":limit="1"><el-button slot="trigger" size="small" type="primary">选取文件</el-button></el-upload></el-form-item></el-col></el-row></el-form><div slot="footer" class="dialog-footer"><el-button type="primary" @click="submitForm">确 定</el-button><el-button @click="cancel">取 消</el-button></div></el-dialog>
</template>

VUEJS:

<script>
import { exportTemplate, importTemplate } from "@/api/edu/question";
import { download } from "@/utils/excel";export default {props: {//弹出框是否展示importShow: {type: Boolean,default: false,},},data() {return {title: "导入试题数据",form: {file: [],},// 弹出框是否展示localImportShow: this.importShow,rules: {file: [{ required: true, message: "请导入数据", trigger: "change" }],},};},watch: {importShow(newVal) {this.localImportShow = newVal;},"form.file": {handler(nval) {if (nval.length) {this.$refs.form.clearValidate(["file"]);}},deep: true,},},methods: {localImportClose() {this.$emit("update:importShow", false);this.reset();},// 点击下载模板按钮downloadCClick() {exportTemplate().then((res) => {download(res, "application/vnd.ms-excel", "试题模板.xlsx");});},// 更换上传文件change({ raw }) {//使用set watch才能监测到有值this.$set(this.form.file, 0, raw);},handleRemove(file, fileList) {// 移除上传文件this.form.file = [];},// 提交事件submitForm() {this.$refs["form"].validate((valid) => {if (valid) {importTemplate(this.form.file[0]).then((res) => {if (res.code === 200) {this.localImportShow = false;this.$modal.msgSuccess("导入成功");this.$emit("getList");}}).catch((err) => {this.localImportShow = false;});this.$nextTick(() => {this.reset();});}});},// 取消按钮cancel() {this.localImportShow = false;this.reset();},// 重置数据reset() {this.$refs.form.clearValidate();this.form = {// parentId: null,file: [],};},},
};
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/49749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为强制恢复出厂设置后如何恢复数据?数据重生的2个方法介绍

华为作为全球知名的手机品牌&#xff0c;其产品在市场上广受欢迎。然而&#xff0c;有时由于各种原因&#xff0c;我们可能需要强制恢复出厂设置&#xff0c;这往往意味着数据的丢失。那么&#xff0c;如何在华为强制恢复出厂设置后&#xff0c;让数据“重生”呢&#xff1f;本…

Postman测试工具详细解读

目录 一、Postman的基本概念二、Postman的主要功能1. 请求构建2. 响应查看3. 断言与自动化测试4. 环境与变量5. 集合与文档化6. 与团队实时协作 三、Postman在API测试中的重要性1. 提高测试效率2. 保障API的稳定性3. 促进团队协作4. 生成文档与交流工具 四、Postman的使用技巧1…

Ubuntu24.04 deb文件 安装 MySQL8.4

Ubuntu24.04 deb文件 安装 MySQL8.4 ubuntu24.04 deb文件安装 MySQL8 升级系统 sudo apt update sudo apt -y dist-upgrade 安装常用工具 sudo apt -y install vim net-tools wget gcc make cmake lrzsz安装依赖 sudo apt -y install libmecab2 libjson-perl libaio1t64下载…

JavaEE - Spring Boot 简介

1.Maven 1.1 什么是Maven 翻译过来就是: Maven是⼀个项⽬管理⼯具。基于POM(Project Object Model,项⽬对象模型)的概念&#xff0c;Maven可以通 过⼀⼩段描述信息来管理项⽬的构建&#xff0c;报告和⽂档的项⽬管理⼯具软件。 可以理解为&#xff1a;Maven是一个项目管理工具…

关键词查找【Knuth-Morris-Pratt (KMP) 算法】

一个视频让你彻底学懂KMP算法_哔哩哔哩_bilibili KMP算法的核心是利用匹配失败后的信息&#xff0c;尽量减少模式串与主串的匹配次数以达到快速匹配的目的。 public class KMP {// 计算部分匹配表 (LPS)private static int[] computeLPSArray(String pattern) {int[] lps new…

Arduino学习笔记1——IDE安装与起步

一、IDE安装 去浏览器直接搜索Arduino官网&#xff0c;点击Software栏进入下载界面&#xff0c;选择Windows操作系统&#xff1a; 新版IDE下载不需要提前勾选所下载的拓展包&#xff0c;下载好后直接点击安装即可。 安装好后打开Arduino IDE&#xff0c;会自动开始下载所需的…

npm publish出错,‘proxy‘ config is set properly. See: ‘npm help config‘

问题&#xff1a;使用 npm publish发布项目依赖失败&#xff0c;报错 proxy config is set properly. See: npm help config 1、先查找一下自己的代理 npm config get proxy npm config get https-proxy npm config get registry2、然后将代理和缓存置空 方式一&#xff1a; …

基于TensorFlow.js和COCO-SsD模型的实时目标检测网络应用程序

基于TensorFlow.js和COCO-SsD模型的实时目标检测网络应用程序 实现流程 访问用户的桌面录屏并且显示视频源&#xff08;位置居中&#xff09;。对视频源进行实时目标检测。在检测到的目标周围绘制边界框&#xff0c;并用它们的类别和检测置信度进行标记。在视频源下方显示一个…

openEuler安装docker,加速镜像拉取

文章目录 文章来源1.配置镜像源2.编辑配置文件3.安装想要的版本4. ~ 原神&#xff01;5.由于很多镜像无法拉取配置镜像源 文章来源 http://t.csdnimg.cn/zYDYy 原文连接 由于之前的仓库不让用且 1.配置镜像源 由于 国外的镜像仓库好多不让用 所以配置阿里的镜像源 yum-confi…

Memcached开发(七):使用Java进行操作

目录 1. 安装与配置Memcached 1.1 安装Memcached 1.2 配置Memcached 2. 使用Java与Memcached进行交互 2.1 安装Java客户端 2.2 连接Memcached 2.3 基本操作 2.3.1 设置键值对 2.3.2 获取键值对 2.3.3 删除键值对 2.3.4 检查键是否存在 2.3.5 增加和减少数值 2.4 高…

使用 com.alibaba:easyexcel 导出excel文件时遇到的问题

1.字符长度超出限制 java.lang.IllegalArgumentException: The maximum length of cell contents (text) is 32,767 characters 解决方案&#xff1a; 1. 把字符串截取前32767个字符 /*** sqlText 字段导出 excel 时的转化器*/ public class SqlTextConverter implements C…

javascript 如何将 json 格式数组转为 excel 表格| sheetJS

案例 // https://unpkg.com/xlsx0.18.5/dist/xlsx.full.min.js function exportXlsx(jsonData, fileName , mine null) {const workbook XLSX.utils.book_new();// 将JSON数组转换成工作表const worksheet XLSX.utils.json_to_sheet(jsonData);// 向工作簿添加工作表XLSX.…

建造者模式(Builder Pattern)工作原理

文章目录 [toc]建造者模式&#xff08;Builder Pattern&#xff09;工作原理一、基本概念二、主要角色三、工作流程&#xff08;一&#xff09;定义产品&#xff08;二&#xff09;定义抽象建造者&#xff08;三&#xff09;定义具体建造者&#xff08;四&#xff09;定义指挥者…

Git操作指令

Git操作指令 一、安装git 1、设置配置信息&#xff1a; # global全局配置 git config --global user.name "Your username" git config --global user.email "Your email"2、查看git版本号 git -v # or git --version3、查看配置信息&#xff1a; git…

云计算复习--虚拟化技术

文章目录 虚拟化技术定义与原理虚拟机监视器&#xff08;VMM&#xff09;虚拟化技术服务器虚拟化存储虚拟化网络虚拟化应用虚拟化 关键技术新型虚拟化技术发展进展作业 虚拟化技术定义与原理 定义&#xff1a;虚拟化技术是一种将计算机物理实体&#xff08;如服务器、存储设备…

携手知“食”达人,黄浦两大商圈举办舌尖上的创意盛宴

7月22日&#xff0c;2024第十二届上海市“中华杯”职业技能竞赛——中华美食创新创意大赛活动暨第二届【南京路步行街】新中式美食创意大赛暨风情【淮海路】摩登名点创新大赛顺利落下帷幕。活动现场&#xff0c; “‘盛夏好食光’——特色创意美食焕新菜单” 正式发布。 大赛主…

Spring Boot组成的分布式系统中实现日志跟踪

Spring Boot组成的分布式系统中实现日志跟踪 首发2024-07-25 08:54潘多编程 在分布式系统中&#xff0c;日志跟踪是一项非常重要的功能&#xff0c;它帮助开发者了解请求在整个系统中的流转过程&#xff0c;这对于调试、监控和故障排查至关重要。Spring Boot应用通常作为微服…

【cmd】Windows CMD命令整理及示例使用

1. dir 显示目录中的文件和子目录列表。 dir带参数使用示例&#xff1a; dir /p # 分页显示目录中的内容 dir /s # 显示指定目录及所有子目录中的文件 dir /a # 显示具有隐藏属性的文件2. copy 复制文件和目录。 copy source destination带参数使用示例&#xff1a; c…

养宠浮毛异味双困扰?性价比高的宠物空气净化器推荐

家里养了两只银渐层&#xff0c;谁懂啊&#xff01;一下班打开家门就看到家里飘满了猫浮毛雪&#xff0c;空气中还传来隐隐约约的异味。每天不是在吸毛的路上&#xff0c;就是在洗猫砂盆的路上&#xff0c;而且空气中的浮毛还很难清理干净&#xff0c;这是最让人头疼的问题。 …

SSM学习8:SpringMVC请求与响应

设置请求映射路径 设置配置 config/ServletContainersInitConfig.class public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {protected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcC…