EasyExcelDashboardUtils.java 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package com.zhiyun.common.utils;
  2. import com.alibaba.excel.EasyExcel;
  3. import com.alibaba.excel.ExcelWriter;
  4. import com.alibaba.excel.metadata.Head;
  5. import com.alibaba.excel.metadata.data.WriteCellData;
  6. import com.alibaba.excel.write.metadata.WriteSheet;
  7. import com.alibaba.excel.write.metadata.WriteTable;
  8. import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
  9. import com.alibaba.excel.write.metadata.style.WriteCellStyle;
  10. import com.alibaba.excel.write.metadata.style.WriteFont;
  11. import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
  12. import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
  13. import com.alibaba.excel.write.style.column.SimpleColumnWidthStyleStrategy;
  14. import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.apache.poi.ss.usermodel.*;
  17. import javax.servlet.http.HttpServletResponse;
  18. import java.net.URLEncoder;
  19. import java.util.List;
  20. /**
  21. * @author yxk
  22. * @since 2024/4/3 22:39
  23. */
  24. @Slf4j
  25. public class EasyExcelDashboardUtils {
  26. public static AbstractColumnWidthStyleStrategy getColumnWidthStrategy(int size) {
  27. return new AbstractColumnWidthStyleStrategy() {
  28. @Override
  29. protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer integer, Boolean isHead) {
  30. boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);
  31. if (needSetWidth) {
  32. Sheet sheet = writeSheetHolder.getSheet();
  33. for (int i = 0; i < size; i++) {
  34. sheet.setColumnWidth(i + 2, 3000);
  35. }
  36. }
  37. }
  38. };
  39. }
  40. /**
  41. * 导出Excel
  42. */
  43. public static void export(String fileName, List<List<String>> head, List<List<Object>> content, HttpServletResponse response) {
  44. try {
  45. fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
  46. response.setCharacterEncoding("utf-8");
  47. response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
  48. ExcelWriter writer = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new SimpleColumnWidthStyleStrategy(15)).registerWriteHandler(EasyExcelDashboardUtils.getCellStyleStrategy()).build();
  49. // 动态添加表头,适用一些表头动态变化的场景
  50. WriteSheet sheet = new WriteSheet();
  51. sheet.setSheetName("数据");
  52. // 创建一个表格,用于 Sheet 中使用
  53. WriteTable table = new WriteTable();
  54. table.setHead(head);
  55. // 写数据
  56. writer.write(content, sheet, table);
  57. writer.finish();
  58. } catch (Exception e) {
  59. log.error("导出{}异常:", fileName, e);
  60. }
  61. }
  62. /**
  63. * 样式策略
  64. */
  65. public static HorizontalCellStyleStrategy getCellStyleStrategy() {
  66. return new HorizontalCellStyleStrategy(headStyle(), contentStyle());
  67. }
  68. /**
  69. * 标题样式
  70. */
  71. private static WriteCellStyle headStyle() {
  72. // 头的策略
  73. WriteCellStyle headWriteCellStyle = new WriteCellStyle();
  74. //字体
  75. WriteFont writeFont = new WriteFont();
  76. // 加粗
  77. writeFont.setBold(false);
  78. //字体
  79. writeFont.setFontName("黑体");
  80. headWriteCellStyle.setWriteFont(writeFont);
  81. // 背景色
  82. headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE1.getIndex());
  83. return headWriteCellStyle;
  84. }
  85. /**
  86. * 内容样式
  87. */
  88. private static WriteCellStyle contentStyle() {
  89. // 内容的策略
  90. WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
  91. // 字体策略
  92. WriteFont writeFont = new WriteFont();
  93. writeFont.setFontName("黑体");
  94. writeFont.setFontHeightInPoints((short) 12);
  95. contentWriteCellStyle.setWriteFont(writeFont);
  96. //导出数据垂直居中
  97. contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  98. //导出数据水平居中
  99. contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
  100. //边框
  101. contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
  102. contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
  103. contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
  104. contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
  105. return contentWriteCellStyle;
  106. }
  107. }