Слияние кода завершено, страница обновится автоматически
Текущая логика импорта основана на порядке полей, а не на аннотациях ExcelField
.
Анализ проблемы привёл к следующему решению. Код представлен ниже:
Row titleRow = this.getRow(headerNum);
List<E> dataList = Lists.newArrayList();
for (int i = this.getDataRowNum(); i <= this.getLastDataRowNum(); i++) {
E e = (E) cls.newInstance();
int column = 0;
Row row = this.getRow(i);
StringBuilder sb = new StringBuilder();
for (Object[] os : annotationList){
ExcelField ef = (ExcelField) os[0];
// Получаем количество колонок в заголовочной строке
int cloumNum = titleRow.getPhysicalNumberOfCells();
for (int j = 0; j < cloumNum; j++){
// Проверяем совпадение названий полей между заголовками и аннотациями
if (titleRow.getCell(j).getStringCellValue().equals(ef.title())) {
column = j;
break;
}
}
Object val = this.getCellValue(row, column);
if (val != null){
// Если тип поля — словарь, получаем значение словаря
if (!StringUtils.isBlank(ef.dictType())) {
if (val.toString().contains(",")) {
String[] dictLabelArray = val.toString().split(",");
//val = "";
for (String dictLabel : dictLabelArray) {
val = val + DictUtils.getDictValue(dictLabel, ef.dictType(), "") + ",";
}
} else {
val = DictUtils.getDictValue(val.toString(), ef.dictType(), "");
}
//log.debug("Значение типа словаря: ["+i+","+column+"] " + val);
}
// Определяем тип значения и выполняем преобразование
Class<?> valType = Class.class;
if (os[1] instanceof Field) {
valType = ((Field) os[1]).getType();
} else if (os[1] instanceof Method) {
Method method = ((Method) os[1]);
if ("get".equals(method.getName().substring(0, 3))) {
valType = method.getReturnType();
} else if ("set".equals(method.getName().substring(0, 3))) {
valType = ((Method) os[1]).getParameterTypes()[0];
}
}
//log.debug("Тип значения импорта: ["+i+","+column+"] " + valType);
try {
if (valType == String.class) {
String s = String.valueOf(val.toString());
if (StringUtils.endsWith(s, ".0")) {
val = StringUtils.substringBefore(s, ".0");
} else {
val = String.valueOf(val.toString());
}
} else if (valType == Integer.class) {
val = Double.valueOf(val.toString()).intValue();
} else if (valType == Long.class) {
val = Double.valueOf(val.toString()).longValue();
} else if (valType == Double.class) {
val = Double.valueOf(val.toString());
} else if (valType == Float.class) {
val = Float.valueOf(val.toString());
} else if (valType == Date.class) {
val = DateUtil.getJavaDate((Double) val);
} else {
if (ef.fieldType() != Class.class) {
val = ef.fieldType().getMethod("getValue", String.class).invoke(null, val.toString());
} else {
val = Class.forName(this.getClass().getName().replaceAll(this.getClass().getSimpleName(),
"fieldtype." + valType.getSimpleName() + "Type")).getMethod("getValue", String.class).invoke(null, val.toString());
}
}
} catch (Exception ex) {
log.info("Ошибка получения значения ячейки ["+i+","+column+"]:" + ex.toString());
val = null;
}
// Устанавливаем значение объекта
if (os[1] instanceof Field) {
Reflections.invokeSetter(e, ((Field) os[1]).getName(), val);
} else if (os[1] instanceof Method) {
String methodName = ((Method) os[1]).getName();
if ("get".equals(methodName.substring(0, 3))) {
methodName = "set" + StringUtils.substringAfter(methodName, "get");
}
Reflections.invokeMethod(e, methodName, new Class[]{valType}, new Object[]{val});
}
}
sb.append(val + ", ");
}
Этот код обеспечивает правильное отображение данных из Excel файла с учётом аннотаций ExcelField
.