package com.kym.service.impl; import cn.hutool.core.io.IoUtil; import cn.hutool.poi.excel.ExcelWriter; import com.kym.service.ExportService; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; import lombok.SneakyThrows; import org.springframework.stereotype.Service; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.List; /** * @author skyline * @description * @date 2023-09-25 17:43 */ @Service public class ExportServiceImpl implements ExportService { @SneakyThrows @Override public void exportExcel(String fileName, ExcelWriter writer, List> rows, HttpServletResponse response) { var filename = new String(fileName.concat(".xls").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); // 默认的,未添加alias的属性也会写出,如果想只写出加了别名的字段,可以调用此方法排除之 writer.setOnlyAlias(true); // 合并单元格后的标题行,使用默认标题样式 从0开始计算 writer.merge(writer.getHeaderAlias().size() - 1, fileName); // 一次性写出内容,使用默认样式,强制输出标题 writer.write(rows, true); // 自适应列宽 必须在列数据写出后调用 writer.autoSizeColumnAll(); //out为OutputStream,需要写出到的目标流 //response为HttpServletResponse对象 response.setContentType("application/vnd.ms-excel;charset=utf-8"); //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码 response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, StandardCharsets.UTF_8)); ServletOutputStream out = response.getOutputStream(); writer.flush(out, true); // 关闭writer,释放内存 writer.close(); //此处记得关闭输出Servlet流 IoUtil.close(out); } }