3 changed files with 97 additions and 2 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