RuoYi框架Excel静态模板下载例子Demo
好的,我来为您提供下载静态文件模板的完整代码实现。
下载静态文件模板完整实现Demo
1. 后端实现
1.1 控制器层 (DemoController.java)
package com.ruoyi.business.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;/*** 静态文件模板下载Demo控制器*/
@Slf4j
@RestController
@RequestMapping("/bs/demo")
public class DemoController {/*** 下载静态Excel模板文件*/@PostMapping("/downloadTemplate")public void downloadTemplate(HttpServletResponse response) throws IOException {// 静态模板文件名String filename = "数据导入模板.xlsx";// 尝试从多个位置查找静态模板文件InputStream inputStream = null;String[] possiblePaths = {"templates/excel/" + filename,"static/templates/" + filename,"templates/" + filename,filename};for (String path : possiblePaths) {inputStream = getClass().getClassLoader().getResourceAsStream(path);if (inputStream != null) {log.info("找到静态模板文件: {}", path);break;}}if (inputStream == null) {log.error("静态模板文件 '{}' 未找到", filename);response.setStatus(HttpServletResponse.SC_NOT_FOUND);response.getWriter().write("模板文件未找到");return;}try {// 设置响应头response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));// 复制文件内容到响应流byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {response.getOutputStream().write(buffer, 0, bytesRead);}log.info("静态模板文件下载成功: {}", filename);} catch (IOException e) {log.error("下载静态模板文件失败", e);response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);response.getWriter().write("下载失败");} finally {if (inputStream != null) {inputStream.close();}}}/*** 下载指定名称的静态模板文件*/@PostMapping("/downloadTemplate/{templateName}")public void downloadTemplateByName(@PathVariable String templateName, HttpServletResponse response) throws IOException {// 构建文件名String filename = templateName + ".xlsx";// 尝试从多个位置查找静态模板文件InputStream inputStream = null;String[] possiblePaths = {"templates/excel/" + filename,"static/templates/" + filename,"templates/" + filename,filename};for (String path : possiblePaths) {inputStream = getClass().getClassLoader().getResourceAsStream(path);if (inputStream != null) {log.info("找到静态模板文件: {}", path);break;}}if (inputStream == null) {log.error("静态模板文件 '{}' 未找到", filename);response.setStatus(HttpServletResponse.SC_NOT_FOUND);response.getWriter().write("模板文件未找到");return;}try {// 设置响应头response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));// 复制文件内容到响应流byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {response.getOutputStream().write(buffer, 0, bytesRead);}log.info("静态模板文件下载成功: {}", filename);} catch (IOException e) {log.error("下载静态模板文件失败", e);response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);response.getWriter().write("下载失败");} finally {if (inputStream != null) {inputStream.close();}}}/*** 获取可用的模板文件列表*/@GetMapping("/templateList")public Object getTemplateList() {// 这里可以返回可用的模板文件列表// 实际项目中可以从配置文件或数据库读取return new Object[]{"数据导入模板","用户信息模板", "产品信息模板"};}
}
1.2 配置文件 (application.yml)
# 静态文件配置
spring:web:resources:static-locations: classpath:/static/,classpath:/templates/cache:period: 3600
2. 前端实现
2.1 API接口 (demo.js)
import request from '@/utils/request'// 下载静态模板文件
export function downloadTemplate() {return request({url: '/bs/demo/downloadTemplate',method: 'post',responseType: 'blob'})
}// 下载指定名称的模板文件
export function downloadTemplateByName(templateName) {return request({url: `/bs/demo/downloadTemplate/${templateName}`,method: 'post',responseType: 'blob'})
}// 获取可用的模板文件列表
export function getTemplateList() {return request({url: '/bs/demo/templateList',method: 'get'})
}
2.2 页面组件 (demo/index.vue)
<template><div class="app-container"><!-- 操作按钮区域 --><el-row :gutter="10" class="mb8"><el-col :span="1.5"><el-buttontype="primary"icon="el-icon-download"size="mini"@click="handleDownloadTemplate">下载模板</el-button></el-col><el-col :span="1.5"><el-dropdown @command="handleDownloadTemplateByName" split-button type="success" size="mini">下载指定模板<el-dropdown-menu slot="dropdown"><el-dropdown-item v-for="template in templateList" :key="template" :command="template">{{ template }}</el-dropdown-item></el-dropdown-menu></el-dropdown></el-col><el-col :span="1.5"><el-buttontype="info"icon="el-icon-refresh"size="mini"@click="loadTemplateList">刷新模板列表</el-button></el-col></el-row><!-- 模板文件信息展示 --><el-card class="box-card" v-if="templateList.length > 0"><div slot="header" class="clearfix"><span>可用模板文件</span></div><el-table :data="templateList" style="width: 100%"><el-table-column prop="templateName" label="模板名称" width="200"><template slot-scope="scope">{{ scope.row }}</template></el-table-column><el-table-column label="操作" width="150"><template slot-scope="scope"><el-buttonsize="mini"type="text"icon="el-icon-download"@click="handleDownloadTemplateByName(scope.row)">下载</el-button></template></el-table-column></el-table></el-card><!-- 下载进度提示 --><el-dialogtitle="下载提示":visible.sync="downloadDialogVisible"width="400px":close-on-click-modal="false"><div style="text-align: center;"><i class="el-icon-loading" v-if="downloading"></i><i class="el-icon-success" v-else-if="downloadSuccess"></i><i class="el-icon-error" v-else-if="downloadError"></i><p>{{ downloadMessage }}</p></div><div slot="footer" class="dialog-footer"><el-button @click="downloadDialogVisible = false" v-if="!downloading">确 定</el-button></div></el-dialog></div>
</template><script>
import { downloadTemplate,downloadTemplateByName,getTemplateList
} from "@/api/bs/demo";export default {name: "Demo",data() {return {templateList: [],downloadDialogVisible: false,downloading: false,downloadSuccess: false,downloadError: false,downloadMessage: ''};},created() {this.loadTemplateList();},methods: {/** 加载模板文件列表 */loadTemplateList() {getTemplateList().then(response => {this.templateList = response.data || response;}).catch(error => {console.error('加载模板列表失败:', error);this.$message.error('加载模板列表失败');});},/** 下载默认模板 */handleDownloadTemplate() {this.downloadDialogVisible = true;this.downloading = true;this.downloadSuccess = false;this.downloadError = false;this.downloadMessage = '正在下载模板文件...';downloadTemplate().then(response => {this.downloadFile(response, '数据导入模板.xlsx');this.downloading = false;this.downloadSuccess = true;this.downloadMessage = '模板文件下载成功!';}).catch(error => {console.error('下载模板失败:', error);this.downloading = false;this.downloadError = true;this.downloadMessage = '模板文件下载失败,请重试';});},/** 下载指定名称的模板 */handleDownloadTemplateByName(templateName) {this.downloadDialogVisible = true;this.downloading = true;this.downloadSuccess = false;this.downloadError = false;this.downloadMessage = `正在下载 ${templateName} 模板文件...`;downloadTemplateByName(templateName).then(response => {this.downloadFile(response, `${templateName}.xlsx`);this.downloading = false;this.downloadSuccess = true;this.downloadMessage = `${templateName} 模板文件下载成功!`;}).catch(error => {console.error('下载模板失败:', error);this.downloading = false;this.downloadError = true;this.downloadMessage = `${templateName} 模板文件下载失败,请重试`;});},/** 处理文件下载 */downloadFile(response, filename) {try {// 创建Blob对象const blob = new Blob([response], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});// 创建下载链接const url = window.URL.createObjectURL(blob);const link = document.createElement('a');link.href = url;link.download = filename;// 触发下载document.body.appendChild(link);link.click();document.body.removeChild(link);// 释放URL对象window.URL.revokeObjectURL(url);} catch (error) {console.error('文件下载处理失败:', error);this.downloading = false;this.downloadError = true;this.downloadMessage = '文件下载处理失败';}}}
};
</script><style scoped>
.box-card {margin-top: 20px;
}.clearfix:before,
.clearfix:after {display: table;content: "";
}.clearfix:after {clear: both;
}
</style>
3. 静态文件配置
3.1 文件目录结构
src/main/resources/
├── templates/
│ └── excel/
│ ├── 数据导入模板.xlsx
│ ├── 用户信息模板.xlsx
│ └── 产品信息模板.xlsx
└── static/└── templates/├── 数据导入模板.xlsx├── 用户信息模板.xlsx└── 产品信息模板.xlsx
3.2 模板文件格式示例
Excel文件应包含以下列:
- 第1列: 编码(必填)
- 第2列: 名称(必填)
- 第3列: 类型(可选)
- 第4列: 状态(可选)
- 第5列: 备注(可选)
4. 核心功能特点
- 静态文件下载:直接从classpath加载静态Excel文件
- 多路径查找:支持多个目录查找模板文件
- 错误处理:完善的错误处理和用户提示
- 进度提示:下载过程中的用户友好提示
- 模板列表:动态获取可用模板文件列表
- 灵活下载:支持下载默认模板和指定名称模板
这个实现专注于静态文件模板的下载功能,提供了完整的前后端代码,可以直接用于其他项目。