forked from fanruan/easyexcel
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.8 KiB
75 lines
2.8 KiB
package com.alibaba.excel.write.style.column; |
|
|
|
import java.util.HashMap; |
|
import java.util.List; |
|
import java.util.Map; |
|
|
|
import org.apache.commons.collections4.CollectionUtils; |
|
import org.apache.poi.ss.usermodel.Cell; |
|
|
|
import com.alibaba.excel.enums.CellDataTypeEnum; |
|
import com.alibaba.excel.metadata.CellData; |
|
import com.alibaba.excel.metadata.Head; |
|
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; |
|
|
|
/** |
|
* 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 LongestMatchColumnWidthStyleStrategy extends AbstractColumnWidthStyleStrategy { |
|
|
|
private static final int MAX_COLUMN_WIDTH = 255; |
|
|
|
private Map<Integer, Map<Integer, Integer>> cache = new HashMap<Integer, Map<Integer, Integer>>(8); |
|
|
|
@Override |
|
protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<CellData> cellDataList, Cell cell, Head head, |
|
Integer relativeRowIndex, Boolean isHead) { |
|
boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList); |
|
if (!needSetWidth) { |
|
return; |
|
} |
|
Map<Integer, Integer> maxColumnWidthMap = cache.get(writeSheetHolder.getSheetNo()); |
|
if (maxColumnWidthMap == null) { |
|
maxColumnWidthMap = new HashMap<Integer, Integer>(16); |
|
cache.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap); |
|
} |
|
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<CellData> cellDataList, Cell cell, Boolean isHead) { |
|
if (isHead) { |
|
return cell.getStringCellValue().getBytes().length; |
|
} |
|
CellData 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; |
|
} |
|
} |
|
}
|
|
|