New file |
| | |
| | | package com.panzhihua.sangeshenbian.config; |
| | | |
| | | import cn.idev.excel.metadata.Head; |
| | | import cn.idev.excel.metadata.data.WriteCellData; |
| | | import cn.idev.excel.write.metadata.holder.WriteSheetHolder; |
| | | import cn.idev.excel.write.style.column.AbstractColumnWidthStyleStrategy; |
| | | import org.apache.poi.ss.usermodel.Cell; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | public class AutoColumnWidthStrategy extends AbstractColumnWidthStyleStrategy { |
| | | private final Map<Integer, Map<Integer, Integer>> cache = new HashMap<>(); |
| | | |
| | | @Override |
| | | protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, |
| | | Head head, Integer relativeRowIndex, Boolean isHead) { |
| | | boolean needSetWidth = isHead || !cellDataList.isEmpty(); |
| | | if (needSetWidth) { |
| | | Map<Integer, Integer> maxWidthMap = cache.computeIfAbsent(writeSheetHolder.getSheetNo(), k -> new HashMap<>()); |
| | | int columnWidth = calculateWidth(cellDataList, cell, isHead); |
| | | if (columnWidth > 0) { |
| | | columnWidth = Math.min(columnWidth, 255); // 最大支持255字符 |
| | | if (columnWidth > maxWidthMap.getOrDefault(cell.getColumnIndex(), 0)) { |
| | | maxWidthMap.put(cell.getColumnIndex(), columnWidth); |
| | | writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 计算单元格内容长度(按字节) |
| | | private int calculateWidth(List<WriteCellData<?>> cellDataList, Cell cell, boolean isHead) { |
| | | if (isHead) { |
| | | return cell.getStringCellValue().getBytes().length; |
| | | } else { |
| | | WriteCellData<?> cellData = cellDataList.get(0); |
| | | switch (cellData.getType()) { |
| | | case STRING: |
| | | return cellData.getStringValue().getBytes().length; |
| | | case NUMBER: |
| | | return cellData.getNumberValue().toString().getBytes().length; |
| | | default: |
| | | return -1; |
| | | } |
| | | } |
| | | } |
| | | } |