easypoi自动判断excel宽度

package com.ssi.utils;

import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.util.Collection;
import java.util.List;
import java.util.Map;

public class ExcelExportUtilAuto {
    public static       int    USE_SXSSF_LIMIT = 100000;
    private ExcelExportUtilAuto() {
    }

    /**
     * @param entity    表格标题属性
     * @param pojoClass Excel对象Class
     * @param dataSet   Excel对象数据List
     */
    public static Workbook exportExcel(ExportParams entity, Class<?> pojoClass,
                                       Collection<?> dataSet) {
        Workbook workbook = getWorkbook(entity.getType(), dataSet.size());
        new ExcelExportServiceAuto().createSheet(workbook, entity, pojoClass, dataSet);
        return workbook;
    }

    private static Workbook getWorkbook(ExcelType type, int size) {
        if (ExcelType.HSSF.equals(type)) {
            return new HSSFWorkbook();
        } else if (size < USE_SXSSF_LIMIT) {
            return new XSSFWorkbook();
        } else {
            return new SXSSFWorkbook();
        }
    }



    /**
     * 根据Map创建对应的Excel(一个excel 创建多个sheet)
     *
     * @param list 多个Map key title 对应表格Title key entity 对应表格对应实体 key data
     *             Collection 数据
     * @return
     */
    public static Workbook exportExcel(List<Map<String, Object>> list, ExcelType type) {
        Workbook workbook = getWorkbook(type, 0);
        for (Map<String, Object> map : list) {
            ExcelExportServiceAuto service = new ExcelExportServiceAuto();
            service.createSheet(workbook, (ExportParams) map.get("title"),
                    (Class<?>) map.get("entity"), (Collection<?>) map.get("data"));
        }
        return workbook;
    }



}

package com.ssi.utils;

import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.afterturn.easypoi.excel.export.ExcelExportService;
import cn.afterturn.easypoi.exception.excel.ExcelExportException;
import cn.afterturn.easypoi.exception.excel.enums.ExcelExportEnum;
import cn.afterturn.easypoi.util.PoiPublicUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.*;

/**
 * 自动判断excel宽度
 *
 * @author hujun
 */
@Slf4j
public class ExcelExportServiceAuto extends ExcelExportService {
    @Override
    public void createSheet(Workbook workbook, ExportParams entity, Class<?> pojoClass, Collection<?> dataSet) {
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("Excel export start ,class is {}", pojoClass);
            LOGGER.debug("Excel version is {}",
                    entity.getType().equals(ExcelType.HSSF) ? "03" : "07");
        }
        if (workbook == null || entity == null || pojoClass == null || dataSet == null) {
            throw new ExcelExportException(ExcelExportEnum.PARAMETER_ERROR);
        }
        try {
            List<ExcelExportEntity> excelParams = new ArrayList<ExcelExportEntity>();
            // 得到所有字段
            Field[] fileds = PoiPublicUtil.getClassFields(pojoClass);
            ExcelTarget etarget = pojoClass.getAnnotation(ExcelTarget.class);
            String targetId = etarget == null ? null : etarget.value();
            getAllExcelField(entity.getExclusions(), targetId, fileds, excelParams, pojoClass, dataSet);
            //获取所有参数后,后面的逻辑判断就一致了
            createSheetForMap(workbook, entity, excelParams, dataSet);
        } catch (Exception e) {
            LOGGER.error(e.getMessage(), e);
            throw new ExcelExportException(ExcelExportEnum.EXPORT_ERROR, e.getCause());
        }
    }

    /**
     * @param exclusions
     * @param targetId
     * @param fields
     * @param excelParams
     * @param pojoClass
     * @throws Exception
     */
    private void getAllExcelField(String[] exclusions, String targetId, Field[] fields,
                                  List<ExcelExportEntity> excelParams, Class<?> pojoClass,
                                  Collection<?> data) throws Exception {
        super.getAllExcelField(exclusions, targetId, fields, excelParams, pojoClass, null, null);
        long  start=System.currentTimeMillis();
        excelParams.forEach(e -> {
            //只有未设置的默认值才需要自适应
            if(e.getWidth()==10){
                if (e.getList() == null) {
                    setWidth(data, e);

                }else {
                    e.getList().forEach(child->{
                        try {
                            Object invoke = e.getMethod().invoke(data.iterator().next());
                            if(invoke!=null){
                                setWidth((Collection<?>) invoke,child);
                            }
                        } catch (IllegalAccessException | InvocationTargetException illegalAccessException) {
                            illegalAccessException.printStackTrace();
                        }
                    });
                }
            }
        });
        log.info("excel自适应耗时"+(System.currentTimeMillis()-start)+"ms");
    }

    private void setWidth(Collection<?> data, ExcelExportEntity e) {
        data.stream().limit(10).max(Comparator.comparingDouble(r ->
        {
            try {
                Object invoke = e.getMethod().invoke(r);
                if(invoke==null){
                    return -1;
                }
                return MatrixToImageWriter.getLength(invoke.toString());
            } catch (IllegalAccessException | InvocationTargetException illegalAccessException) {
                illegalAccessException.printStackTrace();
            }
            return 0;
        })).map(r -> {
            try {
                Object invoke = e.getMethod().invoke(r);
                if(invoke==null){
                    return 0;
                }
                int i = MatrixToImageWriter.getLength(invoke.toString())/6;
                if (i > e.getWidth()) {
                    log.info("自适应excel宽度");
                    e.setWidth(i);
                }
            } catch (IllegalAccessException | InvocationTargetException illegalAccessException) {
                illegalAccessException.printStackTrace();
            }
            return 0;
        });
    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那年的夏天123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值