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

net.lulihu.office.excel.Excel Maven / Gradle / Ivy

package net.lulihu.office.excel;

import lombok.Getter;
import lombok.Setter;
import net.lulihu.Assert0;
import net.lulihu.ObjectKit.ReflectKit;
import net.lulihu.ObjectKit.CollectionKit;
import net.lulihu.ObjectKit.MapKit;
import net.lulihu.exception.ToolBoxException;
import net.lulihu.Assert;

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

public abstract class Excel {

    @Getter
    private List> data;
    @Getter
    private String[] sheetName;
    /**
     * 是否设置列标题 如果为false sheetHeaderAlias() 方法将失效
     */
    @Setter
    private boolean hasAlias = true;

    public  Excel(List data) {
        this("sheet1", data);
    }

    /**
     * 导出excel 对象
     *
     * @param sheetName 单sheet名称
     * @param data      单sheet导出数据
     * @param        支持泛型对象
     */
    public  Excel(String sheetName, List data) {
        this(sheetName, null, data);
    }

    /**
     * 导出excel 对象
     *
     * @param sheetName   单sheet名称
     * @param headerAlias 单sheet别名
     * @param data        单sheet导出数据
     * @param          支持泛型对象
     */
    public  Excel(String sheetName, LinkedHashMap headerAlias, List data) {
        this(new String[]{sheetName}, MapKit.isNotEmpty(headerAlias) ? Collections.singletonList(headerAlias) : null,
                Collections.singletonList(data));
    }

    /**
     * 导出excel 对象
     *
     * @param sheetName   多sheet名称
     * @param headerAlias 多sheet别名
     * @param data        多sheet数据
     * @param          支持泛型对象
     */
    public  Excel(String[] sheetName, List> headerAlias, List> data) {
        Assert0.toolBox().notNull(data, "写出excel数据为空");

        List> sheetHeaderAlias = (List>)
                CollectionKit.isEmpty(headerAlias, // 如果用户传值为null
                        () -> CollectionKit.isEmpty(sheetHeaderAlias(), // 判断是否使用方法进行设置
                                () -> defaultHeaderAlias(data))); // 填充bean属性名作为格式化信息

        this.data = dataFormat(data, sheetHeaderAlias);
        this.sheetName = sheetName;
    }

    /**
     * 数据格式化
     *
     * @param data        导出数据
     * @param headerAlias 导出
     * @param 别名       泛型对象
     * @return 格式化数据结构
     */
    private  List> dataFormat(List> data, List> headerAlias) {
        Assert0.toolBox().notTrue(data.size() != headerAlias.size(), "数据sheet长度与别名sheet长度不一致");

        // 数据格式化
        List> result = new ArrayList<>();
        try {
            int xl = data.size();
            for (int x = 0; x < xl; x++) {
                LinkedHashMap alias = headerAlias.get(x);
                List fieldNames = new ArrayList<>(alias.keySet());
                int hl = fieldNames.size();

                List sheet = new ArrayList<>();
                if (hasAlias)  // 添加标题列
                    sheet.add(alias.values().toArray(new String[0]));

                // 添加记录
                for (D y : data.get(x)) {
                    String[] d = new String[hl];
                    for (int i = 0; i < hl; i++) {
                        Object fieldValue = ReflectKit.getFieldValue(y, fieldNames.get(i));
                        d[i] = Objects.toString(fieldValue);
                    }
                    sheet.add(d);
                }
                result.add(sheet);
            }
        } catch (IllegalAccessException e) {
            throw new ToolBoxException(e, "解析导出数据错误");
        }
        return result;
    }

    /**
     * 多sheet 首行合并显示内容 如果为null或者空字符串则不显示
     */
    public String[] labelFirstMerge() {
        return null;
    }

    /**
     * 多sheet 设置标题别名,用来对应具体数据
     * key bean的属性名称 value 对应的别名
     * 

* 如果不设置别名则 使用 headerAlias(data)方法生成别名 */ public List> sheetHeaderAlias() { return null; } /** * 默认多sheet 设置标题别名,用来对应具体数据 * key bean的属性名称 value 对应的别名 *

* 如果不设置别名则列顺序将随机排序 */ private List> defaultHeaderAlias(List> data) { this.hasAlias = false; List> result = new ArrayList<>(); for (List dd : data) { LinkedHashMap headerAlias = new LinkedHashMap<>(); List fields = ReflectKit.getAllFieldsList(dd.get(0).getClass()); for (Field field : fields) { String fieldName = field.getName(); headerAlias.put(fieldName, fieldName); } result.add(headerAlias); } return result; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy