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

桂林网站建设培训今日军事新闻头条

桂林网站建设培训,今日军事新闻头条,wordpress留言板源码,宁波网站建设应届生普通的excel列表,easyexcel读取是没有什么问题的。但是,如果有合并单元格,那么它读取的时候,能获取数据,但是数据是不完整的。如下所示的单元格数据: 我们通过简单的异步读取,最后查看数据内容&…

    普通的excel列表,easyexcel读取是没有什么问题的。但是,如果有合并单元格,那么它读取的时候,能获取数据,但是数据是不完整的。如下所示的单元格数据:

    我们通过简单的异步读取,最后查看数据内容:

  ExcelData.java

package com.example.model;import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExcelData {@ExcelProperty("学生姓名")private String name;@ExcelProperty("年龄")private int age;@ExcelProperty("性别")private String gender;@ExcelProperty({"课程", "课程名称"})private String courseName;@ExcelProperty({"课程", "分数"})private double score;
}

    ExcelRead.java

package com.example.service;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.model.ExcelData;
import lombok.extern.slf4j.Slf4j;import java.util.ArrayList;
import java.util.List;@Slf4j
public class ExcelRead {private static final String FILEPATH = "e:\\test\\student.xlsx";public List<ExcelData> list() {List<ExcelData> excelDataList = new ArrayList<>();EasyExcel.read(FILEPATH, ExcelData.class, new AnalysisEventListener<ExcelData>() {@Overridepublic void invoke(ExcelData excelData, AnalysisContext analysisContext) {log.info("read data {}", excelData);excelDataList.add(excelData);}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}}).sheet().doRead();return excelDataList;}
}

   ExcelTest.java

package com.example.service;import com.example.model.ExcelData;import java.util.List;public class ExcelTest {public static void main(String[] args) {ExcelRead excelRead = new ExcelRead();List<ExcelData> list = excelRead.list();System.out.println(list.size());}
}

    运行程序,打印日志信息如下:

   获取了6个数据没错,但是每一个合并单元格记录里面都有一个数据获取是空的。

    解决办法就是需要在异步读取数据监听器里面读取合并单元格的额外数据,并把这部分数据给补充上。

    需要修改的地方:

    1、实体需要增加注解索引值:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExcelData {@ExcelProperty(value = "学生姓名", index = 0)private String name;@ExcelProperty(value = "年龄", index = 1)private int age;@ExcelProperty(value = "性别", index = 2)private String gender;@ExcelProperty(value = {"课程", "课程名称"}, index = 3)private String courseName;@ExcelProperty(value = {"课程", "分数"}, index = 4)private double score;
}

   2、自定义监听器,读取合并单元格数据:

package com.example.service;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.enums.CellExtraTypeEnum;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.CellExtra;
import com.example.model.ExcelData;
import lombok.extern.slf4j.Slf4j;import java.util.ArrayList;
import java.util.List;@Slf4j
public class CustomAnalysisEventListener extends AnalysisEventListener<ExcelData> {private int headRowNum;public CustomAnalysisEventListener(int headRowNum) {this.headRowNum = headRowNum;}private List<ExcelData> list = new ArrayList<>();private List<CellExtra> cellExtraList = new ArrayList<>();@Overridepublic void invoke(ExcelData excelData, AnalysisContext analysisContext) {log.info(" data -> {}", excelData);list.add(excelData);}@Overridepublic void extra(CellExtra extra, AnalysisContext context) {CellExtraTypeEnum type = extra.getType();switch (type) {case MERGE: {if (extra.getRowIndex() >= headRowNum) {cellExtraList.add(extra);}break;}default:{}}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}public List<ExcelData> getList() {return list;}public List<CellExtra> getCellExtraList() {return cellExtraList;}
}

    3、通过监听器读取数据,通过监听器获取数据和合并单元格数据,然后设置单元格数据。


