动态列导入excel
先说需求:
要求时币制后的几列是动态的,标题为费用项目的代码feecode,需要动态的后面这几列保存到数据库中。
表设计是主表对费用表一对多的关系
依赖
我们这里使用的是easyexcel来做导入
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
</dependency>
获取动态列的费用代码列表
由于是动态列,然而对象的属性的数量又是固定的,无法使用固定的对象来接收excel的数据。
所以我们使用了 Map<String, String> 进行接收数据。
我们先读第一行的标题,将第6列开始的标题读取到 feeCodeList 中,目的是为后面解析费用使用。
读取第一行后直接return
后面的行开始调用 parsePriceVo() 方法进行对象的解析
最后使用 saveBatchPmsPriceTruck() 进行批量保存数据
@Transactional(rollbackFor = Exception.class)
public List<String> importPrice(MultipartFile file) throws IOException {
InputStream inputStream = file.getInputStream();
List<PriceVO> dataList = new ArrayList<>();
List<String> feeCodeList = new ArrayList<>();
EasyExcel.read(new BufferedInputStream(inputStream), new AnalysisEventListener<Map<String, String>>() {
@Override
public void invoke(Map<String, String> data, AnalysisContext context) {
String firstColumn = data.get(0);
if("区段*".equals(firstColumn)) {
for (int i = 6; i < data.entrySet().size(); i++) {
feeCodeList.add(data.get(i));
}
return;
}
PriceVO priceVo = parsePriceVo(factorList,data);
dataList.add(priceVo);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 数据读取完成后的操作
}
}).sheet().doRead();
if(CollectionUtil.isEmpty(dataList)) {
return;
}
saveBatchPmsPriceTruck(dataList);
}
解析对象
省略了数据校验过程和其他不影响主流程的细节。
private PriceVo parsePriceVo(List<String> factorList, Map<String,String> data) {
PriceVo priceVo = new PriceVo();
String stage = data.get(0);
priceVo.setStage(stage);
...
List<FeeItem> feeItemList = new ArrayList<>();
for(int i = 0; i < factorList.size(); i++) {
String feeCode = data.get(6+i);
FeeItem feeItem = new FeeItem();
feeItem.setFeeCode(feeCode);
feeItemList.add(feeItem);
}
priceVo.setFeeItemList(feeItemList);
return priceVo;
}
下一篇写一下动态列的导出 和 本文中前面图片中的单元格合并&样式