diff --git a/pom.xml b/pom.xml
index a2ebcc1..65162e7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -60,6 +60,11 @@
commons-net
3.3
+
+ com.alibaba
+ easyexcel
+ 3.1.1
+
diff --git a/src/main/java/com/gunshi/project/xyt/util/ExcelUtil.java b/src/main/java/com/gunshi/project/xyt/util/ExcelUtil.java
new file mode 100644
index 0000000..41d30a1
--- /dev/null
+++ b/src/main/java/com/gunshi/project/xyt/util/ExcelUtil.java
@@ -0,0 +1,109 @@
+package com.gunshi.project.xyt.util;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.io.resource.ClassPathResource;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import jakarta.servlet.http.HttpServletResponse;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.Map;
+
+public class ExcelUtil {
+
+ /**
+ * 导出excel
+ *
+ * @param list 导出数据集合,加动态表头
+ * @param filename 工作表的名称
+ * @param clazz 实体类
+ * @param response 响应体
+ */
+ public static void exportExcel(List list, String filename, Class clazz, HttpServletResponse response,String sheetName) {
+ OutputStream out = null;
+ try {
+ out = getOutputStream(filename,response);
+ ExcelWriterSheetBuilder builder = EasyExcel.write(out, clazz)
+ //是否自动关闭流
+ .autoCloseStream(Boolean.FALSE)
+ //自动列宽(不太精确)
+ .registerWriteHandler(new VoteTitleHandler(filename))
+ .sheet(sheetName);
+ builder.doWrite(list);
+ } finally {
+ try {
+ if (out != null){
+ out.flush();
+ out.close();
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("导出Excel异常");
+ }
+ }
+ }
+
+
+
+ /**
+ * 单表多数据模板导出 模板格式为 {.属性}
+ *
+ * @param filename 文件名
+ * @param templatePath 模板路径 resource 目录下的路径包括模板文件名
+ * 例如: excel/temp.xlsx
+ * 重点: 模板文件必须放置到启动类对应的 resource 目录下
+ * @param data 模板需要的数据
+ * @param list 模板需要的集合数据
+ */
+ public static void exportTemplate(Map data, List list, String filename, String templatePath, HttpServletResponse response) {
+ OutputStream out = null;
+ try {
+ out = getOutputStream(filename,response);
+ ClassPathResource templateResource = new ClassPathResource(templatePath);
+ ExcelWriter excelWriter = EasyExcel.write(out)
+ .withTemplate(templateResource.getStream())
+ .excelType(ExcelTypeEnum.XLSX)
+ .build();
+ WriteSheet writeSheet = EasyExcel.writerSheet().build();
+ if (CollUtil.isEmpty(data)) {
+ throw new IllegalArgumentException("数据为空");
+ }
+ excelWriter.fill(list,writeSheet);
+ excelWriter.fill(data, writeSheet);
+ excelWriter.finish();
+ } finally {
+ try {
+ if (out != null){
+ out.flush();
+ out.close();
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("导出Excel异常");
+ }
+ }
+ }
+
+ private static OutputStream getOutputStream(String fileName, HttpServletResponse response) {
+ try {
+ fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8);
+ response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
+ response.setCharacterEncoding("utf8");
+ response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx");
+ response.setHeader("Pragma", "public");
+ response.setHeader("Cache-Control", "no-store");
+ response.addHeader("Cache-Control", "max-age=0");
+ return response.getOutputStream();
+ } catch (IOException e) {
+ System.out.println(e.getMessage());
+ }
+ return null;
+ }
+
+
+}
diff --git a/src/main/java/com/gunshi/project/xyt/util/VoteTitleHandler.java b/src/main/java/com/gunshi/project/xyt/util/VoteTitleHandler.java
new file mode 100644
index 0000000..2962029
--- /dev/null
+++ b/src/main/java/com/gunshi/project/xyt/util/VoteTitleHandler.java
@@ -0,0 +1,45 @@
+package com.gunshi.project.xyt.util;
+
+import com.alibaba.excel.metadata.Head;
+import com.alibaba.excel.write.handler.CellWriteHandler;
+import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
+import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import org.apache.poi.ss.usermodel.Row;
+import org.springframework.util.PropertyPlaceholderHelper;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Properties;
+
+
+public class VoteTitleHandler implements CellWriteHandler {
+
+ private String title;
+
+ private String describe;
+
+ private Date voteTime;
+
+ PropertyPlaceholderHelper placeholderHelper = new PropertyPlaceholderHelper("${", "}");
+
+ public VoteTitleHandler(String title) {
+ this.title = title;
+ }
+
+ @Override
+ public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
+ Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {
+ if (head != null) {
+ List headNameList = head.getHeadNameList();
+ if (CollectionUtils.isNotEmpty(headNameList)) {
+ Properties properties = new Properties();
+ properties.setProperty("title", title);
+ for (int i = 0; i < headNameList.size(); i++) {
+ headNameList.set(i, placeholderHelper.replacePlaceholders(headNameList.get(i), properties));
+ }
+ }
+ }
+ }
+
+}
\ No newline at end of file