package org.sxkj.system.util.excel; import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.metadata.data.CellData; 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.apache.poi.ss.usermodel.Sheet; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 自适应行款 * @author zhongrj * @since 2021-10-29 */ public class CustomCellWriteWeightConfig extends AbstractColumnWidthStyleStrategy { private Map> CACHE = new HashMap<>(); @Override protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { // 在3.0版本中,列宽设置逻辑已改变,使用此方法进行设置 Sheet sheet = writeSheetHolder.getSheet(); Integer columnWidth = CACHE.get(writeSheetHolder.getSheetNo()) != null ? CACHE.get(writeSheetHolder.getSheetNo()).get(cell.getColumnIndex()) : null; if (columnWidth != null) { sheet.setColumnWidth(cell.getColumnIndex(), columnWidth * 256); } super.setColumnWidth(writeSheetHolder, cellDataList, cell, head, relativeRowIndex, isHead); } /** * 计算长度 * @param cellDataList * @param cell * @param isHead * @return */ private Integer dataLength(List cellDataList, Cell cell, Boolean isHead) { if (isHead) { return cell.getStringCellValue().getBytes().length; } else { CellData cellData = cellDataList.get(0); CellDataTypeEnum type = cellData.getType(); if (type == null) { return -1; } else { switch (type) { case STRING: // 换行符(数据需要提前解析好) int index = cellData.getStringValue().indexOf("\n"); return index != -1 ? cellData.getStringValue().substring(0, index).getBytes().length + 1 : cellData.getStringValue().getBytes().length + 1; case BOOLEAN: return cellData.getBooleanValue().toString().getBytes().length; case NUMBER: return cellData.getNumberValue().toString().getBytes().length; default: return -1; } } } } }