ConverterUtils.java 5.2 KB
Newer Older
庄家钜's avatar
庄家钜 已提交
1 2
package com.alibaba.excel.util;

3 4 5
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
庄家钜's avatar
庄家钜 已提交
6 7 8
import java.util.HashMap;
import java.util.Map;

庄家钜's avatar
庄家钜 已提交
9
import com.alibaba.excel.context.AnalysisContext;
庄家钜's avatar
庄家钜 已提交
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.converters.ConverterKeyBuild;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.alibaba.excel.read.metadata.holder.ReadHolder;

/**
 * Converting objects
 *
 * @author Jiaju Zhuang
 **/
public class ConverterUtils {

    private ConverterUtils() {}

    /**
     * Convert it into a String map
     *
     * @param cellDataMap
庄家钜's avatar
庄家钜 已提交
32
     * @param context
庄家钜's avatar
庄家钜 已提交
33 34
     * @return
     */
庄家钜's avatar
庄家钜 已提交
35
    public static Map<Integer, String> convertToStringMap(Map<Integer, CellData> cellDataMap, AnalysisContext context) {
庄家钜's avatar
庄家钜 已提交
36
        Map<Integer, String> stringMap = new HashMap<Integer, String>(cellDataMap.size() * 4 / 3 + 1);
庄家钜's avatar
庄家钜 已提交
37
        ReadHolder currentReadHolder = context.currentReadHolder();
38
        int index = 0;
庄家钜's avatar
庄家钜 已提交
39
        for (Map.Entry<Integer, CellData> entry : cellDataMap.entrySet()) {
40
            Integer key = entry.getKey();
庄家钜's avatar
庄家钜 已提交
41
            CellData cellData = entry.getValue();
42 43 44 45 46
            while (index < key) {
                stringMap.put(index, null);
                index++;
            }
            index++;
庄家钜's avatar
庄家钜 已提交
47
            if (cellData.getType() == CellDataTypeEnum.EMPTY) {
48
                stringMap.put(key, null);
庄家钜's avatar
庄家钜 已提交
49 50 51
                continue;
            }
            Converter converter =
庄家钜's avatar
庄家钜 已提交
52
                currentReadHolder.converterMap().get(ConverterKeyBuild.buildKey(String.class, cellData.getType()));
庄家钜's avatar
庄家钜 已提交
53
            if (converter == null) {
庄家钜's avatar
庄家钜 已提交
54
                throw new ExcelDataConvertException(context.readRowHolder().getRowIndex(), key, cellData, null,
庄家钜's avatar
庄家钜 已提交
55 56 57
                    "Converter not found, convert " + cellData.getType() + " to String");
            }
            try {
58
                stringMap.put(key,
庄家钜's avatar
庄家钜 已提交
59
                    (String)(converter.convertToJavaData(cellData, null, currentReadHolder.globalConfiguration())));
庄家钜's avatar
庄家钜 已提交
60
            } catch (Exception e) {
庄家钜's avatar
庄家钜 已提交
61 62
                throw new ExcelDataConvertException(context.readRowHolder().getRowIndex(), key, cellData, null,
                    "Convert data " + cellData + " to String error ", e);
庄家钜's avatar
庄家钜 已提交
63 64 65 66 67 68 69 70 71
            }
        }
        return stringMap;
    }

    /**
     * Convert it into a Java object
     *
     * @param cellData
72
     * @param field
庄家钜's avatar
庄家钜 已提交
73 74 75
     * @param contentProperty
     * @param converterMap
     * @param globalConfiguration
庄家钜's avatar
庄家钜 已提交
76 77
     * @param rowIndex
     * @param columnIndex
庄家钜's avatar
庄家钜 已提交
78 79
     * @return
     */
80
    public static Object convertToJavaObject(CellData cellData, Field field, ExcelContentProperty contentProperty,
庄家钜's avatar
庄家钜 已提交
81 82
        Map<String, Converter> converterMap, GlobalConfiguration globalConfiguration, Integer rowIndex,
        Integer columnIndex) {
83 84 85 86 87 88
        Class clazz;
        if (field == null) {
            clazz = String.class;
        } else {
            clazz = field.getType();
        }
庄家钜's avatar
庄家钜 已提交
89
        if (clazz == CellData.class) {
90 91 92 93
            Type type = field.getGenericType();
            Class classGeneric;
            if (type instanceof ParameterizedType) {
                ParameterizedType parameterizedType = (ParameterizedType)type;
94
                classGeneric = (Class)parameterizedType.getActualTypeArguments()[0];
95 96 97 98
            } else {
                classGeneric = String.class;
            }
            CellData cellDataReturn = new CellData(cellData);
庄家钜's avatar
庄家钜 已提交
99 100
            cellDataReturn.setData(doConvertToJavaObject(cellData, classGeneric, contentProperty, converterMap,
                globalConfiguration, rowIndex, columnIndex));
101
            return cellDataReturn;
庄家钜's avatar
庄家钜 已提交
102
        }
庄家钜's avatar
庄家钜 已提交
103 104
        return doConvertToJavaObject(cellData, clazz, contentProperty, converterMap, globalConfiguration, rowIndex,
            columnIndex);
105 106 107 108 109 110 111 112 113
    }

    /**
     *
     * @param cellData
     * @param clazz
     * @param contentProperty
     * @param converterMap
     * @param globalConfiguration
庄家钜's avatar
庄家钜 已提交
114 115
     * @param rowIndex
     * @param columnIndex
116 117 118
     * @return
     */
    private static Object doConvertToJavaObject(CellData cellData, Class clazz, ExcelContentProperty contentProperty,
庄家钜's avatar
庄家钜 已提交
119 120
        Map<String, Converter> converterMap, GlobalConfiguration globalConfiguration, Integer rowIndex,
        Integer columnIndex) {
庄家钜's avatar
庄家钜 已提交
121 122 123 124 125 126 127 128
        Converter converter = null;
        if (contentProperty != null) {
            converter = contentProperty.getConverter();
        }
        if (converter == null) {
            converter = converterMap.get(ConverterKeyBuild.buildKey(clazz, cellData.getType()));
        }
        if (converter == null) {
庄家钜's avatar
庄家钜 已提交
129
            throw new ExcelDataConvertException(rowIndex, columnIndex, cellData, contentProperty,
庄家钜's avatar
庄家钜 已提交
130 131 132 133 134
                "Converter not found, convert " + cellData.getType() + " to " + clazz.getName());
        }
        try {
            return converter.convertToJavaData(cellData, contentProperty, globalConfiguration);
        } catch (Exception e) {
庄家钜's avatar
庄家钜 已提交
135
            throw new ExcelDataConvertException(rowIndex, columnIndex, cellData, contentProperty,
庄家钜's avatar
庄家钜 已提交
136
                "Convert data " + cellData + " to " + clazz + " error ", e);
庄家钜's avatar
庄家钜 已提交
137 138 139
        }
    }
}