package cn.dmp.common.easycode;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.json.JSONUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.poi.ss.usermodel.*;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@Component
@Slf4j
public class EasyCodeUtils {
public static final String ALLOW_ERR = "1"; // 允许容错
private static Map<String, DataConverter> converters = new HashMap<>();
public EasyCodeUtils(List<DataConverter> converterList) {
for (DataConverter dataConverter : converterList) {
converters.put(dataConverter.getConverterName(), dataConverter);
log.info("Registering converter {}", dataConverter.getConverterName());
}
}
/**
* EasyCode模板工具类
*
* @param workbook
* @param blod
* @return
*/
public static CellStyle borderStyle(Workbook workbook, boolean blod, boolean isErr) {
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.cloneStyleFrom(cellStyle);
cellStyle.setBorderBottom(BorderStyle.THIN);
cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
cellStyle.setBorderLeft(BorderStyle.THIN);
cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
cellStyle.setBorderRight(BorderStyle.THIN);
cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
cellStyle.setBorderTop(BorderStyle.THIN);
cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
// 指定单元格格式为文本
DataFormat dataFormat = workbook.createDataFormat();
cellStyle.setDataFormat(dataFormat.getFormat("@"));
// 设置单元格字体样式
Font font = workbook.createFont();
if (blod) {
font.setBold(true); // 加粗
}
if (isErr) {
font.setColor(Font.COLOR_RED);
}
cellStyle.setFont(font);
// 设置单元格垂直居中
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
cellStyle.setAlignment(HorizontalAlignment.CENTER);
return cellStyle;
}
private static void setHeader(List<String> cols, Workbook workbook, Sheet sheet) throws IOException {
Row header = sheet.createRow(0);
int i = 0;
for (String title : cols) {
Cell cell = header.createCell(i, CellType.STRING);
cell.setCellValue(title);
cell.setCellStyle(borderStyle(workbook, true, false));
sheet.setColumnWidth(i, 500 * 10);
i++;
}
}
public static <T> void easyTemplateExport(HttpServletResponse response, Class<T> clazz) throws IOException {
List<EasyCodeConfig> exportFields = getAnnoFields(clazz, false);
ExcelWriter writer = ExcelUtil.getWriter(true);
writer.renameSheet(0, "导入模板");
Workbook workbook = writer.getWorkbook();
Sheet sheet = workbook.getSheetAt(0);
Row nexrow = sheet.createRow(1);
nexrow.setHeight((short) 400);
List<String> headers = exportFields.stream().map(EasyCodeConfig::title).collect(Collectors.toList());
setHeader(headers, workbook, sheet);
int i = 0;
for (EasyCodeConfig config : exportFields) {
Cell cellnext = nexrow.createCell(i, CellType.STRING);
cellnext.setCellValue(config.tip());
cellnext.setCellStyle(borderStyle(workbook, false, false));
sheet.setColumnWidth(i, 500 * 10);
i++;
}
String fileName = URLEncoder.encode("导入模板" + ".xlsx", "UTF-8");
//设置响应头中文件的下载方式为附件方式,以及设置文件名
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
writer.flush(response.getOutputStream());
}
public static <T> void easyDataExport(List<T> datas, HttpServletResponse response, Class<T> clazz) throws IOException {
List<EasyCodeConfig> exportFields = getAnnoFields(clazz, false);
ExcelWriter writer = ExcelUtil.getWriter(true);
writer.renameSheet(0, "导入模板");
Workbook workbook = writer.getWorkbook();
Sheet sheet = workbook.getSheetAt(0);
List<String> headers = exportFields.stream().map(EasyCodeConfig::title).collect(Collectors.toList());
setHeader(headers, workbook, sheet);
int rowNum = 1;
for (Object record : datas) {
Map<String, Object> map = BeanUtil.beanToMap(record);
Row row = sheet.createRow(rowNum);
int colNum = 0;
for (EasyCodeConfig config : exportFields) {
Object val = map.get(config.propName());
DataConverter converter = converters.get(config.type());
if (converter != null) {
Cell cellnext = row.createCell(colNum, CellType.STRING);
cellnext.setCellValue(converter.jdbc2Excel(val, config));
cellnext.setCellStyle(borderStyle(workbook, false, false));
} else {
// 处理未知类型或转换器不存在的情况
throw new RuntimeException("未知类型或转换器不存在:" + config.type());
}
sheet.setColumnWidth(colNum, 500 * 10);
colNum++;
}
rowNum++;
}
String fileName = URLEncoder.encode("导出数据" + DateFormatUtils.format(new Date(), "HHmmss") + ".xlsx", "UTF-8");
//设置响应头中文件的下载方式为附件方式,以及设置文件名
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
writer.flush(response.getOutputStream());
writer.close();
}
private static <T> List<EasyCodeConfig> getAnnoFields(Class<T> clazz, boolean isImport) {
Field[] declaredFields = clazz.getDeclaredFields();
return Arrays.stream(declaredFields).map(field -> {
EasyCodeConfig annotation = field.getAnnotation(EasyCodeConfig.class);
if (annotation != null && ((isImport && annotation.isImport()) || (!isImport && annotation.isExport()))) {
return annotation;
}
return null;
}).filter(Objects::nonNull).collect(Collectors.toList());
}
public static <T> EasyCodeResult easyDataHandel(Sheet sheet, Class<T> clazz) {
Map<String, String> errMaps = new HashMap<>();
Map<String, Integer> headerIndex = new HashMap<>();
EasyCodeResult result = new EasyCodeResult();
Row header = sheet.getRow(0);
if (header == null) {
throw new RuntimeException("标题行为空!");
}
List<EasyCodeConfig> importFields = getAnnoFields(clazz, false);
HashMap<String, EasyCodeConfig> filedCols = new HashMap<>();
for (EasyCodeConfig importField : importFields) {
filedCols.put(importField.comment(), importField);
}
short lastCellNum = header.getLastCellNum();
int lastRowNum = sheet.getLastRowNum();
result.setRowsCount(lastRowNum);
result.setColsCount(Integer.parseInt(lastCellNum + ""));
if (lastRowNum <= 0) {
throw new RuntimeException("导入文件数
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1、接口类默认继承实体类 实体类不做任何修改保证类与表统一,不使用冗余的vo dto,一个dto解决所有问题 2、实体类涵盖多种注解 日期格式编码、Long类型转String、字段自动填充、validate校验 3、自带insertOrUpdateBatch方法 4、自动生成前端的增删改查页面 (vue 2.x,前端模板由于基础框架原因,需要自己稍微改动一下,之后可以直接生成) 5、牛逼的导入导出解决方案 支持导出模板、导出数据 支持导入校验,字符长度校验,日期类型校验,布尔类型校验,小数精度校验 上传文件,如果异常会返回批改后的文件(红色字体批注) 容错导入,正常数据会自动导入,异常数据会批改后返回 详情见 https://blog.csdn.net/java_creatMylief/article/details/135412341
资源推荐
资源详情
资源评论
收起资源包目录
easycode模板.rar (15个子文件)
easycode
EasyCodeUtils.java 13KB
converters
TextConverter.java 656B
TinyIntConverter.java 1KB
VarcharConverter.java 956B
DateConverter.java 1KB
DecimalConverter.java 1KB
DateTimeConverter.java 1KB
BigIntConverter.java 743B
IntConverter.java 739B
EasyValidateGroup.java 268B
EasyCodeConfig.java 561B
EasyCodeResult.java 379B
DataConverter.java 631B
model.json 87KB
index.js 8KB
共 15 条
- 1
资源评论
qzWsong
- 粉丝: 129
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功