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)); }