[alibaba/easyexcel]使用Model读Excel模型时,只设置注解ExcelProperty的value值读取无效

2024-06-20 990 views
5

image

为什么指定index的时候可以正常映射到数据,指定value就都是null。我也换了jar的版本,最新的以及以前的版本,都试了,还是不行。 请问是什么原因?这是个bug吗

我用的版本是 1.1.2-beta5

回答

9

图片是指定了index,是可以正常映射到数据的。 如果去掉index的配置,只保留value的属性配置,就全部是null

0

具体的读取excel使用的是如下方式: image

0

使用说明那里说是可以只指定value,不需要指定index就可以映射到javaBean的,但是我试了也是不可以,跟踪了代码,发现解析的时候还是需要index的,如果没有index,默认是个9999

3

我也是这个情况。不修复很麻烦 还要自己一个个输入index

0

另外还有个问题。data格式化format成("yyyy/MM/dd) 根本没用。依旧是date格式的时间戳

4

我的也是这个问题

8

这个问题确实存在,没有人修复了吗

4

我也遇到 自己实在没辙 自己 用反射 把数据 映射过去 ` package com.thermofisher.dsc.amanda.common.excel.listener;

import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.thermofisher.dsc.amanda.common.crud.Util; import com.thermofisher.dsc.amanda.common.excel.model.ITSCARCache; import com.thermofisher.dsc.amanda.common.excel.model.Validate; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.hssf.usermodel.HSSFDateUtil;

import java.lang.reflect.Field; import java.text.SimpleDateFormat; import java.util.*;

/**

  • @author wenjie.yang on 4/3/2019. */ @Slf4j public class ExcelListener extends AnalysisEventListener {

    private final LinkedHashMap<String,String> TITLE_FILED = new LinkedHashMap<>(); private final HashMap<String,String> TITLE = new HashMap<>(); /**

    • true=>use index
    • false=>use value */ private Boolean isIndex; private Class listenerClazz; private List datas = new ArrayList<>(); private List indexes = new ArrayList<>();

    public ExcelListener(Class listenerClazz,boolean isIndex) { if (!isIndex){ Field[] fields = listenerClazz.getDeclaredFields(); for (Field field:fields){ ExcelProperty excelProperty = field.getDeclaredAnnotationsByType(ExcelProperty.class)[0]; TITLE.put(excelProperty.value()[0],field.getName()); } } this.isIndex = isIndex; this.listenerClazz = listenerClazz; }

    @Override public void invoke(Object object, AnalysisContext context) { Integer rowNum = context.getCurrentRowNum(); if (!isIndex){ List list = (List) object; if (TITLE_FILED.isEmpty()){ initMapKeys(list); } //rowNum > 0 can init data to map if (rowNum>0){ Map<String, String> mapData = createMapData(list); if(listenerClazz == ITSCARCache.class){ if (StringUtils.isEmpty(mapData.get("bill2NO"))){ log.info("the {} num data is wrong, this object is {}", rowNum,object.toString()); return; } } datas.add(mapData); } }else{ if(((Validate)object).validate()){ datas.add(object); }else { log.info("the {} num data is wrong, this object is {}", rowNum,object.toString()); } } }

    private void initMapKeys(List list) { for (int i = 0; i<list.size(); i++){ TITLE_FILED.put(TITLE.get(list.get(i)),null); if (TITLE.keySet().contains(list.get(i))){ indexes.add(i); } } TITLE_FILED.remove(null); }

    private Map<String,String> createMapData(List object) { List list = object; LinkedHashMap<String, String> linkedHashMap = this.copyMap(); int i = 0; for (String key:linkedHashMap.keySet()){ String vaule; try{ vaule = list.get(indexes.get(i)); }catch (Exception e){ vaule= null; } if (isIntTitle(key) && StringUtils.isNotBlank(vaule)){ try { vaule = Integer.valueOf(vaule).toString(); }catch (NumberFormatException e){ vaule = null; } } if (key.indexOf("Date")!=-1){ if (vaule!=null){ linkedHashMap.put(key,dateFormat(vaule)); } }else{ linkedHashMap.put(key,vaule==null?null:vaule.trim()); } i++; } linkedHashMap.remove(null); return linkedHashMap; }

    private boolean isIntTitle(String key){ if ("amDisc".equals(key) || "rmDisc".equals(key)|| "sdDisc".equals(key)){ return true; } return false; }

    private LinkedHashMap<String,String> copyMap(){ LinkedHashMap<String,String> linkedHashMap = new LinkedHashMap<>(); TITLE_FILED.forEach((k,v)->linkedHashMap.put(k,null)); return linkedHashMap; }

    private String dateFormat(String hssDate){

    if (hssDate==null) return null; Double va ; try{ va = Double.valueOf(hssDate); }catch (NumberFormatException e){ return null; } Date date = HSSFDateUtil.getJavaDate(va, false); SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" ); String date2Str = sdf.format(date); return date2Str; }

    @Override public void doAfterAllAnalysed(AnalysisContext context) { // datas.clear();//解析结束销毁不用的资源 }

    private Class getThisClass(){ return Util.getActualArgumentType(this.getClass(), 0); }

    public void clear() { datas.clear(); } public List getDatas() { return datas; } public void setDatas(List datas) { this.datas = datas; } } `

2

使用最新版本还是不行,why?