我的版本EasyExcel为3.x,如果使用2.x可能有些字段不一样
配置类
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
import org.apache.poi.ss.usermodel.Cell;
import org.springframework.util.CollectionUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 表头宽度根据数据内容自适应
*/
public class CustomWidthStyleStrategy extends AbstractColumnWidthStyleStrategy {
private Map<Integer, Map<Integer, Integer>> CACHE = new HashMap<>();
/**
* 设置列宽
*
* @param writeSheetHolder
* @param cellDataList
* @param cell
* @param head
* @param relativeRowIndex
* @param isHead
*/
@Override
protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
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);
}
Integer columnWidth = this.dataLength(cellDataList, cell, isHead)/2;
if (columnWidth >= 0) {
if (columnWidth > 255) {
columnWidth = 255;
}
Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex());
if (maxColumnWidth == null || columnWidth > maxColumnWidth) {
maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth);
writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256);
}
}
}
}
/**
* 数据长度
*
* @param cellDataList
* @param cell
* @param isHead
* @return
*/
private Integer dataLength(List<WriteCellData<?>> cellDataList, Cell cell, Boolean isHead) {
//头直接返回原始长度
if (isHead) {
return cell.getStringCellValue().getBytes().length;
} else {
//不是头的话 看是什么类型 用数字加就可以了
WriteCellData cellData = cellDataList.get(0);
CellDataTypeEnum type = cellData.getType();
if (type == null) {
return -1;
} else {
switch (type) {
case STRING:
return cellData.getStringValue().getBytes().length + 1;
case BOOLEAN:
return cellData.getBooleanValue().toString().getBytes().length;
case NUMBER:
return cellData.getNumberValue().toString().getBytes().length * 2;
default:
return -1;
}
}
}
}
}
使用EasyExcel写入到excel里面
EasyExcel.write(byteArrayOutputStream, DatasetRefreshHistoryVo.class)
.sheet("模板")
.registerWriteHandler(new CustomWidthStyleStrategy())
.doWrite(list);
配置
/**
* 单元格样式策略
*/
public static HorizontalCellStyleStrategy getHorizontalCellStyleStrategy() {
// 内容的策略
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
// 设置边框
contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
contentWriteCellStyle.setBorderTop(BorderStyle.NONE);
// 配置字体
WriteFont contentWriteFont = new WriteFont();
// 字体
// contentWriteFont.setFontName("宋体");
// 字体大小
// contentWriteFont.setFontHeightInPoints(fontHeightInPoints);
// 设置加粗
contentWriteFont.setBold(false);
contentWriteCellStyle.setWriteFont(contentWriteFont);
// 【水平居中需要使用以下两行】
// 设置文字左右居中
contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
// 设置文字上下居中
contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
// 设置 自动换行
contentWriteCellStyle.setWrapped(true);
contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
contentWriteCellStyle.setFillForegroundColor(IndexedColors.PINK.getIndex());
// 样式策略
return new HorizontalCellStyleStrategy(null, contentWriteCellStyle);
}
使用EasyExcel写入到excel里面
可以同时使用两个registerWriteHandler
EasyExcel.write(byteArrayOutputStream, DatasetRefreshHistoryVo.class)
.sheet("模板")
.registerWriteHandler(this.getHorizontalCellStyleStrategy())
.registerWriteHandler(new CustomWidthStyleStrategy())
.doWrite(list);