content: package com.alibaba.excel.write.style.column;
  
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  
  import com.alibaba.excel.enums.CellDataTypeEnum;
  import com.alibaba.excel.metadata.Head;
  import com.alibaba.excel.metadata.data.WriteCellData;
  import com.alibaba.excel.util.MapUtils;
  import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
  
  import org.apache.commons.collections4.CollectionUtils;
  import org.apache.poi.ss.usermodel.Cell;
  
  /**
   * Take the width of the longest column as the width.
   * <p>
   * This is not very useful at the moment, for example if you have Numbers it will cause a newline.And the length is not
   * exactly the same as the actual length.
   *
   * @author Jiaju Zhuang
   */
  public class LongestMatchColumnWidthStyleStrategy extends AbstractColumnWidthStyleStrategy {
  
      private static final int MAX_COLUMN_WIDTH = 255;
  
      private final Map<Integer, Map<Integer, Integer>> cache = MapUtils.newHashMapWithExpectedSize(8);
  
      @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) {
              return;
          }
          Map<Integer, Integer> maxColumnWidthMap = cache.computeIfAbsent(writeSheetHolder.getSheetNo(), key -> new HashMap<>(16));
          Integer columnWidth = dataLength(cellDataList, cell, isHead);
          if (columnWidth < 0) {
              return;
          }
          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);
              writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256);
          }
      }
  
      private Integer dataLength(List<WriteCellData<?>> cellDataList, Cell cell, Boolean isHead) {
          if (isHead) {
              return cell.getStringCellValue().getBytes().length;
          }
          WriteCellData<?> cellData = cellDataList.get(0);
          CellDataTypeEnum type = cellData.getType();
          if (type == null) {
              return -1;
          }
          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;
          }
      }
  }
  