shikeying
2024-05-08 19ab3a8c760fa5e7e6cfab1b2ff97c187589efae
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package com.walker.di.excel;
 
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.walker.infrastructure.ApplicationRuntimeException;
import com.walker.infrastructure.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
 
/**
 * 默认的数据监听器实现,按照 EasyExcel 规范定义,转换成自己要的结果。<p></p>
 * 该对象一次性返回所有加载的数据。
 * @author 时克英
 * @date 2023-02-03
 */
public class DefaultDataListener extends AnalysisEventListener<Map<Integer,String>> {
 
    protected final transient Logger logger = LoggerFactory.getLogger(this.getClass());
 
    // 每次要保存的导入数据集合
    protected List<Object[]> rows = null;
 
    // 表头信息
    protected List<String> headers = null;
    private int headerSize = 0;
 
    // 表头行计数器
    private int currentHeadRowNumber = 1;
 
    public DefaultDataListener(LoadListener loadListener){
//        if(loadListener == null){
//            throw new IllegalArgumentException("LoadListener is required!");
//        }
        this.loadListener = loadListener;
    }
 
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
//        logger.debug("处理 header----->");
//        for(Map.Entry<Integer, String> entry : headMap.entrySet()){
//            logger.debug(entry.getKey() + " = " + entry.getValue());
//        }
        if(this.currentHeadRowNumber < this.headRowNumber){
            logger.debug("表头行大于1,忽略改行,仅处理最后一行表头");
            this.currentHeadRowNumber ++;
            return;
        }
        if(this.headers == null){
            this.headers = new ArrayList<>();
            for(String head : headMap.values()){
                this.headers.add(head);
            }
            this.headerSize = this.headers.size();
        }
    }
 
    @Override
    public void invoke(Map<Integer, String> integerStringMap, AnalysisContext analysisContext) {
//        System.out.println("处理 data-----> " + integerStringMap);
//        for(Map.Entry<Integer, String> entry : integerStringMap.entrySet()){
//            logger.debug(entry.getKey() + " = " + entry.getValue());
//        }
//        if(this.headers == null){
//            throw new ApplicationRuntimeException("表头为空,无法继续导入数据", null);
//        }
//        if(data == null){
//            data = new ArrayList<>(256);
//        }
//        Object[] one = new Object[this.headerSize];
//        for(int i=0; i<this.headerSize; i++){
//            one[i] = integerStringMap.get(i);
//        }
//        this.data.add(one);
//        this.currentDataRowCount ++;
        this.increaseOneData(integerStringMap);
 
//        // 到达200条后,自动保存
//        if(this.currentDataRowCount >= this.saveSizeOnce){
//            try {
//                this.loadListener.onSave(data, this.headers);
//                this.data.clear();
//                this.data = null;
//
//            } catch (DataImportException e) {
//                throw new ApplicationRuntimeException("loadListener保存导入数据错误:" + e.getMessage(), e);
//            }
//
//            if(sleepMillSeconds > 0){
//                try {
//                    TimeUnit.MILLISECONDS.sleep(sleepMillSeconds);
//                    logger.debug("-----> sleep: " + sleepMillSeconds);
//                } catch (InterruptedException e) {
//                    logger.error("间隔等待(防止CUP过高),出现异常:" + e.getMessage());
//                }
//            }
//        }
    }
 
    void increaseOneData(Map<Integer, String> integerStringMap){
        if(this.headers == null){
            throw new ApplicationRuntimeException("表头为空,无法继续导入数据", null);
        }
        if(rows == null){
            rows = new ArrayList<>(256);
        }
        Object[] one = new Object[this.headerSize];
        String value = null;
        for(int i=0; i<this.headerSize; i++){
            value = integerStringMap.get(i);
            if(StringUtils.isEmpty(value)){
                one[i] = StringUtils.EMPTY_STRING;
            } else {
                one[i] = value;
            }
        }
        this.rows.add(one);
//        this.currentDataRowCount ++;
    }
 
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        logger.info(".........导入并保存完成!");
    }
 
    /**
     * 返回导入的原始数据集合。
     * @return
     */
    public List<Object[]> getRows() {
        return rows;
    }
 
    /**
     * 返回表头行(仅标识行)
     * @return
     */
    public List<String> getHeaders() {
        return headers;
    }
 
    /**
     * 设置表头有几行,默认:2
     * @param headRowNumber
     */
    public void setHeadRowNumber(int headRowNumber) {
        this.headRowNumber = headRowNumber;
    }
 
    protected LoadListener loadListener = null;
    private int headRowNumber = 2;
}