13693261870
昨天 32eb942e25aa366563b7f40b05a382c0c462213c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package com.terra.system.helper;
 
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.enums.WriteDirectionEnum;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.alibaba.excel.write.metadata.fill.FillWrapper;
import com.terra.common.helper.StringHelper;
import com.terra.system.annotation.ExcelHead;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
 
/**
 * Excel帮助类
 * @author WWW
 */
public class ExcelHelper {
    /**
     * 读取Excel
     *
     * @param pathName 文件路径
     * @param <T>      泛型类
     * @return 泛型类集合
     */
    public static <T> List<T> readExcel(Class<?> clazz, String pathName) {
        ExcelHead head = getExcelHead(clazz);
        int headRowNumber = head == null ? 1 : head.headRows();
        String[] strs = null == head || StringHelper.isEmpty(head.excludeSheets()) ? null : head.excludeSheets().split(",");
        List<String> excludeSheets = null == strs ? null : Arrays.asList(strs);
 
        List<T> list = new ArrayList<T>();
        ExcelReader reader = EasyExcel.read(pathName, clazz, new AnalysisEventListener<T>() {
            @Override
            public void invoke(T t, AnalysisContext context) {
                list.add(t);
            }
 
            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                //
            }
        }).headRowNumber(headRowNumber).build();
 
        List<ReadSheet> sheets = reader.excelExecutor().sheetList();
        for (ReadSheet sheet : sheets) {
            if (strs != null && excludeSheets.contains(sheet.getSheetName())) {
                continue;
            }
 
            reader.read(sheet);
        }
        reader.finish();
 
        return list;
    }
 
    /**
     * 获取Excel头注解类
     *
     * @param clazz Class
     * @param <T>   泛型类
     * @return 头行数
     */
    public static <T> ExcelHead getExcelHead(Class<?> clazz) {
        ExcelHead head = clazz.getAnnotation(ExcelHead.class);
 
        return head;
    }
 
    /**
     * 写入Excel模板
     *
     * @param source  源文件(模板)
     * @param target  目录文件
     * @param map     键值对Map
     * @param listMap 列表Map
     */
    public static <T> void writeToTemplate(String source, String target, Map<String, Object> map, Map<String, List<T>> listMap) {
        // 根据模板写入数据,如果目标文件不存在,则自动创建文件
        ExcelWriter excelWriter = EasyExcel.write(target).withTemplate(source).build();
 
        // 在工作簿0中写入数据,如果模板中不存在练习工作簿,则会在目标文件中自动创建
        WriteSheet writeSheet = EasyExcel.writerSheet(0).build();
 
        // 垂直写入数据,如果要水平写入,将VERTICAL替换为HORIZONTAL
        FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).build();
 
        // 写入数据
        if (null != map && map.size() > 0) {
            excelWriter.fill(map, writeSheet);
        }
        if (null != listMap && listMap.size() > 0) {
            listMap.forEach((k, v) -> excelWriter.fill(new FillWrapper(k, v), fillConfig, writeSheet));
        }
 
        // 结束写入
        excelWriter.finish();
    }
 
    /**
     * 写入Excel模板
     *
     * @param source 源文件(模板)
     * @param target 目录文件
     * @param map    数据源
     */
    public static <T> void writeToTemplate(String source, String target, Map<String, List<T>> map) {
        // 根据模板写入数据,如果目标文件不存在,则自动创建文件
        ExcelWriter excelWriter = EasyExcel.write(target).withTemplate(source).build();
 
        // 在工作簿0中写入数据,如果模板中不存在练习工作簿,则会在目标文件中自动创建
        WriteSheet writeSheet = EasyExcel.writerSheet(0).build();
 
        // 垂直写入数据,如果要水平写入,将VERTICAL替换为HORIZONTAL
        FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).build();
 
        // 写入数据
        map.forEach((k, v) -> excelWriter.fill(new FillWrapper(k, v), fillConfig, writeSheet));
 
        // 结束写入
        excelWriter.finish();
    }
}