From 2f566b2d1a2d79be08f95c1f2a304c8658210ea6 Mon Sep 17 00:00:00 2001 From: xuyuxiang Date: Mon, 6 Mar 2023 14:24:33 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E6=9B=B4=E6=96=B0=E3=80=91=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E7=94=A8=E6=88=B7=E5=AF=BC=E5=87=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../excel/CommonExcelCustomMergeStrategy.java | 112 +++++++++++++++ .../user/result/SysUserExportResult.java | 132 ++++++++++++------ .../user/service/impl/SysUserServiceImpl.java | 96 ++++++++++++- 3 files changed, 292 insertions(+), 48 deletions(-) create mode 100644 snowy-common/src/main/java/vip/xiaonuo/common/excel/CommonExcelCustomMergeStrategy.java diff --git a/snowy-common/src/main/java/vip/xiaonuo/common/excel/CommonExcelCustomMergeStrategy.java b/snowy-common/src/main/java/vip/xiaonuo/common/excel/CommonExcelCustomMergeStrategy.java new file mode 100644 index 00000000..c0361a56 --- /dev/null +++ b/snowy-common/src/main/java/vip/xiaonuo/common/excel/CommonExcelCustomMergeStrategy.java @@ -0,0 +1,112 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.common.excel; + +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.write.merge.AbstractMergeStrategy; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.util.CellRangeAddress; + +import java.util.ArrayList; +import java.util.List; + +/** + * EasyExcel自定义合并策略 该类继承了AbstractMergeStrategy抽象合并策略,需要重写merge()方法 + * + * @author xuyuxiang + * @date 2023/3/6 13:21 + **/ +public class CommonExcelCustomMergeStrategy extends AbstractMergeStrategy { + + /** + * 分组,每几行合并一次 + */ + private final List exportFieldGroupCountList; + + /** + * 目标合并列index + */ + private final Integer targetColumnIndex; + + /** + * 需要开始合并单元格的首行index + */ + private Integer rowIndex; + + /** + * exportDataList为待合并目标列的值 + * + * @author xuyuxiang + * @date 2023/3/6 13:23 + **/ + public CommonExcelCustomMergeStrategy(List exportDataList, Integer targetColumnIndex) { + this.exportFieldGroupCountList = getGroupCountList(exportDataList); + this.targetColumnIndex = targetColumnIndex; + } + + + @Override + protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) { + + if (null == rowIndex) { + rowIndex = cell.getRowIndex(); + } + // 仅从首行以及目标列的单元格开始合并,忽略其他 + if (cell.getRowIndex() == rowIndex && cell.getColumnIndex() == targetColumnIndex) { + mergeGroupColumn(sheet); + } + } + + private void mergeGroupColumn(Sheet sheet) { + int rowCount = rowIndex; + for (Integer count : exportFieldGroupCountList) { + if(count == 1) { + rowCount += count; + continue ; + } + // 合并单元格 + CellRangeAddress cellRangeAddress = new CellRangeAddress(rowCount, rowCount + count - 1, targetColumnIndex, targetColumnIndex); + sheet.addMergedRegionUnsafe(cellRangeAddress); + rowCount += count; + } + } + + /* + * 该方法将目标列根据值是否相同连续可合并,存储可合并的行数 + * + * @author xuyuxiang + * @date 2023/3/6 13:23 + **/ + private List getGroupCountList(List exportDataList){ + if (CollectionUtils.isEmpty(exportDataList)) { + return new ArrayList<>(); + } + + List groupCountList = new ArrayList<>(); + int count = 1; + + for (int i = 1; i < exportDataList.size(); i++) { + if (exportDataList.get(i).equals(exportDataList.get(i - 1))) { + count++; + } else { + groupCountList.add(count); + count = 1; + } + } + // 处理完最后一条后 + groupCountList.add(count); + return groupCountList; + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserExportResult.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserExportResult.java index 00d83a06..8f46193c 100644 --- a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserExportResult.java +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/result/SysUserExportResult.java @@ -14,6 +14,9 @@ package vip.xiaonuo.sys.modular.user.result; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.format.DateTimeFormat; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.HeadStyle; +import com.alibaba.excel.enums.poi.FillPatternTypeEnum; import lombok.Getter; import lombok.Setter; @@ -29,169 +32,216 @@ import java.util.Date; @Setter public class SysUserExportResult { + /** 机构分组 */ + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 40) + @ExcelProperty({"用户信息", "机构分组"}) + private String groupName; + /** 头像 */ - @ExcelProperty({"基本信息", "头像"}) + @ColumnWidth(8) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "头像"}) private byte[] avatar; /** 账号 */ - @ExcelProperty({"基本信息", "账号"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "账号"}) private String account; /** 姓名 */ - @ExcelProperty({"基本信息", "姓名"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "姓名"}) private String name; /** 昵称 */ - @ExcelProperty({"基本信息", "昵称"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "昵称"}) private String nickname; /** 性别 */ - @ExcelProperty({"基本信息", "性别"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "性别"}) private String gender; /** 年龄 */ - @ExcelProperty({"基本信息", "年龄"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "年龄"}) private String age; /** 出生日期 */ - @ExcelProperty({"基本信息", "出生日期"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "出生日期"}) private String birthday; /** 民族 */ - @ExcelProperty({"基本信息", "民族"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "民族"}) private String nation; /** 籍贯 */ - @ExcelProperty({"基本信息", "籍贯"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "籍贯"}) private String nativePlace; /** 家庭住址 */ - @ExcelProperty({"基本信息", "家庭住址"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "家庭住址"}) private String homeAddress; /** 通信地址 */ - @ExcelProperty({"基本信息", "通信地址"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "通信地址"}) private String mailingAddress; /** 证件类型 */ - @ExcelProperty({"基本信息", "证件类型"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "证件类型"}) private String idCardType; /** 证件号码 */ - @ExcelProperty({"基本信息", "证件号码"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "证件号码"}) private String idCardNumber; /** 文化程度 */ - @ExcelProperty({"基本信息", "文化程度"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "文化程度"}) private String cultureLevel; /** 政治面貌 */ - @ExcelProperty({"基本信息", "政治面貌"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "政治面貌"}) private String politicalOutlook; /** 毕业院校 */ - @ExcelProperty({"基本信息", "毕业院校"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "毕业院校"}) private String college; /** 学历 */ - @ExcelProperty({"基本信息", "学历"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "学历"}) private String education; /** 学制 */ - @ExcelProperty({"基本信息", "学制"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "学制"}) private String eduLength; /** 学位 */ - @ExcelProperty({"基本信息", "学位"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "学位"}) private String degree; /** 手机 */ - @ExcelProperty({"基本信息", "手机"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "手机"}) private String phone; /** 邮箱 */ - @ExcelProperty({"基本信息", "邮箱"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "邮箱"}) private String email; /** 家庭电话 */ - @ExcelProperty({"基本信息", "家庭电话"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "家庭电话"}) private String homeTel; /** 办公电话 */ - @ExcelProperty({"基本信息", "办公电话"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "办公电话"}) private String officeTel; /** 紧急联系人 */ - @ExcelProperty({"基本信息", "紧急联系人"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "紧急联系人"}) private String emergencyContact; /** 紧急联系人电话 */ - @ExcelProperty({"基本信息", "紧急联系人电话"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "紧急联系人电话"}) private String emergencyPhone; /** 紧急联系人地址 */ - @ExcelProperty({"基本信息", "紧急联系人地址"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 29) + @ExcelProperty({"用户信息", "基本信息", "紧急联系人地址"}) private String emergencyAddress; /** 员工编号 */ - @ExcelProperty({"员工信息", "员工编号"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 34) + @ExcelProperty({"用户信息", "员工信息", "员工编号"}) private String empNo; /** 入职日期 */ - @ExcelProperty({"员工信息", "入职日期"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 34) + @ExcelProperty({"用户信息", "员工信息", "入职日期"}) private String entryDate; /** 组织名称 */ - @ExcelProperty({"员工信息", "组织名称"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 34) + @ExcelProperty({"用户信息", "员工信息", "组织名称"}) private String orgName; /** 职位名称 */ - @ExcelProperty({"员工信息", "职位名称"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 34) + @ExcelProperty({"用户信息", "员工信息", "职位名称"}) private String positionName; /** 主管名称 */ - @ExcelProperty({"员工信息", "主管名称"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 34) + @ExcelProperty({"用户信息", "员工信息", "主管名称"}) private String directorName; /** 职级 */ - @ExcelProperty({"员工信息", "职级"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 34) + @ExcelProperty({"用户信息", "员工信息", "职级"}) private String positionLevel; /** 上次登录ip */ - @ExcelProperty({"系统信息", "上次登录ip"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 42) + @ExcelProperty({"用户信息", "系统信息", "上次登录ip"}) private String lastLoginIp; /** 上次登录地点 */ - @ExcelProperty({"系统信息", "上次登录地点"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 42) + @ExcelProperty({"用户信息", "系统信息", "上次登录地点"}) private String lastLoginAddress; /** 上次登录时间 */ + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 42) @DateTimeFormat("yyyy-MM-dd HH:mm:ss") - @ExcelProperty({"系统信息", "上次登录时间"}) + @ExcelProperty({"用户信息", "系统信息", "上次登录时间"}) private Date lastLoginTime; /** 上次登录设备 */ - @ExcelProperty({"系统信息", "上次登录设备"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 42) + @ExcelProperty({"用户信息", "系统信息", "上次登录设备"}) private String lastLoginDevice; /** 最新登录ip */ - @ExcelProperty({"系统信息", "最新登录ip"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 42) + @ExcelProperty({"用户信息", "系统信息", "最新登录ip"}) private String latestLoginIp; /** 最新登录地点 */ - @ExcelProperty({"系统信息", "最新登录地点"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 42) + @ExcelProperty({"用户信息", "系统信息", "最新登录地点"}) private String latestLoginAddress; /** 最新登录时间 */ + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 42) @DateTimeFormat("yyyy-MM-dd HH:mm:ss") - @ExcelProperty({"系统信息", "最新登录时间"}) + @ExcelProperty({"用户信息", "系统信息", "最新登录时间"}) private Date latestLoginTime; /** 最新登录设备 */ - @ExcelProperty({"系统信息", "最新登录设备"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 42) + @ExcelProperty({"用户信息", "系统信息", "最新登录设备"}) private String latestLoginDevice; /** 用户状态 */ - @ExcelProperty(value = {"系统信息", "用户状态"}) + @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 42) + @ExcelProperty({"用户信息", "系统信息", "用户状态"}) private String userStatus; } diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/service/impl/SysUserServiceImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/service/impl/SysUserServiceImpl.java index b08edbc7..449588f7 100644 --- a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/service/impl/SysUserServiceImpl.java +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/service/impl/SysUserServiceImpl.java @@ -35,9 +35,14 @@ import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.context.AnalysisContext; -import com.alibaba.excel.read.listener.ReadListener; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.write.handler.CellWriteHandler; +import com.alibaba.excel.write.handler.context.CellWriteHandlerContext; +import com.alibaba.excel.write.metadata.style.WriteCellStyle; +import com.alibaba.excel.write.metadata.style.WriteFont; +import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; +import com.alibaba.excel.write.style.row.AbstractRowHeightStyleStrategy; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -45,11 +50,13 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fhs.trans.service.impl.TransService; +import org.apache.poi.ss.usermodel.*; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import vip.xiaonuo.common.cache.CommonCacheOperator; import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.excel.CommonExcelCustomMergeStrategy; import vip.xiaonuo.common.exception.CommonException; import vip.xiaonuo.common.listener.CommonDataChangeEventCenter; import vip.xiaonuo.common.page.CommonPageRequest; @@ -89,10 +96,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; /** @@ -979,10 +983,12 @@ public class SysUserServiceImpl extends ServiceImpl impl String fileName = "SNOWY2.0系统B端用户信息清单.xlsx"; List sysUserList = this.list(queryWrapper); transService.transBatch(sysUserList); + sysUserList = CollectionUtil.sort(sysUserList, Comparator.comparing(SysUser::getOrgId)); List sysUserExportResultList = sysUserList.stream() .map(sysUser -> { SysUserExportResult sysUserExportResult = new SysUserExportResult(); BeanUtil.copyProperties(sysUser, sysUserExportResult); + sysUserExportResult.setGroupName(sysUserExportResult.getOrgName()); // 状态枚举转为文字 sysUserExportResult.setUserStatus(sysUserExportResult.getUserStatus() .equalsIgnoreCase(SysUserStatusEnum.ENABLE.getValue())?"正常":"停用"); @@ -993,11 +999,87 @@ public class SysUserServiceImpl extends ServiceImpl impl }).collect(Collectors.toList()); // 创建临时文件 tempFile = FileUtil.file(FileUtil.getTmpDir() + FileUtil.FILE_SEPARATOR + fileName); + + // 头的策略 + WriteCellStyle headWriteCellStyle = new WriteCellStyle(); + WriteFont headWriteFont = new WriteFont(); + headWriteFont.setFontHeightInPoints((short) 14); + headWriteCellStyle.setWriteFont(headWriteFont); + // 水平垂直居中 + headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); + headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + + // 内容的策略 + WriteCellStyle contentWriteCellStyle = new WriteCellStyle(); + // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定 + contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND); + // 内容背景白色 + contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex()); + WriteFont contentWriteFont = new WriteFont(); + + // 内容字体大小 + contentWriteFont.setFontHeightInPoints((short) 12); + contentWriteCellStyle.setWriteFont(contentWriteFont); + + //设置边框样式,细实线 + contentWriteCellStyle.setBorderLeft(BorderStyle.THIN); + contentWriteCellStyle.setBorderTop(BorderStyle.THIN); + contentWriteCellStyle.setBorderRight(BorderStyle.THIN); + contentWriteCellStyle.setBorderBottom(BorderStyle.THIN); + + // 水平垂直居中 + contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT); + contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + + // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现 + HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, + contentWriteCellStyle); + // 写excel EasyExcel.write(tempFile.getPath(), SysUserExportResult.class) + // 自定义样式 + .registerWriteHandler(horizontalCellStyleStrategy) // 自动列宽 .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) - .sheet("用户信息").doWrite(sysUserExportResultList); + // 机构分组合并单元格 + .registerWriteHandler(new CommonExcelCustomMergeStrategy(sysUserExportResultList.stream().map(SysUserExportResult::getGroupName) + .collect(Collectors.toList()), 0)) + // 设置第一行字体 + .registerWriteHandler(new CellWriteHandler() { + @Override + public void afterCellDispose(CellWriteHandlerContext context) { + WriteCellData cellData = context.getFirstCellData(); + WriteCellStyle writeCellStyle = cellData.getOrCreateStyle(); + Integer rowIndex = context.getRowIndex(); + if(rowIndex == 0) { + WriteFont headWriteFont = new WriteFont(); + headWriteFont.setFontName("宋体"); + headWriteFont.setBold(true); + headWriteFont.setFontHeightInPoints((short) 16); + writeCellStyle.setWriteFont(headWriteFont); + } + } + }) + // 设置表头行高 + .registerWriteHandler(new AbstractRowHeightStyleStrategy() { + @Override + protected void setHeadColumnHeight(Row row, int relativeRowIndex) { + if(relativeRowIndex == 0) { + // 表头第一行 + row.setHeightInPoints(34); + } else { + // 表头其他行 + row.setHeightInPoints(30); + } + } + @Override + protected void setContentColumnHeight(Row row, int relativeRowIndex) { + // 内容行 + row.setHeightInPoints(20); + } + }) + .sheet("用户信息") + .doWrite(sysUserExportResultList); CommonDownloadUtil.download(tempFile, response); } catch (Exception e) { e.printStackTrace();