shikeying
2024-01-11 3b67e947e36133e2a40eb2737b15ea375e157ea0
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
package com.walker.di.excel;
 
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.walker.di.AbstractErrorWriter;
import com.walker.di.Constants;
import com.walker.infrastructure.utils.KeyValue;
import com.walker.infrastructure.utils.StringUtils;
 
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
 
/**
 * 使用 Excel 文件实现的错误记录器。
 * @author 时克英
 * @date 2023-02-03
 */
public class ExcelErrorWriter extends AbstractErrorWriter {
 
    private ExcelWriter excelWriter = null;
    private WriteSheet writeSheet = null;
    private OutputStream outputStream = null;
 
    public ExcelErrorWriter(OutputStream outputStream, List<String> fieldNames){
        this.outputStream = outputStream;
        ExcelWriterBuilder writer = EasyExcelFactory.write(outputStream);
        writer.head(this.getHeaders(fieldNames));
//        writer.sheet(Constants.EXCEL_SHEET_NAME);
        excelWriter = writer.build();
 
        writeSheet = new WriteSheet();
        writeSheet.setSheetName(Constants.EXCEL_SHEET_NAME);
    }
 
    @Override
//    public void write(Map<String, String> data, String error) {
    public void write(List<KeyValue<String, String>> data, String error) {
        if(this.excelWriter != null){
            // 错误原因标题列和值
//            data.put(Constants.ERROR_COLUMN_NAME, error);
            data.add(new KeyValue<>(Constants.ERROR_COLUMN_NAME, error));
            List<List<String>> errorList = new ArrayList<>(2);
            List<String> one = new ArrayList<>(data.size() + 2);
//            for(Map.Entry<String, String> entry : data.entrySet()){
            for(KeyValue<String, String> kv : data){
                one.add(kv.getValue());
//                logger.debug("....." + kv.getValue());
            }
            errorList.add(one);
            excelWriter.write(errorList, writeSheet);
            logger.debug("error = " + data);
        }
    }
 
    @Override
    public void close() {
        if(this.excelWriter != null){
            this.excelWriter.finish();
            this.excelWriter.close();
        }
        if(this.outputStream != null){
            try {
                this.outputStream.close();
            } catch (IOException e) {}
        }
    }
 
    private List<List<String>> getHeaders(List<String> fieldNames){
        List<List<String>> headers = new ArrayList<>();
        for(String headerId : fieldNames){
            headers.add(StringUtils.asList(new String[]{"说明字段", headerId}));
        }
        headers.add(StringUtils.asList(new String[]{"错误原因", Constants.ERROR_COLUMN_NAME}));
        return headers;
    }
}