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