1.统一处理时间可选 数字
public class CommonExcelCellHandler implements CellWriteHandler {
private final static Logger log = LoggerFactory.getLogger(UserController.class);
/**
* 列名存储列表 数据量超过500时,会刷新缓存,表头会丢失,所以要存一下,以便查找
*/
private static final List<String> COLUMNS = new ArrayList<>();
private Map<Integer, Map<Integer, Integer>> CACHE = new HashMap<>();
/**
* 时间+日期样式存储 一个excel的sheet页,最多可以创建64000个样式,频繁创建会倒是程序报错
*/
private CellStyle dateTimeStyle;
/**
* 时间样式存储 一个excel的sheet页,最多可以创建64000个样式,频繁创建会倒是程序报错
*/
private CellStyle dateStyle;
/**
* 金额样式存储 一个excel的sheet页,最多可以创建64000个样式,频繁创建会倒是程序报错 数值类型有问题的,主要原因是 dto 里定义的是 String 类型导致,如果是
* double 与 Integer 类型则正常导出不需要传入处理
*/
private CellStyle numberStyle;
/**
* 需要处理日期列名
*/
private Object dateColumns;
/**
* 需要处理日期含时间的列名
*/
private Object dateTimeColumns;
/**
* 需要处理数值的列名
*/
private Object numberColumns;
/**
* 列宽时需要乘256
*/
private Integer widthCommon = 256;
/**
* 初始化参数 注意:数值类型传入前提是列dto里数值类型的字段定义的是字符串类型(如果定义的是double或intger则不需要转换)
*
* @param map 传入需要特殊处理的三个类型 dateColumns、dateTimeColumns、numberColumns
*/
public CommonExcelCellHandler(Map<String, Object> map) {
COLUMNS.clear();
dateTimeStyle = null;
dateStyle = null;
numberStyle = null;
this.dateColumns = map.get("dateColumns");
this.dateTimeColumns = map.get("dateTimeColumns");
this.numberColumns = map.get("numberColumns");
}
@Override
public void beforeCellCreate(WriteSheetHolder writeSheetHolder,
WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex,
Integer relativeRowIndex, Boolean isHead) {
}
@Override
public void afterCellCreate(WriteSheetHolder writeSheetHolder,
WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex,
Boolean isHead) {
}
@Override
public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {
}
@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder,
WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head,
Integer relativeRowIndex, Boolean isHead) {
// 列宽
int width = 20;
boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);
if (needSetWidth) {
Map<Integer, Integer> maxColumnWidthMap = CACHE.get(writeSheetHolder.getSheetNo());
if (maxColumnWidthMap == null) {
maxColumnWidthMap = new HashMap<>();
CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);