EasyExcelUtil.java 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package com.sqx.modules.utils.excel;
  2. import cn.hutool.core.date.DateUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.alibaba.excel.EasyExcel;
  5. import com.alibaba.excel.converters.longconverter.LongStringConverter;
  6. import com.alibaba.excel.write.builder.ExcelWriterBuilder;
  7. import com.sqx.common.exception.SqxException;
  8. import lombok.extern.slf4j.Slf4j;
  9. import org.springframework.web.context.request.RequestContextHolder;
  10. import org.springframework.web.context.request.ServletRequestAttributes;
  11. import javax.servlet.http.HttpServletResponse;
  12. import java.io.IOException;
  13. import java.net.URLEncoder;
  14. import java.util.Date;
  15. import java.util.List;
  16. /**
  17. * easyexcel工具类
  18. * @author codingliang
  19. * @date 2025-09-16
  20. */
  21. @Slf4j
  22. public class EasyExcelUtil {
  23. /**
  24. * 导出Excel文件
  25. * @param dataList 数据列表
  26. * @param clazz 数据类的Class对象
  27. * @param fileName 文件名(不含后缀)
  28. * @param sheetName 工作表名称
  29. * @throws IOException IO异常
  30. */
  31. public static <T> void exportExcel(List<T> dataList, Class<T> clazz, String fileName, String sheetName) {
  32. try {
  33. ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  34. if (requestAttributes == null) {
  35. throw new SqxException("无法获取响应对象");
  36. }
  37. HttpServletResponse response = requestAttributes.getResponse();
  38. // 设置响应头
  39. setResponseHeader(response, fileName);
  40. ExcelWriterBuilder writerBuilder = EasyExcel.write(response.getOutputStream(), clazz);
  41. writerBuilder.sheet(sheetName);
  42. EasyExcel.write(response.getOutputStream(), clazz)
  43. .sheet(sheetName)
  44. .registerConverter(new LongStringConverter())
  45. .doWrite(dataList);
  46. } catch (IOException e) {
  47. log.error("Excel导出失败:{}", e.getMessage());
  48. throw new SqxException("Excel导出失败:" + e.getMessage());
  49. }
  50. }
  51. /**
  52. * 设置响应头,包括内容类型和文件名
  53. */
  54. private static void setResponseHeader(HttpServletResponse response, String fileName) throws IOException {
  55. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
  56. response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
  57. response.setCharacterEncoding("UTF-8");
  58. // 如果文件名为空,使用默认名称
  59. if (StrUtil.isBlank(fileName)) {
  60. fileName = "导出数据";
  61. }
  62. // 添加时间戳,避免文件名重复
  63. fileName += "_" + DateUtil.format(new Date(), "yyyyMMddHHmmss");
  64. // URL编码,避免中文乱码
  65. String encodedFileName = URLEncoder.encode(fileName, "UTF-8");
  66. response.setHeader("Content-disposition", "attachment;filename=" + encodedFileName + ".xlsx");
  67. }
  68. }