From 66a82465e3845e6eebcdaec1011b2a9b546e63bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=82=96=E6=99=8B=E9=A3=9E?= <378266566@qq.com> Date: Fri, 27 Jun 2025 10:18:55 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E5=B0=86excel=E6=94=B9=E4=B8=BAcsv?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/excel/core/util/ExcelUtils.java | 42 +++++++++++++++++++ .../controller/admin/exa/EXAController.java | 11 +++-- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java index 44a1929..4535cba 100644 --- a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java +++ b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.util.http.HttpUtils; import cn.iocoder.yudao.framework.excel.core.handler.SelectSheetWriteHandler; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.converters.longconverter.LongStringConverter; +import com.alibaba.excel.support.ExcelTypeEnum; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.multipart.MultipartFile; @@ -54,4 +55,45 @@ public class ExcelUtils { .doReadAllSync(); } + + /** + * 将列表以 CSV 响应给前端 + * + * @param response 响应 + * @param filename 文件名 + * @param sheetName Excel sheet 名 + * @param head Excel head 头 + * @param data 数据列表哦 + * @param 泛型,保证 head 和 data 类型的一致性 + * @throws IOException 写入失败的情况 + */ + public static void writeCSV(HttpServletResponse response, String filename, String sheetName, + Class head, List data) throws IOException { + response.setHeader("Content-Disposition", "attachment;filename=" + HttpUtils.encodeUtf8(filename)); +// response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.setContentType("application/vnd.opencmlformats-officedocument.spreadsheetml.sheet"); + // 输出 Excel + EasyExcel.write(response.getOutputStream(), head) + .excelType(ExcelTypeEnum.CSV) + .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度 + .registerWriteHandler(new SelectSheetWriteHandler(head)) // 基于固定 sheet 实现下拉框 + .registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度 + .sheet(sheetName).doWrite(data); + + // 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了 + response.setHeader("Content-Disposition", "attachment;filename=" + HttpUtils.encodeUtf8(filename)); +// response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.setContentType("application/vnd.opencmlformats-officedocument.spreadsheetml.sheet"); + + } + + + public static List readCSV(MultipartFile file, Class head) throws IOException { + return EasyExcel.read(file.getInputStream(), head, null) + .excelType(ExcelTypeEnum.CSV) + .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 + .doReadAllSync(); + } + } diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/EXAController.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/EXAController.java index 56e98e3..e91b1d0 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/EXAController.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/exa/EXAController.java @@ -105,8 +105,13 @@ public class EXAController { Point.builder().ItemName("gbqegj").GroupName("test").ItemType(5).Descriptor("fqnewfej") .EngUnits("ge").Source("批量录入").AutoSave(true).build() ); - // 输出 - ExcelUtils.write(response, "用户导入模板.xls", "测点列表", Point.class, list); + + + // 输出excel +// ExcelUtils.write(response, "用户导入模板.xls", "测点列表", Point.class, list); + //输出csv + ExcelUtils.writeCSV(response, "用户导入模板.csv", "测点列表", Point.class, list); + } @PostMapping("/import") @@ -119,7 +124,7 @@ public class EXAController { public CommonResult importExcel(@RequestParam("file") MultipartFile file, @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { System.out.println(file); - List list = ExcelUtils.read(file, Point.class); + List list = ExcelUtils.readCSV(file, Point.class); return success(exaService.importPointList(list, updateSupport)); }