7 changed files with 124 additions and 8 deletions
			
			
		@ -0,0 +1,96 @@ | 
				
			|||||
 | 
					package com.epmet.commons.tools.utils.poi.excel.handler; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					/** | 
				
			||||
 | 
					 * desc:设置columnWith宽度 | 
				
			||||
 | 
					 * | 
				
			||||
 | 
					 * @author: LiuJanJun | 
				
			||||
 | 
					 * @date: 2022/4/28 5:05 下午 | 
				
			||||
 | 
					 * @version: 1.0 | 
				
			||||
 | 
					 */ | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					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 com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy; | 
				
			||||
 | 
					import org.apache.commons.collections4.CollectionUtils; | 
				
			||||
 | 
					import org.apache.poi.ss.usermodel.Cell; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					import java.util.HashMap; | 
				
			||||
 | 
					import java.util.List; | 
				
			||||
 | 
					import java.util.Map; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					/** | 
				
			||||
 | 
					 * 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 ColumnWidthStyleStrategy extends AbstractColumnWidthStyleStrategy { | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    private static final int MAX_COLUMN_WIDTH = 255; | 
				
			||||
 | 
					    /** | 
				
			||||
 | 
					     * 是否 根据内容设置宽度 | 
				
			||||
 | 
					     */ | 
				
			||||
 | 
					    private boolean isSetContentWidth = false; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    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 || isSetContentWidth) && CollectionUtils.isNotEmpty(cellDataList); | 
				
			||||
 | 
					        if (!needSetWidth) { | 
				
			||||
 | 
					            return; | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        Map<Integer, Integer> maxColumnWidthMap = cache.computeIfAbsent(writeSheetHolder.getSheetNo(), k -> 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+3; | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        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; | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    public ColumnWidthStyleStrategy() { | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    public ColumnWidthStyleStrategy(boolean isSetContentWidth) { | 
				
			||||
 | 
					        this.isSetContentWidth = isSetContentWidth; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue