PoiUtils.java 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package com.ichaoj.ams.common.util;
  2. import cn.hutool.core.date.DateUtil;
  3. import cn.hutool.core.io.IoUtil;
  4. import cn.hutool.poi.excel.ExcelUtil;
  5. import cn.hutool.poi.excel.ExcelWriter;
  6. import com.ichaoj.ams.response.statistics.SheetDTO;
  7. import org.apache.poi.ss.usermodel.Workbook;
  8. import org.apache.poi.util.IOUtils;
  9. import javax.servlet.ServletOutputStream;
  10. import javax.servlet.http.HttpServletResponse;
  11. import java.io.*;
  12. import java.net.URLEncoder;
  13. import java.util.List;
  14. /**
  15. * POI相关操作
  16. * @author cjwen
  17. */
  18. public class PoiUtils {
  19. /**
  20. * 导出多个 Sheet 页
  21. * @param response 响应
  22. * @param sheetList 页数据
  23. * @param fileName 文件名
  24. */
  25. public static void exportExcel(HttpServletResponse response, List<SheetDTO> sheetList, String fileName) {
  26. ExcelWriter bigWriter = ExcelUtil.getBigWriter();
  27. // 重命名第一个Sheet的名称,不然会默认多出一个Sheet1的页
  28. bigWriter.renameSheet(0, sheetList.get(0).getSheetName());
  29. for (SheetDTO sheet : sheetList) {
  30. // 指定要写出的 Sheet 页
  31. bigWriter.setSheet(sheet.getSheetName());
  32. List<Integer> columnWidth = sheet.getColumnWidth();
  33. if (columnWidth == null || columnWidth.size() != sheet.getFieldAndAlias().size()) {
  34. // 设置默认宽度
  35. for (int i = 0; i < sheet.getFieldAndAlias().size(); i++) {
  36. bigWriter.setColumnWidth(i, 25);
  37. }
  38. } else {
  39. // 设置自定义宽度
  40. for (int i = 0; i < columnWidth.size(); i++) {
  41. bigWriter.setColumnWidth(i, columnWidth.get(i));
  42. }
  43. }
  44. // 设置字段和别名
  45. bigWriter.setHeaderAlias(sheet.getFieldAndAlias());
  46. // 设置只导出有别名的字段
  47. bigWriter.setOnlyAlias(true);
  48. // 设置默认行高
  49. bigWriter.setDefaultRowHeight(18);
  50. // 设置冻结行
  51. bigWriter.setFreezePane(1);
  52. // 一次性写出内容,使用默认样式,强制输出标题
  53. bigWriter.write(sheet.getCollection(), true);
  54. // 设置所有列为自动宽度,不考虑合并单元格
  55. }
  56. ServletOutputStream out = null;
  57. try {
  58. //response为HttpServletResponse对象
  59. response.setContentType("application/vnd.ms-excel;charset=utf-8");
  60. response.setHeader("Content-Disposition",
  61. "attachment;filename=" +
  62. URLEncoder.encode(fileName + DateUtil.today() + ".xlsx", "UTF-8"));
  63. out = response.getOutputStream();
  64. bigWriter.flush(out, true);
  65. } catch (IOException e) {
  66. e.printStackTrace();
  67. } finally {
  68. // 关闭writer,释放内存
  69. bigWriter.close();
  70. }
  71. //此处记得关闭输出Servlet流
  72. IoUtil.close(out);
  73. }
  74. }