package com.example.jz.excel; 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 ExcelWidthStyleStrategy extends AbstractColumnWidthStyleStrategy { // 单元格的最大宽度 /*private static final int MAX_COLUMN_WIDTH = 50; // 缓存(第一个Map的键是sheet的index, 第二个Map的键是列的index, 值是数据长度) private Map> CACHE = new HashMap(8); // 重写设置列宽的方法 @Override protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList); // 当时表头或者单元格数据列表有数据时才进行处理 if (needSetWidth) { Map maxColumnWidthMap = CACHE.get(writeSheetHolder.getSheetNo()); if (maxColumnWidthMap == null) { maxColumnWidthMap = new HashMap(16); CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap); } // 获取数据长度 Integer columnWidth = this.getLength(cellDataList, cell, isHead); if (columnWidth >= 0) { if (columnWidth > MAX_COLUMN_WIDTH) { columnWidth = MAX_COLUMN_WIDTH; } // 确保一个列的列宽以表头为主,如果表头已经设置了列宽,单元格将会跟随表头的列宽 Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex()); if (maxColumnWidth == null || columnWidth > maxColumnWidth) { maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth); // 如果使用EasyExcel默认表头,那么使用columnWidth * 512 // 如果不使用EasyExcel默认表头,那么使用columnWidth * 256 // 如果是自己定义的字体大小,可以再去测试这个参数常量 writeSheetHolder .getSheet() .setColumnWidth(cell.getColumnIndex(), columnWidth * 512); } } } } *//** * 获取当前单元格的数据长度 * @param cellDataList * @param cell * @param isHead * @return *//* private Integer dataLength(List> 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; case BOOLEAN: return cellData.getBooleanValue().toString().getBytes().length; case NUMBER: return cellData.getNumberValue().toString().getBytes().length; default: return -1; } } } }*/ }