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