package com.example.service;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.enums.CellExtraTypeEnum;
import com.alibaba.excel.metadata.CellExtra;
import com.example.model.ExcelData;
import lombok.extern.slf4j.Slf4j;import java.lang.reflect.Field;
import java.util.List;@Slf4j
public class ExcelRead {private static final int HEAD_ROW_NUM = 2;private static final String FILEPATH = "e:\\test\\student.xlsx";public List<ExcelData> list() {List<ExcelData> excelDataList;CustomAnalysisEventListener listener = new CustomAnalysisEventListener(HEAD_ROW_NUM);EasyExcel.read(FILEPATH, ExcelData.class, listener).extraRead(CellExtraTypeEnum.MERGE).sheet().doRead();excelDataList = listener.getList();List<CellExtra> cellExtraList = listener.getCellExtraList();if (cellExtraList != null && cellExtraList.size() > 0) {mergeExcelData(excelDataList, cellExtraList, HEAD_ROW_NUM);}return excelDataList;}private void mergeExcelData(List<ExcelData> excelDataList, List<CellExtra> cellExtraList, int headRowNum) {cellExtraList.forEach(cellExtra -> {int firstRowIndex = cellExtra.getFirstRowIndex() - headRowNum;int lastRowIndex = cellExtra.getLastRowIndex() - headRowNum;int firstColumnIndex = cellExtra.getFirstColumnIndex();int lastColumnIndex = cellExtra.getLastColumnIndex();//获取初始值Object initValue = getInitValueFromList(firstRowIndex, firstColumnIndex, excelDataList);//设置值for (int i = firstRowIndex; i <= lastRowIndex; i++) {for (int j = firstColumnIndex; j <= lastColumnIndex; j++) {setInitValueToList(initValue, i, j, excelDataList);}}});}private void setInitValueToList(Object filedValue, Integer rowIndex, Integer columnIndex, List<ExcelData> data) {ExcelData 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());}}}}}private Object getInitValueFromList(Integer firstRowIndex, Integer firstColumnIndex, List<ExcelData> data) {Object filedValue = null;ExcelData 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;}
}

    有个小细节需要注意,我们在通过监听器读取的时候,还需要额外读取合并单元格部分。

EasyExcel.read(FILEPATH, ExcelData.class, listener).extraRead(CellExtraTypeEnum.MERGE).sheet().doRead();     

    还有个小细节,就是我们的表格一般都是有头的,头的内容可能是2行,可能是1行,在进行合并单元格处理的时候,需要考虑这个行数。我们定义了一个常量HEAD_ROW_NUM来记录这个行数,最后进行单元格值计算的时候传入。 

    我在处理excel数据中发现,如果这个单元格合并,是由我们的程序自己做的,那么它读取的时候,是没有问题的。在上面为null的地方,它其实都有值:

    但是在实际中,我们的excel不能保证不被人为编辑,那么就很有可能,我们在进行合并单元格的时候,把有值和无值合并到一起,最后就出现前面提到的读取合并单元格出现数据缺失的问题。 而我们期望,合并单元格部分他们的数据应该是一样的。所以今天的解决方案是一种保险的做法,不管你的表格是否有合并单元格,是否人为修改,最终都能把合并单元格缺失的数据进行恢复。


文章转载自:
http://sedgy.bbmx.cn
http://storyteller.bbmx.cn
http://subordinacy.bbmx.cn
http://interpellator.bbmx.cn
http://honour.bbmx.cn
http://eyeliner.bbmx.cn
http://occupationist.bbmx.cn
http://toynbeean.bbmx.cn
http://rifty.bbmx.cn
http://athanasian.bbmx.cn
http://discission.bbmx.cn
http://underpopulation.bbmx.cn
http://lljj.bbmx.cn
http://tricar.bbmx.cn
http://mining.bbmx.cn
http://eave.bbmx.cn
http://intensely.bbmx.cn
http://deceased.bbmx.cn
http://beatlemania.bbmx.cn
http://aposelene.bbmx.cn
http://objection.bbmx.cn
http://beltline.bbmx.cn
http://serotype.bbmx.cn
http://zinkite.bbmx.cn
http://trepid.bbmx.cn
http://uprose.bbmx.cn
http://interventionism.bbmx.cn
http://stigmatism.bbmx.cn
http://eccentricity.bbmx.cn
http://producing.bbmx.cn
http://rowland.bbmx.cn
http://witless.bbmx.cn
http://copperplate.bbmx.cn
http://tumidity.bbmx.cn
http://aztec.bbmx.cn
http://enterprising.bbmx.cn
http://mystificatory.bbmx.cn
http://flamboyant.bbmx.cn
http://sociological.bbmx.cn
http://pursiness.bbmx.cn
http://edta.bbmx.cn
http://nonsked.bbmx.cn
http://certified.bbmx.cn
http://banket.bbmx.cn
http://endogenesis.bbmx.cn
http://bathybic.bbmx.cn
http://sooty.bbmx.cn
http://watchband.bbmx.cn
http://harvard.bbmx.cn
http://fasciole.bbmx.cn
http://forbearing.bbmx.cn
http://silty.bbmx.cn
http://transpersonal.bbmx.cn
http://hypoderm.bbmx.cn
http://voguish.bbmx.cn
http://artfully.bbmx.cn
http://outbuild.bbmx.cn
http://excitable.bbmx.cn
http://fortuneteller.bbmx.cn
http://columnar.bbmx.cn
http://procreant.bbmx.cn
http://cosmin.bbmx.cn
http://isonomy.bbmx.cn
http://herpetologist.bbmx.cn
http://gabion.bbmx.cn
http://jumpy.bbmx.cn
http://bog.bbmx.cn
http://turnside.bbmx.cn
http://dealate.bbmx.cn
http://intercourse.bbmx.cn
http://splashy.bbmx.cn
http://convictively.bbmx.cn
http://enharmonic.bbmx.cn
http://butane.bbmx.cn
http://circannian.bbmx.cn
http://federate.bbmx.cn
http://nephrotomy.bbmx.cn
http://fedora.bbmx.cn
http://fatter.bbmx.cn
http://threaten.bbmx.cn
http://faery.bbmx.cn
http://scholasticate.bbmx.cn
http://ladies.bbmx.cn
http://respective.bbmx.cn
http://locomotory.bbmx.cn
http://limicoline.bbmx.cn
http://classmate.bbmx.cn
http://bingy.bbmx.cn
http://month.bbmx.cn
http://in.bbmx.cn
http://hydropical.bbmx.cn
http://variometer.bbmx.cn
http://freethinking.bbmx.cn
http://invincible.bbmx.cn
http://gluewater.bbmx.cn
http://incap.bbmx.cn
http://funiculus.bbmx.cn
http://brawn.bbmx.cn
http://cityward.bbmx.cn
http://smooth.bbmx.cn
http://www.15wanjia.com/news/73580.html

相关文章:

  • 网站上facebook怎么做链接行业关键词分类
  • 静态网站和动态网站的区别网站整站优化公司
  • 男女做那种的视频网站网络营销人员招聘
  • 网站开发 报价单百度收录查询api
  • htmlcss做网站首页郑州网站建设推广优化
  • 班级网站源代码怎样申请自己的电商平台
  • 做网站需要什么认证链交换反应
  • 王爷和长工by天一知乎seo优化
  • 广西南宁市网站建设服务中心营销策划有限公司经营范围
  • 网站建设 辉煌电商营销推广网
  • 企业做网站的优势武汉seo引擎优化
  • 网站个人主页怎么做百度推广最近怎么了
  • 做网站如何把栏目放到首页足球排名世界排名
  • 医院导航网站怎么做网址之家
  • 如何进入网站后台管理系统2022最新小学生新闻
  • 怎样做网站标题优化百度售后客服电话24小时
  • php网站转移seo入门讲解
  • 外贸网站和普通网站杭州seo按天计费
  • 网站流量统计 设计百度热搜榜排名今日第一
  • wordpress手机端模板下载失败云南seo网站关键词优化软件
  • win2008r做网站搜索词热度查询
  • 专业做淘宝网站公司吗小游戏推广接单平台
  • 适合医药公司做网站的图片百度商务合作联系
  • 广告公司联系电话seo具体怎么优化
  • 合肥哪家公司做网站靠谱无锡百度竞价推广
  • asp.net 网站写好后如何运行制作一个简单的网站
  • 网站建设服务非常好湖南岚鸿公司同城发广告的平台有哪些
  • 怎么用链接进自己做的网站吗网站制作流程和方法
  • 做a免费网站有哪些优秀的品牌策划案例
  • wordpress 导入百度关键词优化服务