[alibaba/easyexcel]哪位老哥有动态导入吗? 动态绑定excel列和实体属性的关系

2024-05-21 193 views
5

就是数据库会有个数据表, 动态映射excel列名和实体类属性之间的关系, 这在easyexcel如何做,看了下源码不太看得懂

回答

8

我也需要类似功能,现在实现了动态表头,但是动态表头对应的动态内容硬是无法实现。。。

3

请参照demo书写。目前支持 无对象 和创建实体。

4

我也需要类似功能,现在实现了动态表头,但是动态表头对应的动态内容硬是无法实现。。。 @Myloveisyou1 作者有点敷衍了。有点想法了,明天去公司试试

0

@Myloveisyou1 经过尝试 通过重写invokeHeadMap 可以动态改变映射关系,供参考,propColumnMap 内容可以从数据库加载 其中用到了guava的集合工具类,请知悉.

其中实体类中 无需指定列名和index 请注意,这里是导入,不是导出!!!!!!

`public class HospitalVisitInfoIMO extends BaseIMO {

@ExcelProperty
private String outNo;

@ExcelProperty
private String employeeNo;

@ExcelProperty
private String idcard;

@ExcelProperty
private String billType;

//医院名称
@ExcelProperty
private String hospitalName;

//住院时间
@ExcelProperty(converter = LocalDateTimeConverter.class)
private LocalDateTime inDate;

//出院时间
@ExcelProperty(converter = LocalDateTimeConverter.class)
private LocalDateTime outDate;

//结算时间
@ExcelProperty(converter = LocalDateTimeConverter.class)
private LocalDateTime dealDate;

//总费用
@ExcelProperty
private Double sumCost;

//医疗保险支付金额
@ExcelProperty
private Double ylbxCost;

//医保个人账户支付金额
@ExcelProperty
private Double ybgrCost;

//现金支付金额
@ExcelProperty
private Double cashCost;

//大额医疗费用统筹支付金额
@ExcelProperty
private Double daeyiliaoCost;

//其他支付金额
@ExcelProperty
private Double otherCost;

//自费项目金额
@ExcelProperty
private Double selfCost;

//起付标准
@ExcelProperty
private Double payLine;

//结算地点
@ExcelProperty
private String payArea;

}`

`@Override public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) { Map<String,String> propColumnMap = Maps.newHashMap(); propColumnMap.put("就医数据ID","outNo"); propColumnMap.put("职工编号","employeeNo"); propColumnMap.put("身份证号码","idcard"); propColumnMap.put("医疗类别","billType"); propColumnMap.put("医院名称","hospitalName"); propColumnMap.put("入院日期","inDate"); propColumnMap.put("出院日期","outDate"); propColumnMap.put("结算日期","dealDate"); propColumnMap.put("医疗总费用","sumCost"); propColumnMap.put("基本医疗保险支付金额","ylbxCost"); propColumnMap.put("医保个人账户支付金额","ybgrCost"); propColumnMap.put("现金支付金额","cashCost"); propColumnMap.put("大额医疗费用统筹支付金额","daeyiliaoCost"); propColumnMap.put("其他支付金额","otherCost"); propColumnMap.put("自费项目金额","selfCost"); propColumnMap.put("起付标准","payLine"); propColumnMap.put("结算地点","payArea");

    Map<Integer,ExcelContentProperty> contentPropertyMap = Maps.newHashMap();
    Map<Integer,Head> headMaps = Maps.newHashMap();

    Collection<ExcelContentProperty> values1 = context.currentReadHolder().excelReadHeadProperty().getContentPropertyMap().values();
    Collection<Head> values = context.currentReadHolder().excelReadHeadProperty().getHeadMap().values();

    Map<String, ExcelContentProperty> excelContentPropertyMap = Maps.uniqueIndex(values1, new Function<ExcelContentProperty, String>() {
        @Override
        public String apply(ExcelContentProperty input) {
            return input.getField().getName();
        }
    });

    Map<String, Head> excelHeadMap = Maps.uniqueIndex(values, new Function<Head, String>() {
        @Override
        public String apply(Head input) {
            return input.getFieldName();
        }
    });

    Set<Integer> integers = headMap.keySet();
    for (Integer integer : integers) {
        String s = headMap.get(integer);
        if(!propColumnMap.containsKey(s)) continue;

        contentPropertyMap.put(integer,excelContentPropertyMap.get(propColumnMap.get(s)));
        headMaps.put(integer,excelHeadMap.get(propColumnMap.get(s)));
    }
    if(!contentPropertyMap.isEmpty()){
        context.currentReadHolder().excelReadHeadProperty().setContentPropertyMap(contentPropertyMap);
        context.currentReadHolder().excelReadHeadProperty().setHeadMap(headMaps);
    }
    log.info("headMap:{}", JSON.toJSONString(headMap));
}`
4

我现在使用的是非模板写入Excel的方式开发的,动态列和动态合并单元格。使用模板感觉只能针对固定表头的那种。

1

假如你都不知道具体有哪些字段,实体类都无法建立的。因为动态的列,你不知道字段的个数嘛

2

@Myloveisyou1 我这里实体类的字段是确定的,只是对应的列名可能发生改变

8

我是通过获取注解把实体模板中的index和value重新赋值了