package com.sinata.system.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 >= 16) {
|
columnWidth = 16;
|
}
|
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 * 255);
|
}
|
}
|
}
|
}
|
|
// 计算单元格内容长度(按字节)
|
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;
|
case DATE:
|
return cellData.getDateValue().toString().getBytes().length;
|
default:
|
return -1;
|
}
|
}
|
}
|
}
|