就是数据库会有个数据表, 动态映射excel列名和实体类属性之间的关系, 这在easyexcel如何做,看了下源码不太看得懂
[alibaba/easyexcel]哪位老哥有动态导入吗? 动态绑定excel列和实体属性的关系
回答
我也需要类似功能,现在实现了动态表头,但是动态表头对应的动态内容硬是无法实现。。。
请参照demo书写。目前支持 无对象 和创建实体。
我也需要类似功能,现在实现了动态表头,但是动态表头对应的动态内容硬是无法实现。。。 @Myloveisyou1 作者有点敷衍了。有点想法了,明天去公司试试
@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));
}`
我现在使用的是非模板写入Excel的方式开发的,动态列和动态合并单元格。使用模板感觉只能针对固定表头的那种。
假如你都不知道具体有哪些字段,实体类都无法建立的。因为动态的列,你不知道字段的个数嘛
@Myloveisyou1 我这里实体类的字段是确定的,只是对应的列名可能发生改变
我是通过获取注解把实体模板中的index和value重新赋值了