ModelBuildEventListener.java 5.5 KB
Newer Older
Z
zhuangjiaju 已提交
1 2
package com.alibaba.excel.read.listener;

Z
zhuangjiaju 已提交
3
import java.util.ArrayList;
Z
zhuangjiaju 已提交
4
import java.util.HashMap;
庄家钜's avatar
庄家钜 已提交
5
import java.util.LinkedHashMap;
Z
zhuangjiaju 已提交
6
import java.util.List;
Z
zhuangjiaju 已提交
7 8 9 10 11
import java.util.Map;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.enums.HeadKindEnum;
12
import com.alibaba.excel.event.AbstractIgnoreExceptionReadListener;
Z
zhuangjiaju 已提交
13 14 15 16
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
17 18
import com.alibaba.excel.read.metadata.holder.ReadHolder;
import com.alibaba.excel.read.metadata.property.ExcelReadHeadProperty;
庄家钜's avatar
庄家钜 已提交
19
import com.alibaba.excel.util.ConverterUtils;
Z
zhuangjiaju 已提交
20 21 22 23 24

import net.sf.cglib.beans.BeanMap;

/**
 * Convert to the object the user needs
25
 *
Z
zhuangjiaju 已提交
26 27
 * @author jipengfei
 */
Z
zhuangjiaju 已提交
28
public class ModelBuildEventListener extends AbstractIgnoreExceptionReadListener<Map<Integer, CellData>> {
Z
zhuangjiaju 已提交
29

庄家钜's avatar
庄家钜 已提交
30 31 32
    @Override
    public void invokeHead(Map<Integer, CellData> cellDataMap, AnalysisContext context) {}

Z
zhuangjiaju 已提交
33
    @Override
Z
zhuangjiaju 已提交
34
    public void invoke(Map<Integer, CellData> cellDataMap, AnalysisContext context) {
35 36
        ReadHolder currentReadHolder = context.currentReadHolder();
        if (HeadKindEnum.CLASS.equals(currentReadHolder.excelReadHeadProperty().getHeadKind())) {
庄家钜's avatar
庄家钜 已提交
37 38
            context.readRowHolder()
                .setCurrentRowAnalysisResult(buildUserModel(cellDataMap, currentReadHolder, context));
Z
zhuangjiaju 已提交
39 40
            return;
        }
Z
zhuangjiaju 已提交
41
        context.readRowHolder().setCurrentRowAnalysisResult(buildStringList(cellDataMap, currentReadHolder, context));
Z
zhuangjiaju 已提交
42 43
    }

Z
zhuangjiaju 已提交
44 45
    private Object buildStringList(Map<Integer, CellData> cellDataMap, ReadHolder currentReadHolder,
        AnalysisContext context) {
庄家钜's avatar
庄家钜 已提交
46
        int index = 0;
Z
zhuangjiaju 已提交
47
        if (context.readWorkbookHolder().getDefaultReturnMap()) {
庄家钜's avatar
庄家钜 已提交
48
            Map<Integer, String> map = new LinkedHashMap<Integer, String>(cellDataMap.size() * 4 / 3 + 1);
Z
zhuangjiaju 已提交
49
            for (Map.Entry<Integer, CellData> entry : cellDataMap.entrySet()) {
庄家钜's avatar
庄家钜 已提交
50
                Integer key = entry.getKey();
Z
zhuangjiaju 已提交
51
                CellData cellData = entry.getValue();
庄家钜's avatar
庄家钜 已提交
52 53 54 55 56
                while (index < key) {
                    map.put(index, null);
                    index++;
                }
                index++;
Z
zhuangjiaju 已提交
57
                if (cellData.getType() == CellDataTypeEnum.EMPTY) {
庄家钜's avatar
庄家钜 已提交
58
                    map.put(key, null);
Z
zhuangjiaju 已提交
59 60
                    continue;
                }
庄家钜's avatar
庄家钜 已提交
61 62 63
                map.put(key,
                    (String)ConverterUtils.convertToJavaObject(cellData, null, null, currentReadHolder.converterMap(),
                        currentReadHolder.globalConfiguration(), context.readRowHolder().getRowIndex(), key));
Z
zhuangjiaju 已提交
64
            }
Z
zhuangjiaju 已提交
65 66 67 68 69
            return map;
        } else {
            // Compatible with the old code the old code returns a list
            List<String> list = new ArrayList<String>();
            for (Map.Entry<Integer, CellData> entry : cellDataMap.entrySet()) {
庄家钜's avatar
庄家钜 已提交
70
                Integer key = entry.getKey();
Z
zhuangjiaju 已提交
71
                CellData cellData = entry.getValue();
庄家钜's avatar
庄家钜 已提交
72 73 74 75 76
                while (index < key) {
                    list.add(null);
                    index++;
                }
                index++;
Z
zhuangjiaju 已提交
77 78 79 80
                if (cellData.getType() == CellDataTypeEnum.EMPTY) {
                    list.add(null);
                    continue;
                }
庄家钜's avatar
庄家钜 已提交
81 82 83
                list.add(
                    (String)ConverterUtils.convertToJavaObject(cellData, null, null, currentReadHolder.converterMap(),
                        currentReadHolder.globalConfiguration(), context.readRowHolder().getRowIndex(), key));
Z
zhuangjiaju 已提交
84 85
            }
            return list;
Z
zhuangjiaju 已提交
86 87 88
        }
    }

庄家钜's avatar
庄家钜 已提交
89 90
    private Object buildUserModel(Map<Integer, CellData> cellDataMap, ReadHolder currentReadHolder,
        AnalysisContext context) {
91
        ExcelReadHeadProperty excelReadHeadProperty = currentReadHolder.excelReadHeadProperty();
Z
zhuangjiaju 已提交
92 93
        Object resultModel;
        try {
94
            resultModel = excelReadHeadProperty.getHeadClazz().newInstance();
Z
zhuangjiaju 已提交
95
        } catch (Exception e) {
庄家钜's avatar
庄家钜 已提交
96 97
            throw new ExcelDataConvertException(context.readRowHolder().getRowIndex(), 0,
                new CellData(CellDataTypeEnum.EMPTY), null,
98
                "Can not instance class: " + excelReadHeadProperty.getHeadClazz().getName(), e);
Z
zhuangjiaju 已提交
99
        }
100
        Map<Integer, Head> headMap = excelReadHeadProperty.getHeadMap();
101
        Map<String, Object> map = new HashMap<String, Object>(headMap.size() * 4 / 3 + 1);
102
        Map<Integer, ExcelContentProperty> contentPropertyMap = excelReadHeadProperty.getContentPropertyMap();
Z
zhuangjiaju 已提交
103 104
        for (Map.Entry<Integer, Head> entry : headMap.entrySet()) {
            Integer index = entry.getKey();
Z
zhuangjiaju 已提交
105
            if (!cellDataMap.containsKey(index)) {
Z
zhuangjiaju 已提交
106 107
                continue;
            }
Z
zhuangjiaju 已提交
108
            CellData cellData = cellDataMap.get(index);
Z
zhuangjiaju 已提交
109 110 111 112
            if (cellData.getType() == CellDataTypeEnum.EMPTY) {
                continue;
            }
            ExcelContentProperty excelContentProperty = contentPropertyMap.get(index);
113
            Object value = ConverterUtils.convertToJavaObject(cellData, excelContentProperty.getField(),
庄家钜's avatar
庄家钜 已提交
114 115
                excelContentProperty, currentReadHolder.converterMap(), currentReadHolder.globalConfiguration(),
                context.readRowHolder().getRowIndex(), index);
Z
zhuangjiaju 已提交
116 117 118 119 120 121 122 123 124 125 126
            if (value != null) {
                map.put(excelContentProperty.getField().getName(), value);
            }
        }
        BeanMap.create(resultModel).putAll(map);
        return resultModel;
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {}
}