diff --git a/agt-framework/agt-spring-boot-starter-excel/src/main/java/org/agt/framework/excel/core/util/ExcelUtils.java b/agt-framework/agt-spring-boot-starter-excel/src/main/java/org/agt/framework/excel/core/util/ExcelUtils.java index 093b0bc..6a01081 100644 --- a/agt-framework/agt-spring-boot-starter-excel/src/main/java/org/agt/framework/excel/core/util/ExcelUtils.java +++ b/agt-framework/agt-spring-boot-starter-excel/src/main/java/org/agt/framework/excel/core/util/ExcelUtils.java @@ -1,15 +1,16 @@ package org.agt.framework.excel.core.util; -import org.agt.framework.common.util.http.HttpUtils; -import org.agt.framework.excel.core.handler.SelectSheetWriteHandler; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.converters.longconverter.LongStringConverter; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import jakarta.servlet.http.HttpServletResponse; +import org.agt.framework.common.util.http.HttpUtils; +import org.agt.framework.excel.core.handler.SelectSheetWriteHandler; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; +import java.util.Set; /** * Excel 工具类 @@ -43,6 +44,21 @@ public class ExcelUtils { response.setContentType("application/vnd.ms-excel;charset=UTF-8"); } + public static void writeSelected(HttpServletResponse response, String filename, String sheetName, + Class head, List data, Set includeColumnFieldNames) throws IOException { + // 输出 Excel + EasyExcel.write(response.getOutputStream(), head) + .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度 + .registerWriteHandler(new SelectSheetWriteHandler(head)) // 基于固定 sheet 实现下拉框 + .registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度 + .includeColumnFieldNames(includeColumnFieldNames) + .sheet(sheetName).doWrite(data); + // 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了 + response.addHeader("Content-Disposition", "attachment;filename=" + HttpUtils.encodeUtf8(filename)); + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + } + public static List read(MultipartFile file, Class head) throws IOException { return EasyExcel.read(file.getInputStream(), head, null) .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理