1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/thinkgem-jeesite

 / Детали:

При импорте в Excel поле title не выполняет роль сопоставления.

Предстоит сделать
Владелец
Создано  
28.02.2025

Текущая логика импорта основана на порядке полей, а не на аннотациях 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.

Комментарий (0)

GitLife Service Account Задача создана

Вход Перед тем как оставить комментарий

Статус
Ответственный
Контрольная точка
Pull Requests
Связанные запросы на слияние могут быть закрыты после их объединения
Ветки
Дата начала   -   Крайний срок
-
Закрепить/Открепить
Приоритет
Участники(1)
1
https://api.gitlife.ru/oschina-mirror/thinkgem-jeesite.git
git@api.gitlife.ru:oschina-mirror/thinkgem-jeesite.git
oschina-mirror
thinkgem-jeesite
thinkgem-jeesite