All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.swak.excel.AutoColumnWidthStyleStrategy Maven / Gradle / Ivy

package com.swak.excel;


import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
import com.alibaba.excel.write.style.row.AbstractRowHeightStyleStrategy;
import com.swak.excel.metadata.WriteExcelParams;
import com.swak.excel.styler.ExcelExportStyler;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * AutoColumnWidthStyleStrategy.java
 *
 * @author colley.ma
 * @since  2022/9/20 13:29
 */
public class AutoColumnWidthStyleStrategy extends AbstractColumnWidthStyleStrategy {

    private Map> CACHE = new HashMap<>();

    public static HorizontalCellStyleStrategy createStyleStrategy(WriteExcelParams writeParams) {
        ExcelExportStyler excelExportStyler = writeParams.getExcelExportStyler();
        // 这个策略是头是头的样式内容是内容的样式其他的策略可以⾃⼰实现
        HorizontalCellStyleStrategy horizontalCellStyleStrategy =
                new HorizontalCellStyleStrategy(excelExportStyler.getHeaderStyle(writeParams),
                        excelExportStyler.getContentStyles(writeParams));
        return horizontalCellStyleStrategy;
    }

    @Override
    protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List> cellDataList, Cell cell,
                                  Head head, Integer relativeRowIndex, Boolean isHead) {
        boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);
        if (needSetWidth) {
            Map maxColumnWidthMap = CACHE.get(writeSheetHolder.getSheetNo());
            if (maxColumnWidthMap == null) {
                maxColumnWidthMap = new HashMap();
                CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);
            }
            Integer columnWidth = this.dataLength(cellDataList, cell, isHead);
            if (columnWidth >= 0) {
                if (columnWidth > 255) {
                    columnWidth = 255;
                }
                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> cellDataList, Cell cell, Boolean isHead) {
        if (isHead) {
            // 此处加5可以额外扩充列宽度
            return cell.getStringCellValue().getBytes().length + 5;
        } else {
            WriteCellData cellData = cellDataList.get(0);
            CellDataTypeEnum type = cellData.getType();
            if (type == null) {
                return -1;
            } else {
                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 static class CustomRowHeightStyleStrategy extends AbstractRowHeightStyleStrategy {
        private WriteExcelParams writeParams;

        public CustomRowHeightStyleStrategy(WriteExcelParams writeParams) {
            this.writeParams = writeParams;
        }

        @Override
        protected void setHeadColumnHeight(Row row, int index) {
            if (Objects.nonNull(writeParams.getHeadHeight())) {
                row.setHeightInPoints(writeParams.getHeadHeight().floatValue());
            }
        }

        @Override
        protected void setContentColumnHeight(Row row, int i) {
            if (Objects.nonNull(writeParams.getContentHeight())) {
                row.setHeightInPoints(writeParams.getContentHeight().floatValue());
            }
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy