当前位置: 首页 > news >正文

郑州做网站九零后疫情最新政策最新消息

郑州做网站九零后,疫情最新政策最新消息,党校网站建设管理工作方案,秦皇岛网站开发费用文章目录 前言一、需求和效果二、难点和思路三、全部代码踩坑 前言 之前分享的 EasyExcel 批量导入并校验数据,仅支持规则excel,即首行表头,下面对应数据,无合并单元格情况。 本篇主要解决问题: 模板excel 表头不在首…

文章目录

  • 前言
  • 一、需求和效果
  • 二、难点和思路
  • 三、全部代码
  • 踩坑


前言

之前分享的 EasyExcel 批量导入并校验数据,仅支持规则excel,即首行表头,下面对应数据,无合并单元格情况。
本篇主要解决问题:

  1. 模板excel 表头不在首行
  2. 数据项有合并单元格情况

esayexcel版本2.2.7

一、需求和效果

在这里插入图片描述
在这里插入图片描述

二、难点和思路

  1. 跳过表头前的说明

    设置headRowNumber指定表头位置,第三行

EasyExcel.read(inputStream, EvalTemplateReq.class,listener).extraRead(CellExtraTypeEnum.MERGE).sheet().headRowNumber(3).doRead();
  1. 合并单元格数据获取放入list
    合并单元格的数据默认是在合并表格的左上第一个格子,其他为null,获取到这个格子的数据,赋值给其他被合并单元格对应的字段中

3.1 开启合并单元格识别
extraRead(CellExtraTypeEnum.MERGE)开启合并单元格识别
3.2 获取合并的单元格数据
EvalExcelDataListener 重写extra方法,获取到被合并的数据,后续处理。extra方法在invoke方法执行,先不要在意要导入的list部分字段是null,后续重新赋值即可。
extra会从excel头读取,所以要把前2行的数据过滤掉,这里用extra.getFirstRowIndex()>2判断一下

    // 合并单元格private final List<CellExtra> extraMergeInfoList = new ArrayList<>();@Overridepublic void extra(CellExtra extra, AnalysisContext context) {if (extra.getType() == CellExtraTypeEnum.MERGE) {// 处理合并单元格的情况int firstRowIndex = extra.getFirstRowIndex();if(firstRowIndex>2) {extraMergeInfoList.add(extra);}}}

3.3 doAfterAllAnalysed中补全list字段值

    @Overridepublic void doAfterAllAnalysed(AnalysisContext context) {//所有数据解析完毕执行该方法// 防止导入空的Excelif (context.readRowHolder().getRowIndex() <= 0) {throw new ExcelAnalysisException("当前excel无数据!");}//处理合并单元格list = EasyExcelMergeUtil.explainMergeData(list, extraMergeInfoList, 3);saveData();}

3.4 explainMergeData 补全字段值
根据单元格左上角标通过反射获取字段并赋值给其他被合并的单元格,角标对应实体类index属性

三、全部代码

  1. 接收数据实体
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import javax.validation.constraints.NotBlank;
import java.util.List;/*** 评估标准*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class EvalTemplateReq {@ExcelIgnoreprivate String id;/*** 评估项*/@ExcelProperty(value = "评估名称",index = 1)@NotBlank(message = "评估名称不能为空")private String item;/*** 指标简称*/@ExcelProperty(value = "指标简称",index =2)@NotBlank(message = "指标简称不能为空")private String itemShortName;/*** 指标编码*/@ExcelProperty(value = "指标编码",index = 3)@NotBlank(message = "指标编码不能为空")private String itemCode;/*** 指标释义*/@ExcelProperty(value = "指标释义",index = 4)@NotBlank(message = "指标释义不能为空")private String itemExplain;/*** 评价要求/分数 json*/@ExcelIgnoreprivate List<Requirements> requirementList;/*** 系统监测类/参演部门上报类*/@ExcelProperty(value = "分类",index = 0)@NotBlank(message = "分类不能为空")private String type;@ExcelProperty(value = "评价要求",index = 5)@JsonIgnoreprivate String require;@ExcelProperty(value = "分数",index = 6)@JsonIgnoreprivate Integer score;@Builder@Data@AllArgsConstructor@NoArgsConstructorpublic static class Requirements {@ExcelIgnoreprivate String id;/*** 评价内容*/@NotBlank(message = "评价要求不能为空")private String require;/*** 分数*/@NotBlank(message = "分数不能为空")private Integer score;}
}
  1. service调用
    /*** 导入评估标准*/@Overridepublic String importEval(MultipartFile file) {EvalExcelDataListener listener = new EvalExcelDataListener(evalTemplateDao);InputStream inputStream;try {inputStream = file.getInputStream();EasyExcel.read(inputStream, EvalTemplateReq.class,listener).extraRead(CellExtraTypeEnum.MERGE).sheet().headRowNumber(3).doRead();return "全部导入成功!";} catch (IOException e) {throw new BusinessCheckException("Excel 文件流读取失败");} catch (ExcelAnalysisException e) {return e.getMessage();} catch (Exception e) {throw new BusinessException("数据导入失败", e);}}
  1. 合并单元格数据处理util
package com.gsafety.bg.pd.service.excel;import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.CellExtra;
import lombok.extern.slf4j.Slf4j;import java.lang.reflect.Field;
import java.util.List;@Slf4j
public class EasyExcelMergeUtil {/*** 处理合并单元格* @param data               解析数据* @param extraMergeInfoList 合并单元格信息* @param headRowNumber      起始行* @return 填充好的解析数据*/public static <T> List<T> explainMergeData(List<T> data, List<CellExtra> extraMergeInfoList, Integer headRowNumber) {// 循环所有合并单元格信息extraMergeInfoList.forEach(cellExtra -> {int firstRowIndex = cellExtra.getFirstRowIndex() - headRowNumber;int lastRowIndex = cellExtra.getLastRowIndex() - headRowNumber;int firstColumnIndex = cellExtra.getFirstColumnIndex();int lastColumnIndex = cellExtra.getLastColumnIndex();// 获取初始值Object initValue = getInitValueFromList(firstRowIndex, firstColumnIndex, data);// 设置值for (int i = firstRowIndex; i <= lastRowIndex; i++) {for (int j = firstColumnIndex; j <= lastColumnIndex; j++) {setInitValueToList(initValue, i, j, data);}}});return data;}/*** 设置合并单元格的值** @param filedValue  值* @param rowIndex    行* @param columnIndex 列* @param data        解析数据*/private static <T> void setInitValueToList(Object filedValue, Integer rowIndex, Integer columnIndex, List<T> data) {if (rowIndex >= data.size()) return;T object = data.get(rowIndex);for (Field field : object.getClass().getDeclaredFields()) {// 提升反射性能,关闭安全检查field.setAccessible(true);ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);if (annotation != null) {if (annotation.index() == columnIndex) {try {field.set(object, filedValue);break;} catch (IllegalAccessException e) {log.error("设置合并单元格的值异常:{}", e.getMessage());}}}}}/*** 获取合并单元格的初始值* rowIndex对应list的索引* columnIndex对应实体内的字段** @param firstRowIndex    起始行* @param firstColumnIndex 起始列* @param data             列数据* @return 初始值*/private static <T> Object getInitValueFromList(Integer firstRowIndex, Integer firstColumnIndex, List<T> data) {Object filedValue = null;T object = data.get(firstRowIndex);for (Field field : object.getClass().getDeclaredFields()) {// 提升反射性能,关闭安全检查field.setAccessible(true);ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);if (annotation != null) {if (annotation.index() == firstColumnIndex) {try {filedValue = field.get(object);break;} catch (IllegalAccessException e) {log.error("设置合并单元格的初始值异常:{}", e.getMessage());}}}}return filedValue;}}
  1. easyexcel数据监听类
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.enums.CellExtraTypeEnum;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelAnalysisException;
import com.alibaba.excel.metadata.CellExtra;
import com.gsafety.bg.gsdss.common.utils.json.JsonUtil;
import com.gsafety.bg.pd.dao.EvalTemplateDao;
import com.gsafety.bg.pd.model.dto.req.EvalTemplateReq;
import com.gsafety.bg.pd.model.po.EvalTemplatePO;import java.util.*;
import java.util.stream.Collectors;public class EvalExcelDataListener extends AnalysisEventListener<EvalTemplateReq> {private final Integer LIST_COUNT = 19;List<EvalTemplateReq> list = new ArrayList<>(LIST_COUNT);// 合并单元格private final List<CellExtra> extraMergeInfoList = new ArrayList<>();// 由于监听器只能通过new的方式创建,所以可以通过构造器传入dao层对象private final EvalTemplateDao dao;public EvalExcelDataListener(EvalTemplateDao dao) {this.dao = dao;}@Overridepublic void invoke(EvalTemplateReq req, AnalysisContext context) {list.add(req);if (list.size() > LIST_COUNT) {throw new ExcelAnalysisException("当前excel数据量不得大于" + LIST_COUNT + "条!");}}@Overridepublic void extra(CellExtra extra, AnalysisContext context) {if (extra.getType() == CellExtraTypeEnum.MERGE) {// 处理合并单元格的情况int firstRowIndex = extra.getFirstRowIndex();if(firstRowIndex>2) {extraMergeInfoList.add(extra);}}}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {//所有数据解析完毕执行该方法// 防止导入空的Excelif (context.readRowHolder().getRowIndex() <= 0) {throw new ExcelAnalysisException("当前excel无数据!");}//处理合并单元格list = EasyExcelMergeUtil.explainMergeData(list, extraMergeInfoList, 3);saveData();}protected void saveData() {Map<String, List<EvalTemplateReq>> collect = list.stream().collect(Collectors.groupingBy(EvalTemplateReq::getItem));List<EvalTemplatePO> pos = new ArrayList<>();collect.forEach((k, v) -> {List<EvalTemplateReq.Requirements> requirements = v.stream().map(l -> EvalTemplateReq.Requirements.builder().id(v.indexOf(l) + "").require(l.getRequire()).score(l.getScore()).build()).collect(Collectors.toList());pos.add(EvalTemplatePO.builder().item(k).itemCode(collect.get(k).get(0).getItemCode()).itemExplain(collect.get(k).get(0).getItemExplain()).itemShortName(collect.get(k).get(0).getItemShortName()).type(collect.get(k).get(0).getType()).requirements(JsonUtil.of(requirements)).build());});dao.deleteAll();dao.saveAll(pos);}
}

踩坑

  1. extra方法不生效
    extraRead(CellExtraTypeEnum.MERGE)显式指定识别合并单元格数据
    invoke中原校验数据,因为为null导致拦截,不走extra方法。
    执行顺序:invoke->extra->doAfterAllAnalysed
  2. 指定表头位置后extra获取的第一个数据还是首行的合并单元格数据
    headRowNumber(3)只是指定了读取表头的位置,extra是获取整表的所有合并单元格数据,根据excel模板,要跳过2行,获取从第三行后的合并单元格数据。if(firstRowIndex>2)

参考:https://blog.csdn.net/xhmico/article/details/136905419


在这里插入图片描述


文章转载自:
http://foliature.tzmc.cn
http://luncheon.tzmc.cn
http://fluridizer.tzmc.cn
http://pedosphere.tzmc.cn
http://bloat.tzmc.cn
http://incubative.tzmc.cn
http://binnacle.tzmc.cn
http://spreathed.tzmc.cn
http://somersault.tzmc.cn
http://florrie.tzmc.cn
http://subjectless.tzmc.cn
http://patrimony.tzmc.cn
http://seamount.tzmc.cn
http://plummer.tzmc.cn
http://matronship.tzmc.cn
http://trifoliolate.tzmc.cn
http://smirk.tzmc.cn
http://demerit.tzmc.cn
http://filiate.tzmc.cn
http://infuscated.tzmc.cn
http://berdache.tzmc.cn
http://faceless.tzmc.cn
http://dryly.tzmc.cn
http://such.tzmc.cn
http://scillonian.tzmc.cn
http://suborn.tzmc.cn
http://ugric.tzmc.cn
http://aerodonetics.tzmc.cn
http://tora.tzmc.cn
http://unido.tzmc.cn
http://nitrosodimethylamine.tzmc.cn
http://crustification.tzmc.cn
http://isolead.tzmc.cn
http://avulsed.tzmc.cn
http://piteously.tzmc.cn
http://immortally.tzmc.cn
http://recamier.tzmc.cn
http://mutuality.tzmc.cn
http://grave.tzmc.cn
http://piggywiggy.tzmc.cn
http://laryngic.tzmc.cn
http://yet.tzmc.cn
http://toxicosis.tzmc.cn
http://sunbrowned.tzmc.cn
http://clootie.tzmc.cn
http://internuclear.tzmc.cn
http://basilect.tzmc.cn
http://electropaint.tzmc.cn
http://resolve.tzmc.cn
http://meleager.tzmc.cn
http://piemonte.tzmc.cn
http://epistropheus.tzmc.cn
http://tetrasyllable.tzmc.cn
http://uncirculated.tzmc.cn
http://habitue.tzmc.cn
http://duorail.tzmc.cn
http://typing.tzmc.cn
http://kathi.tzmc.cn
http://temazepam.tzmc.cn
http://inclining.tzmc.cn
http://shitless.tzmc.cn
http://resilience.tzmc.cn
http://aglitter.tzmc.cn
http://rarefy.tzmc.cn
http://compressibility.tzmc.cn
http://chicagoan.tzmc.cn
http://beech.tzmc.cn
http://groupthink.tzmc.cn
http://houseboy.tzmc.cn
http://floodwater.tzmc.cn
http://feudatorial.tzmc.cn
http://irreciprocal.tzmc.cn
http://factoried.tzmc.cn
http://skull.tzmc.cn
http://workpeople.tzmc.cn
http://fleshly.tzmc.cn
http://macle.tzmc.cn
http://shensi.tzmc.cn
http://coterie.tzmc.cn
http://encapsulant.tzmc.cn
http://featherlike.tzmc.cn
http://endarteritis.tzmc.cn
http://viscid.tzmc.cn
http://confiture.tzmc.cn
http://leproid.tzmc.cn
http://jackass.tzmc.cn
http://pensioner.tzmc.cn
http://thermophile.tzmc.cn
http://richling.tzmc.cn
http://sanguinopurulent.tzmc.cn
http://tessellate.tzmc.cn
http://eeoc.tzmc.cn
http://amtorg.tzmc.cn
http://telegoniometer.tzmc.cn
http://dovecote.tzmc.cn
http://geminorum.tzmc.cn
http://heterogeneity.tzmc.cn
http://manumission.tzmc.cn
http://boson.tzmc.cn
http://beehouse.tzmc.cn
http://www.dt0577.cn/news/77014.html

相关文章:

  • 网站关键词多少个合适网页设计实训报告
  • 网站开发的实验报告网络营销推广方案ppt
  • 三级域名网络seo推广培训
  • 收到短信说备案被退回但工信部网站上正常啊app投放推广
  • 都匀网站开发的公司seo查询5118
  • 网站建设方案书 百度淄博seo网站推广
  • 成都微信小程序定制开发抚顺seo
  • wordpress添加活动seo优化的优点
  • 怎么在外汇局网站做结汇申报百度seo搜索营销新视角
  • 网站 维护 协议网店代运营商
  • 网站开发的流程和步骤是什么兰州seo网站建设
  • 网站外链如何做在线推广网站的方法
  • 网站外链建设有利于增加网站收录介绍网络营销的短文
  • 做网站要会哪些知识百度平台我的订单
  • 怎么用qq相册做网站百度爱采购推广效果怎么样?
  • 广东网站建设公司龙岩网站推广
  • 有效的网站建设公电脑优化工具
  • 深圳市宝安区政府在线信息流优化师简历模板
  • 网站开发 周期网络推广网络营销外包
  • 西安网站建设联系方式小广告图片
  • 用vs2008做网站安徽建站
  • 做网站和网页有什么区别千锋教育培训多少钱
  • 广东网站建设系统seo推广要多少钱
  • 什么软件网站好企点qq
  • 美女图片网站模板如何做自己的网站
  • 中组织部网站关于党的建设河南网站建设优化技术
  • 企业高端网站建设需要注意哪些事项易思企业网站管理系统
  • 做nba直播网站有哪些厦门人才网招聘最新信息
  • 漳州网站制作成年培训班有哪些
  • 写文章的网站无锡百度竞价推广