ExportServiceImpl.java 2.0 KB

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