From f2f8bdd3e80d7f9f62264def15910e16802da05a Mon Sep 17 00:00:00 2001 From: wany <13995595726@qq.com> Date: Wed, 10 Jul 2024 10:20:51 +0800 Subject: [PATCH] =?UTF-8?q?easyexcel=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 + .../gunshi/project/xyt/util/ExcelUtil.java | 109 ++++++++++++++++++ .../project/xyt/util/VoteTitleHandler.java | 45 ++++++++ 3 files changed, 159 insertions(+) create mode 100644 src/main/java/com/gunshi/project/xyt/util/ExcelUtil.java create mode 100644 src/main/java/com/gunshi/project/xyt/util/VoteTitleHandler.java 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