diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelUtil.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelUtil.java index 681f6cd7..051e03d9 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelUtil.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelUtil.java @@ -2,10 +2,12 @@ package com.ruoyi.common.core.utils.poi; import java.io.IOException; import java.io.InputStream; +import java.io.UnsupportedEncodingException; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.math.BigDecimal; +import java.net.URLEncoder; import java.text.DecimalFormat; import java.time.LocalDate; import java.time.LocalDateTime; @@ -455,6 +457,11 @@ public class ExcelUtil public void exportExcel(HttpServletResponse response, List list, String sheetName, String title) { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + try { + response.addHeader("Content-Disposition", "attachment;FileName=" + URLEncoder.encode(title,"utf-8")); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } response.setCharacterEncoding("utf-8"); this.init(list, sheetName, title, Type.EXPORT); exportExcel(response); diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm index e466592d..ee9512ed 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm @@ -63,12 +63,12 @@ public class ${ClassName}Controller extends BaseController */ @RequiresPermissions("${permissionPrefix}:export") @Log(title = "${functionName}", businessType = BusinessType.EXPORT) - @PostMapping("/export") + @PostMapping(value = "/export", produces = "application/octet-stream") public void export(HttpServletResponse response, ${ClassName} ${className}) { List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class); - util.exportExcel(response, list, "${functionName}数据"); + util.exportExcel(response, list, "${functionName}数据", "${functionName}数据"); } /** diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index.vue.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index.vue.vm index 8daa05ec..45f30aec 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index.vue.vm +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index.vue.vm @@ -591,7 +591,7 @@ export default { handleExport() { this.download('${moduleName}/${businessName}/export', { ...this.queryParams - }, `${businessName}_#[[${new Date().getTime()}]]#.xlsx`) + }) } } }; diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/v3/index.vue.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/v3/index.vue.vm index f66cc3b8..59fbdd7b 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/v3/index.vue.vm +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/v3/index.vue.vm @@ -589,7 +589,7 @@ function handle${subClassName}SelectionChange(selection) { function handleExport() { proxy.download('${moduleName}/${businessName}/export', { ...queryParams.value - }, `${businessName}_#[[${new Date().getTime()}]]#.xlsx`) + }) } getList(); diff --git a/ruoyi-ui/src/utils/request.js b/ruoyi-ui/src/utils/request.js index 4a0caa57..90e23268 100644 --- a/ruoyi-ui/src/utils/request.js +++ b/ruoyi-ui/src/utils/request.js @@ -73,6 +73,12 @@ service.interceptors.response.use(res => { const msg = errorCode[code] || res.data.msg || errorCode['default'] // 二进制数据则直接返回 if(res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer'){ + // 响应返回的内联显示的标题 + let disposition = res.headers['content-disposition']; + // 根据标志,不区分大小写,获取文件名称 + let filename = disposition.split(/filename=/i).pop(); + // 文件名称解码 + res.data.filename = decodeURI(filename); return res.data } if (code === 401) { @@ -141,6 +147,8 @@ export function download(url, params, filename, config) { const isLogin = await blobValidate(data); if (isLogin) { const blob = new Blob([data]) + // 如果方法参数的文件名称为空,则使用响应请求返回的文件名称 + filename = filename || data.filename saveAs(blob, filename) } else { const resText = await data.text();