mirror of https://github.com/alibaba/easyexcel
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
5.2 KiB
138 lines
5.2 KiB
package com.alibaba.excel.util; |
|
|
|
import java.lang.reflect.Field; |
|
import java.lang.reflect.ParameterizedType; |
|
import java.lang.reflect.Type; |
|
import java.util.Map; |
|
|
|
import com.alibaba.excel.context.AnalysisContext; |
|
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.property.ExcelContentProperty; |
|
import com.alibaba.excel.read.metadata.holder.ReadHolder; |
|
import com.alibaba.excel.read.metadata.holder.ReadSheetHolder; |
|
|
|
/** |
|
* Converting objects |
|
* |
|
* @author Jiaju Zhuang |
|
**/ |
|
public class ConverterUtils { |
|
|
|
private ConverterUtils() {} |
|
|
|
/** |
|
* Convert it into a String map |
|
* |
|
* @param cellDataMap |
|
* @param context |
|
* @return |
|
*/ |
|
public static Map<Integer, String> convertToStringMap(Map<Integer, CellData<?>> cellDataMap, AnalysisContext context) { |
|
Map<Integer, String> stringMap = MapUtils.newHashMapWithExpectedSize(cellDataMap.size()); |
|
ReadSheetHolder readSheetHolder = context.readSheetHolder(); |
|
int index = 0; |
|
for (Map.Entry<Integer, CellData<?>> entry : cellDataMap.entrySet()) { |
|
Integer key = entry.getKey(); |
|
CellData<?> cellData = entry.getValue(); |
|
while (index < key) { |
|
stringMap.put(index, null); |
|
index++; |
|
} |
|
index++; |
|
if (cellData.getType() == CellDataTypeEnum.EMPTY) { |
|
stringMap.put(key, null); |
|
continue; |
|
} |
|
Converter<?> converter = |
|
readSheetHolder.converterMap().get(ConverterKeyBuild.buildKey(String.class, cellData.getType())); |
|
if (converter == null) { |
|
throw new ExcelDataConvertException(context.readRowHolder().getRowIndex(), key, cellData, null, |
|
"Converter not found, convert " + cellData.getType() + " to String"); |
|
} |
|
try { |
|
stringMap.put(key, |
|
(String)(converter.convertToJavaData(cellData, null, readSheetHolder))); |
|
} catch (Exception e) { |
|
throw new ExcelDataConvertException(context.readRowHolder().getRowIndex(), key, cellData, null, |
|
"Convert data " + cellData + " to String error ", e); |
|
} |
|
} |
|
return stringMap; |
|
} |
|
|
|
/** |
|
* Convert it into a Java object |
|
* |
|
* @param cellData |
|
* @param field |
|
* @param contentProperty |
|
* @param converterMap |
|
* @param readSheetHolder |
|
* @param rowIndex |
|
* @param columnIndex |
|
* @return |
|
*/ |
|
public static Object convertToJavaObject(CellData<?> cellData, Field field, ExcelContentProperty contentProperty, |
|
Map<String, Converter<?>> converterMap, ReadSheetHolder readSheetHolder, Integer rowIndex, |
|
Integer columnIndex) { |
|
Class<?> clazz; |
|
if (field == null) { |
|
clazz = String.class; |
|
} else { |
|
clazz = field.getType(); |
|
} |
|
if (clazz == CellData.class) { |
|
Type type = field.getGenericType(); |
|
Class<?> classGeneric; |
|
if (type instanceof ParameterizedType) { |
|
ParameterizedType parameterizedType = (ParameterizedType)type; |
|
classGeneric = (Class<?>)parameterizedType.getActualTypeArguments()[0]; |
|
} else { |
|
classGeneric = String.class; |
|
} |
|
CellData<Object> cellDataReturn = new CellData<Object>(cellData); |
|
cellDataReturn.setData(doConvertToJavaObject(cellData, classGeneric, contentProperty, converterMap, |
|
readSheetHolder, rowIndex, columnIndex)); |
|
return cellDataReturn; |
|
} |
|
return doConvertToJavaObject(cellData, clazz, contentProperty, converterMap, readSheetHolder, rowIndex, |
|
columnIndex); |
|
} |
|
|
|
/** |
|
* @param cellData |
|
* @param clazz |
|
* @param contentProperty |
|
* @param converterMap |
|
* @param readSheetHolder |
|
* @param rowIndex |
|
* @param columnIndex |
|
* @return |
|
*/ |
|
private static Object doConvertToJavaObject(CellData<?> cellData, Class<?> clazz, |
|
ExcelContentProperty contentProperty, |
|
Map<String, Converter<?>> converterMap, ReadSheetHolder readSheetHolder, Integer rowIndex, |
|
Integer columnIndex) { |
|
Converter<?> converter = null; |
|
if (contentProperty != null) { |
|
converter = contentProperty.getConverter(); |
|
} |
|
if (converter == null) { |
|
converter = converterMap.get(ConverterKeyBuild.buildKey(clazz, cellData.getType())); |
|
} |
|
if (converter == null) { |
|
throw new ExcelDataConvertException(rowIndex, columnIndex, cellData, contentProperty, |
|
"Converter not found, convert " + cellData.getType() + " to " + clazz.getName()); |
|
} |
|
try { |
|
return converter.convertToJavaData(cellData, contentProperty, readSheetHolder); |
|
} catch (Exception e) { |
|
throw new ExcelDataConvertException(rowIndex, columnIndex, cellData, contentProperty, |
|
"Convert data " + cellData + " to " + clazz + " error ", e); |
|
} |
|
} |
|
}
|
|
|