【更新】完成用户导出功能

pull/87/head
xuyuxiang 2023-03-06 14:24:33 +08:00
parent eb7b68e2e5
commit 2f566b2d1a
3 changed files with 292 additions and 48 deletions

View File

@ -0,0 +1,112 @@
/*
* Copyright [2022] [https://www.xiaonuo.vip]
*
* SnowyAPACHE 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 AbstractMergeStrategymerge()
*
* @author xuyuxiang
* @date 2023/3/6 13:21
**/
public class CommonExcelCustomMergeStrategy extends AbstractMergeStrategy {
/**
*
*/
private final List<Integer> exportFieldGroupCountList;
/**
* index
*/
private final Integer targetColumnIndex;
/**
* index
*/
private Integer rowIndex;
/**
* exportDataList
*
* @author xuyuxiang
* @date 2023/3/6 13:23
**/
public CommonExcelCustomMergeStrategy(List<String> 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<Integer> getGroupCountList(List<String> exportDataList){
if (CollectionUtils.isEmpty(exportDataList)) {
return new ArrayList<>();
}
List<Integer> 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;
}
}

View File

@ -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;
}

View File

@ -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<SysUserMapper, SysUser> impl
String fileName = "SNOWY2.0系统B端用户信息清单.xlsx";
List<SysUser> sysUserList = this.list(queryWrapper);
transService.transBatch(sysUserList);
sysUserList = CollectionUtil.sort(sysUserList, Comparator.comparing(SysUser::getOrgId));
List<SysUserExportResult> 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<SysUserMapper, SysUser> 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();