- 导出表格功能
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
EasyExcel.write(byteArrayOutputStream, ExportVO.class).sheet("data").registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).registerWriteHandler(new CommonExcelCellHandler(ExportVO.getHandleColumns())).doWrite(dataList);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
- ExportVO
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.NumberFormat;
import com.alibaba.excel.annotation.write.style.ContentStyle;
import com.alibaba.excel.annotation.write.style.HeadFontStyle;
import com.alibaba.excel.annotation.write.style.HeadStyle;
import com.alibaba.excel.enums.BooleanEnum;
import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum;
import com.shoplife.life.didi.util.DateConverter;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@HeadFontStyle(fontName = "宋体",bold = BooleanEnum.FALSE,fontHeightInPoints =11)
@HeadStyle( fillForegroundColor = 64)
public class ExportMerchantCommonOrderVO implements Serializable {
private static final long serialVersionUID = -2880421630771568703L;
@ExcelProperty(value = "订单编号")
private String orderCode;
@ExcelProperty(value = "创建时间", converter = DateConverter.class)
private Date createTime;
@ExcelProperty(value = "订单金额")
@NumberFormat("0.00_ ")
private BigDecimal orderPrice;
@ExcelProperty(value = "付款积分")
@NumberFormat("0_ ")
private BigDecimal payPoint;
public static Map<String, Object> getHandleColumns(){
Map<String, Object> map = new HashMap<>(3);
map.put("dateTimeColumns", new String[]{"创建时间"});
map.put("dateColumns", new String[]{});
map.put("numberColumns", new String[]{});
return map;
}
}
- DateConverter
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateConverter implements Converter<Date> {
private static final String PATTERN_YYYY_MM_DD_HH_mm_ss = "yyyy/MM/dd HH:mm:ss";
@Override
public Class<?> supportJavaTypeKey() {
return Converter.super.supportJavaTypeKey();
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return Converter.super.supportExcelTypeKey();
}
@Override
public WriteCellData<?> convertToExcelData(Date value, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat(PATTERN_YYYY_MM_DD_HH_mm_ss);
String dateValue = sdf.format(value);
return new WriteCellData<>(dateValue);
}
}
- CommonExcelCellHandler
import com.alibaba.excel.metadata.Head;
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.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import com.alibaba.excel.write.metadata.style.WriteFont;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.poi.ss.usermodel.*;
@Slf4j
public class CommonExcelCellHandler implements CellWriteHandler {
private static final List<String> COLUMNS = new ArrayList<>();
private CellStyle dateTimeStyle;
private CellStyle dateStyle;
private CellStyle numberStyle;
private Object dateColumns;
private Object dateTimeColumns;
private Object numberColumns;
private Integer widthCommon = 256;
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 afterCellDispose(CellWriteHandlerContext context) {
Cell cell = context.getCell();
Boolean isHead = context.getHead();
WriteSheetHolder writeSheetHolder = context.getWriteSheetHolder();
int width = 20;
if (isHead != null && isHead) {
COLUMNS.add(cell.getStringCellValue());
} else if (isHead != null) {
String columnName = COLUMNS.get(cell.getColumnIndex());
boolean dateTimeFlag = StringUtils.isNotBlank(Arrays.stream(
(String[]) dateTimeColumns).filter(item -> item.equals(columnName)).findAny()
.orElse(""));
boolean dateFlag = StringUtils.isNotBlank(
Arrays.stream((String[]) dateColumns).filter(item -> item.equals(columnName))
.findAny().orElse(""));
boolean numberColumnFlag = StringUtils.isNotBlank(
Arrays.stream((String[]) numberColumns).filter(item -> item.equals(columnName))
.findAny().orElse(""));
boolean dateFlags = dateTimeFlag || dateFlag;
if (dateFlags || numberColumnFlag) {
Workbook wk = writeSheetHolder.getSheet().getWorkbook();
String stringCellValue = null;
try {
stringCellValue = cell.getStringCellValue();
} catch (Exception e) {
dateFlags = false;
}
try {
CreationHelper createHelper = wk.getCreationHelper();
if (StringUtils.isNotBlank(stringCellValue) && dateFlags) {
String[] patterns = {"yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd"};
Date date = DateUtils.parseDate(stringCellValue, patterns);
if (dateTimeFlag) {
width = 20;
if (dateTimeStyle == null) {
dateTimeStyle = wk.createCellStyle();
dateTimeStyle.setDataFormat(createHelper.createDataFormat().getFormat("yyyy/mm/dd hh:mm:ss"));
Font font = writeSheetHolder.getSheet().getWorkbook().createFont();
font.setFontHeight((short) (11 * 20));
font.setFontName("Calibri");
dateTimeStyle.setFont(font);
}
cell.setCellStyle(dateTimeStyle);
}
cell.setCellValue(date);
writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), width * widthCommon);
}
context.getFirstCellData().setWriteCellStyle(null);
} catch (ParseException e) {
log.info("导出信息时出现错误:值:{},行:{},列:{},Exception:{}", stringCellValue,
cell.getRow().getRowNum(), cell.getColumnIndex(),e.getMessage());
cell.setCellValue("");
}
}
}
afterCellDispose(context.getWriteSheetHolder(), context.getWriteTableHolder(), context.getCellDataList(),
context.getCell(), context.getHeadData(), context.getRelativeRowIndex(), context.getHead());
}
public static boolean isNumber(String value) {
String regex = "^-?\\d+(\\.\\d+)?$";
Pattern pattern = Pattern.compile(regex);
return pattern.matcher(value).matches();
}
}