精华内容
下载资源
问答
  • EasyExcel读取跨行单元格数据为空的解决办法
    千次阅读
    2020-12-19 12:52:29

    ​ 目标excel文件内容如下

    ​ 由于A列的“Y00001”和C列的数据是B4,B5,B6共用的数据项,我理想中的情况是easyexcel在做读取操作时,在读取三行数据时都会把A列和C列的数据给读出来。但是在读取的时候,只有第一次读取能把A、C列的数据读取出来,后面两次读取A、C列的值为空。目前没有从根本上找到原因,那就只能从程序的设计上去解决这个问题了。

    ​ 通过EasyExcel读取目标文件

    EasyExcel.read("D:\\Users\\admin\\Documents\\Tencent Files\\1430424583\\FileRecv\\demo.xls", new FaguiSheet()).sheet().doRead();

    ​ 解决思路,如果A、C列值找不到了的话,就判定这是个跨行数据,就复用之前读取的数据,需要用一个Map集合去存储之前读取的有效数据。

    ​ ReadListener实现类

    class FaguiSheet extends AnalysisEventListener> {

    // 所有要插入的数据

    private List datas = new ArrayList<>();

    // 缓存上一次跨行数据的有效数据

    private Map preContent;

    @Override

    public void invoke(Map o, AnalysisContext analysisContext) {

    DemoModel model = new DemoModel();

    String weifaxingwei = o.get(2);

    String weifantiaokuan = o.get(3);

    String chufayiju = o.get(4);

    String weifachengdu = o.get(5);

    String consequence = o.get(6);

    String chufabiaozhun = o.get(7);

    // 如果数据是空的话,从缓存对象中取值

    if (StringUtils.isBlank(weifaxingwei)) {

    weifaxingwei = preContent.get(2);

    }

    if (StringUtils.isBlank(weifantiaokuan)) {

    weifantiaokuan = preContent.get(3);

    }

    if (StringUtils.isBlank(chufayiju)) {

    chufayiju = preContent.get(4);

    }

    if (StringUtils.isBlank(weifachengdu)) {

    weifachengdu = preContent.get(5);

    }

    if (StringUtils.isBlank(consequence)) {

    consequence = preContent.get(6);

    }

    if (StringUtils.isBlank(chufabiaozhun)) {

    chufabiaozhun = preContent.get(7);

    }

    model.setFaguibianhao(faguibianhao);

    model.setWeifaxingwei(weifaxingwei);

    model.setWeifantiaokuan(weifantiaokuan);

    model.setChufayiju(chufayiju);

    model.setWeifachengdu(weifachengdu);

    model.setConsequence(consequence);

    model.setChufabiaozhun(chufabiaozhun);

    // 将数据放入list

    datas.add(model);

    // 复用跨行数据的实现

    String uniqueKey = o.get(0);

    // 如果A列的值为空,那么说明这是跨行列,如果取的值不是空,那说明这是第一次读取跨行列数据

    // 如果preContent为空,说明这是第一次读取sheet表格的数据

    if (!StringUtils.isBlank(uniqueKey) || preContent == null) {

    preContent = o;

    }

    }

    /**

    * 表格数据解析完之后调用

    */

    @Override

    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    for (DemoModel model : datas) {

    // 往数据库里插入数据

    demoMapper.insertSelective(model);

    }

    }

    }

    ​ 数据插入成功

    ​ 当前EasyExcel版本2.1.3,不知道后续版本会不会修复这个问题,先在这记录一下

    更多相关内容
  • easyexcel读取合并单元格

    千次阅读 多人点赞 2020-12-01 18:01:43
    文章目录easy-excel读取合并单元格一、设置读取额外信息二、重写Listener中的extra()方法,获取合并单元格的信息三、遍历合并单元格的信息四、代码清单1. UploadDataListener.java2. ExcelAnalysisHelper.java 一、...

    easyexcel读取合并单元格

    一、设置读取额外信息

    在这里插入图片描述

    二、重写Listener中的extra()方法,获取合并单元格的信息

    在这里插入图片描述

    三、遍历合并单元格的信息

    1. 合并单元格只有第一个(firstRowIndex,firstColumnIndex)有值,所以要取到这个值。
    2. 通过获取到的合并单元格信息(firstRowIndex,lastRowIndex,firstColumnIndex,lastColumnIndex),遍历此区域的每一个单元格,并给每一个单元格都赋上该值
    3. 此方法的重点在于利用反射找到实体对应的属性,对应关系是@ExcelProperty(index = 0)->columnIndex
      index对应了columnIndex(也就是字段在excel所在的位置)rowindex对应了解析出来的List<T> data的索引值

    四、代码清单

    1. UploadDataListener.java

    import com.alibaba.excel.context.AnalysisContext;
    import com.alibaba.excel.event.AnalysisEventListener;
    import com.alibaba.excel.metadata.CellExtra;
    import com.alibaba.fastjson.JSON;
    import com.baomidou.mybatisplus.extension.api.Assert;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 模板的读取类
     *
     * @author wangwei
     */
    public class UploadDataListener<T> extends AnalysisEventListener<T> {
        private static final Logger LOGGER = LoggerFactory.getLogger(UploadDataListener.class);
        /**
         * 解析的数据
         */
        List<T> list = new ArrayList<>();
    
        /**
         * 正文起始行
         */
        private Integer headRowNumber;
        /**
         * 合并单元格
         */
        private List<CellExtra> extraMergeInfoList = new ArrayList<>();
    
        public UploadDataListener(Integer headRowNumber) {
            this.headRowNumber = headRowNumber;
        }
    
        /**
         * 这个每一条数据解析都会来调用
         *
         * @param data    one row value. Is is same as {@link AnalysisContext#readRowHolder()}
         * @param context context
         */
        @Override
        public void invoke(T data, AnalysisContext context) {
            LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data));
            list.add(data);
        }
    
        /**
         * 所有数据解析完成了 都会来调用
         *
         * @param context context
         */
        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {
            LOGGER.info("所有数据解析完成!");
        }
    
        /**
         * 加上存储数据库
         */
        public List<T> getData() {
            return list;
        }
    
        @Override
        public void extra(CellExtra extra, AnalysisContext context) {
            LOGGER.info("读取到了一条额外信息:{}", JSON.toJSONString(extra));
            switch (extra.getType()) {
                case COMMENT: {
                    LOGGER.info("额外信息是批注,在rowIndex:{},columnIndex;{},内容是:{}", extra.getRowIndex(), extra.getColumnIndex(),
                            extra.getText());
                    break;
                }
                case HYPERLINK: {
                    if ("Sheet1!A1".equals(extra.getText())) {
                        LOGGER.info("额外信息是超链接,在rowIndex:{},columnIndex;{},内容是:{}", extra.getRowIndex(),
                                extra.getColumnIndex(), extra.getText());
                    } else if ("Sheet2!A1".equals(extra.getText())) {
                        LOGGER.info(
                                "额外信息是超链接,而且覆盖了一个区间,在firstRowIndex:{},firstColumnIndex;{},lastRowIndex:{},lastColumnIndex:{},"
                                        + "内容是:{}",
                                extra.getFirstRowIndex(), extra.getFirstColumnIndex(), extra.getLastRowIndex(),
                                extra.getLastColumnIndex(), extra.getText());
                    } else {
                        Assert.fail("Unknown hyperlink!");
                    }
                    break;
                }
                case MERGE: {
                    LOGGER.info(
                            "额外信息是合并单元格,而且覆盖了一个区间,在firstRowIndex:{},firstColumnIndex;{},lastRowIndex:{},lastColumnIndex:{}",
                            extra.getFirstRowIndex(), extra.getFirstColumnIndex(), extra.getLastRowIndex(),
                            extra.getLastColumnIndex());
                    if (extra.getRowIndex() >= headRowNumber) {
                        extraMergeInfoList.add(extra);
                    }
                    break;
                }
                default: {
                }
            }
        }
    
        public List<CellExtra> getExtraMergeInfoList() {
            return extraMergeInfoList;
        }
    }
    
    

    2. ExcelAnalysisHelper.java

    import cn.xxx.UploadDataListener;
    import cn.xxx.BizException;
    import cn.xxx.ResultCode;
    import com.alibaba.excel.EasyExcel;
    import com.alibaba.excel.annotation.ExcelProperty;
    import com.alibaba.excel.enums.CellExtraTypeEnum;
    import com.alibaba.excel.metadata.CellExtra;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.util.CollectionUtils;
    import org.springframework.web.multipart.MultipartFile;
    
    import java.io.IOException;
    import java.lang.reflect.Field;
    import java.util.List;
    
    /**
     * @author wangwei
     * @date 2020-12-01 13:34
     **/
    public class ExcelAnalysisHelper<T> {
        private static final Logger LOGGER = LoggerFactory.getLogger(ExcelAnalysisHelper.class);
    
        public List<T> getList(MultipartFile file, Class<T> clazz) {
            return getList(file, clazz, 0, 1);
        }
    
        public List<T> getList(MultipartFile file, Class<T> clazz, Integer sheetNo, Integer headRowNumber) {
            UploadDataListener<T> listener = new UploadDataListener<>(headRowNumber);
            try {
                EasyExcel.read(file.getInputStream(), clazz, listener).extraRead(CellExtraTypeEnum.MERGE).sheet(sheetNo).headRowNumber(headRowNumber).doRead();
            } catch (IOException e) {
                LOGGER.error(e.getMessage());
            }
            List<CellExtra> extraMergeInfoList = listener.getExtraMergeInfoList();
            if (CollectionUtils.isEmpty(extraMergeInfoList)) {
                return listener.getData();
            }
            List<T> data = explainMergeData(listener.getData(), extraMergeInfoList, headRowNumber);
            return data;
        }
    
        /**
         * 处理合并单元格
         *
         * @param data               解析数据
         * @param extraMergeInfoList 合并单元格信息
         * @param headRowNumber      起始行
         * @return 填充好的解析数据
         */
        private 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        解析数据
         */
        public void setInitValueToList(Object filedValue, Integer rowIndex, Integer columnIndex, List<T> data) {
            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) {
                            throw new BizException(ResultCode.FAILURE, "解析数据时发生异常!");
                        }
                    }
                }
            }
        }
    
    
        /**
         * 获取合并单元格的初始值
         * rowIndex对应list的索引
         * columnIndex对应实体内的字段
         *
         * @param firstRowIndex    起始行
         * @param firstColumnIndex 起始列
         * @param data             列数据
         * @return 初始值
         */
        private 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) {
                            throw new BizException(ResultCode.FAILURE, "解析数据时发生异常!");
                        }
                    }
                }
            }
            return filedValue;
        }
    }
    

    注:easyexcel版本为2.2.6

    <!--========================EasyExcel 配置============================-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>easyexcel</artifactId>
                <version>2.2.6</version>
            </dependency>
            <!--========================EasyExcel 配置结束========================-->
    
    展开全文
  • 表格中8行数据,就是进行了八次读取,对于合并单元格所在的列,只有第一行进行了数据映射,其余均为null,所以从这里从每行读取完成之后进行数据组装即可。 读取测试类: public class PersonalExcel { public ...

    1.需求场景描述
    2.问题分析与实现方案

    1.需求场景描述

        现在有个业务需要按照指定模板上传选择题,并进行入表处理,使用easyExcel进行文件上传并读取数据,其中涉及合并单元数据读取问题,这里简单记录一下实现过程,希望对有同样需求的同学有所帮助.下面贴一下文件上传的模板:
    在这里插入图片描述
    其中每个选择题的题干部分是合并单元格,每个选择题的四个固定选项分别占一行。入表之前期望读取的数据格式为:
    在这里插入图片描述
    2.问题分析与实现方案

        对于此种场景,根据easy excel读取原理,每行读取完成都支持进行监听回调(可自定义监听器执行invoke中获取所有行数读取信息),所有行数读取完成之后将组装数据进行输出(所有行数读取完成会执行自定义监听器中doAfterAllAnalysed)。按照一般读取操作发现都是按照合并前的行数进行读取。以展示模板信息为例说讲,表格中8行数据,就是进行了8次读取,对于合并单元格所在的列,只有第一行进行了实体类属性数据映射,对于合并过的单元格对应的实体类属性值均为null。以下为代码调试展示说明:
    每道题第一行读取的实体类属性值:
    每道题第一行之外读取的实体类属性值:
    所以可以将每行读取完成之后的数据进行组装即可,这里添加了一下目标数据格式类: ExamInfo.java
    下面贴一下案例代码:
    easy excel文件读取类(与模板文件对应):

    public class ExamMsg {
    
        @ExcelProperty("题目描述")
        private String answer;
    
        @ExcelProperty("考试答案")
        private String stem;
    
        @ExcelProperty("考试答案分析")
        private String analyse;
    
        @ExcelProperty("题目单项分数")
        private Integer singleScore;
    
    
        @ExcelProperty("选项")
        private String choiceType;
    
        @ExcelProperty("选项内容")
        private String optionContent;
    	
    	// 省略get/set
    }
    

    目标数据组装类(入表之前的最终数据格式):

    public class ExamInfo {
    
        private String answer;
    
        private String stem;
    
        private String analyse;
    
        private Integer singleScore;
    
        private List<EaxmChoiceInfo> eaxmChoiceInfoList=new ArrayList<>();
    // 省略get/set
    }
    

    每个选择题的四个选择项实体类:

    public class EaxmChoiceInfo {
    
        private String choiceType;
    
        private String optionContent;
        // 省略get/set
    }
    

    自定义监听器

    public class ExamListener implements ReadListener<ExamMsg> {
    
      // 自定义消费者函数接口用于自定义监听器中数据组装
        private final Consumer<List<ExamInfo>> consumer;
    
        public ExamListener(Consumer<List<ExamInfo>> consumer) {
            this.consumer = consumer;
        }
    
        // easy excel读取参数
        private List<ExamMsg> examMsgList=new ArrayList<>();
        // 封装读取对象
        private List<ExamInfo> examInfoList=new ArrayList<>();
        // 每行读取完成之后会执行
        @Override
        public void invoke(ExamMsg data, AnalysisContext context) throws IllegalAccessException {
    
            // 按照格式组装数据
            if(data.getStem() != null){
                ExamInfo examInfo = new ExamInfo();
                BeanUtils.copyProperties(data,examInfo);
                examInfo.getEaxmChoiceInfoList().add(new EaxmChoiceInfo(data.getChoiceType(),data.getOptionContent()));
                examInfoList.add(examInfo);
            }else {
                // 倒序添加选择题信息,只对最后一个进行添加选项数据信息
                    examInfoList.get(examInfoList.size() - 1).getEaxmChoiceInfoList().add(new EaxmChoiceInfo(data.getChoiceType(),data.getOptionContent()));
            }
        }
    	// 每行读取完成之后执行
        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {
             if (CollectionUtils.isNotEmpty(examInfoList)) {
                consumer.accept(examInfoList);
            }
        }
    }
    

    文件读取测试类:

    public class PersonalExcel {
    
        public static void main(String[] args) {
    List<ExamInfo> examInfoList=new ArrayList<>();
            String fileName = "E:\\项目汇总\\选择题录入模板" + ".xlsx";
    
    
          
           EasyExcel.read(fileName, ExamMsg.class, new ExamListener(examInfos -> {
                for (ExamInfo examInfo : examInfos) {
                    examInfoList.add(examInfo);
                }
            })).sheet().doRead();
            System.out.println(examInfoList);
        }
        }
    

        控制台打印读取数据:

    [ExamInfo{answer='新冠肺炎起源于哪一年?', stem='A', analyse='经验得知', singleScore=2, 
    		eaxmChoiceInfoList=[EaxmChoiceInfo{choiceType='A', optionContent='2019'}, 
    							EaxmChoiceInfo{choiceType='B', optionContent='2022'},
    							EaxmChoiceInfo{choiceType='C', optionContent='2021'},
    							EaxmChoiceInfo{choiceType='D', optionContent='2003'}]},
    	ExamInfo{answer='刘备的最好的朋友是谁?', stem='B', analyse='猜的', singleScore=2, 
    		eaxmChoiceInfoList=[EaxmChoiceInfo{choiceType='A', optionContent='关羽'},
    							EaxmChoiceInfo{choiceType='B', optionContent='诸葛亮'},
    							EaxmChoiceInfo{choiceType='C', optionContent='张飞'}, EaxmChoiceInfo{choiceType='D', optionContent='曹操'}]}]
    

        以上为处理合并单元格文件读取的实现方案,如果对你有帮助欢迎点赞收藏!
    更多easy excel实战文章:
        Easy excel实战:读取文件自定义转化器不生效问题处理方案
         EasyExcel实战:实现导入文件参数校验并记录异常信息

    展开全文
  • 比如我一个经过excel函数计算的值固定放在 K20这个单元格,该怎么去拿?</p>
  • 关于easyexcel通过模板读取表格的,网上已经有好多了,而且源码里也有详细的demo,这里就不在多说。这里记录一下我的使用。 一: 目前有个接口是上传Excel并且返回第一行,之前用的是POI,但是数据量大的话,100w...

    关于easyexcel通过模板读取表格的,网上已经有好多了,而且源码里也有详细的demo,这里就不在多说。这里记录一下我的使用。

    一:

        目前有个接口是上传Excel并且返回第一行,之前用的是POI,但是数据量大的话,100w条数据就oom了,所以切换到easyexcel,之后内存占用果然小了许多。

    二:

        首先引入依赖,目前我用的是2.1.4

     <!-- 快速处理Excel工具-->        
    <dependency>            
        <groupId>com.alibaba</groupId>            
        <artifactId>easyexcel</artifactId>            
        <version>2.1.4</version>        
    </dependency>

    然后创建一个listener,这个需要继承AnalysisEventListener,

    import com.alibaba.excel.context.AnalysisContext;
    import com.alibaba.excel.event.AnalysisEventListener;
    import com.alibaba.excel.exception.ExcelDataConvertException;
    import com.ehl.etl.ext.utils.JSONArray;
    import com.ehl.etl.ext.utils.JSONObject;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import java.util.Map;
    public class ExcelReadListener extends AnalysisEventListener<Map<Integer, String>> {
    	private Logger logger = LoggerFactory.getLogger(ExcelReadListener.class);
    //	//	 每隔N条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
    	private static final int BATCH_COUNT = 3000;
    //	自定义用于暂时存储数据,通过Getter在方法中获取
    	JSONArray array = new JSONArray();
    	/**
    	 * 在转换异常 获取其他异常下会调用本接口。抛出异常则停止读取。如果这里不抛出异常则 继续读取下一行。
    	 * 如果不重写该方法,默认抛出异常,停止读取
    	 *
    	 * @param exception
    	 * @param context
    	 * @throws Exception
    	 */
    	@Override
    	public void onException(Exception exception, AnalysisContext context) {
    		logger.error("解析失败,但是继续解析下一行:{}", exception.getMessage());
    		if (exception instanceof ExcelDataConvertException) {
    			ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception;
    			logger.error("第{}行,第{}列解析异常,数据为:{}", excelDataConvertException.getRowIndex(),
    					excelDataConvertException.getColumnIndex(), excelDataConvertException.getCellData());
    		}
    	}
    	/**
    	 * 每解析一行会回调invoke()方法。
    	 * 如果当前行无数据,该方法不会执行,
    	 * 也就是说如果导入的的excel表无数据,该方法不会执行,
    	 * 不需要对上传的Excel表进行数据非空判断
    	 *
    	 * @param map  当前读取到的行数据
    	 * @param analysisContext 定义了获取读取excel相关属性的方法
    	 */
    	@Override
    	public void invoke(Map<Integer, String> map, AnalysisContext analysisContext) {
    //		目前只需要表格第一行,这里直接跳过
    		return;
    	}
    	/**
    	 * 这里会一行行的返回头,每个sheet只返回一次
    	 *
    	 * @param headMap
    	 * @param context
    	 */
    	@Override
    	public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
    		logger.info("解析到一条头数据:{}", headMap.toString());
    		for (int i = 0; i < headMap.size(); i++) {
    			JSONObject object = new JSONObject();
    			object.put("name","c_"+(i+1));
    			object.put("type","String");
    			if (headMap.get(i) == null) {
    				object.put("desc","");
    			} else {
    				object.put("desc",headMap.get(i));
    			}
    			array.add(object);
    		}
    	}
    	/**
    	 * 解析监听器
    	 * 每个sheet解析结束会执行该方法
    	 */
    	@Override
    	public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    		logger.info("/*------- 当前sheet读取完毕-------*/");
    //		如果要在方法中拿到值,这里就不能清除,
    //		array.clear();
    	}
    	public JSONArray getArray() {
    		return array;
    	}
    	public void setArray(JSONArray array) {
    		this.array = array;
    	}
    }

    然后就是我们的主类了

     InputStream inputStream = file.getInputStream();
            BufferedInputStream bufferedInputStream = new BufferedInputStream(file.getInputStream());
            ExcelReadListener listener = new ExcelReadListener();
            ExcelReader excelReader = EasyExcelFactory.read(inputStream, listener).build();
    //        直接读取第一个sheet,从0开始
            ReadSheet readSheet = EasyExcel.readSheet(0).build();
            excelReader.read(readSheet);
    //        可以通过getter获取到listener中暂存的值,
            JSONArray data = listener.getArray();
    //         这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
            excelReader.finish();
    

     这样就不需要建立模板直接获取内容了。

     

    有一点要注意:

    这里默认是1,就是0行为头,从第一行开始读取内容,如果将这里指定为0的话,invokeHeadMap就拿不到值了。

     

    三:

        执行顺序是先执行invokeHeadMap然后是invoke遍历每一行,最后执行doAfterAllAnalysed结束,这里特别注意,如果在doAfterAllAnalysed中清除了暂存的值,那么在主函数中是拿不到的。

    四:

        如果在使用easyexcel时遇到这种问题,就是和POI的依赖冲突了。目前所知的2.1.4版本无法和3.14的POI一起存在,3.17版POI则没有冲突

        关于这个工具我只是大概了解了一下,这个invoke方法如果有值的话每行都会调用它,那么如果我想只获取一行,但是数据量又特别大的时候,就会调用好多次invoke,造成效率低下。如果有人有好的方法欢迎留言。

    展开全文
  • easyExcel 2.1.7 poi 3.17 springboot 2.2.5 lombok 1.18.12
  • poi导入/导出Excel表格,合并单元格读取和设置
  • 使用EasyExcel导出Excel指定单元格格式

    千次阅读 2021-03-19 14:24:56
    简介:在日常导出excel时导出日期格式一般都是将日期转换成yyyy-MM-dd格式的字符串,很少有情况需要关注单元格格式,但是在特殊需求下,我们仍然需要注意单元格格式。 1.正常导出EXCEL public class ...
  • EasyExcel 并发读取文件字段并进行校验,数据写入到新文件,批量插入数据到数据库 demo
  • EasyExcel解析包含单元格合并的表格

    千次阅读 2021-02-08 14:37:22
    EasyExcel解析包含单元格合并的表格 1,引入依赖 com.alibaba easyexcel 2.2.7 2,实现代码 import com.alibaba.excel.EasyExcel; import com.alibaba.excel.context.AnalysisContext; import ...
  • easyExcel解析字段时合并单元格内容
  • easyexcel 合并单元格(非注解)

    万次阅读 热门讨论 2020-09-16 14:02:27
    --引入 阿里的 easyexcel 同时需要引入 asm 或者 cglib--> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.4</...
  • EasyExcel官方文档 新建controller @RequestMapping("/excle") void excle() throws IOException { // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman response.setContentType(...
  • easyExcel自定义单元格配置依赖对象写excel导出excel方法实现CellWriteHandler接口读excel 配置 依赖 <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --> <dependency> <groupId...
  • EasyExcel导入存在合并单元格的Excel

    千次阅读 2021-08-09 19:50:56
    通过EasyExcel读取Excel数据,用List<AwardsDetailField> list接收 因为POI/EasyExcel对合并单元格的数据只读取一次,需要把为空的单元格也赋值,这是核心技术难点。 对数据进行校验、封装然后写入数据库 存在...
  • 使用 EasyExcel 读取Excel(两种方式)

    千次阅读 2020-06-23 17:04:22
    转载:https://www.cnblogs.com/oukele/p/11443659.html 引入jar包 <dependency> <groupId>com.alibaba<...easyexcel</artifactId> <version>1.1.2-beta5</version>..
  • Apache POI和EasyExcel 第六集:Apache POI的Excel读取单元格中的计算公式 一、资源 代码实现中的带有计算公式的Excel(xls) 链接:https://pan.baidu.com/s/1-iOXn4ZnzM9eFcNbo40Gzg 提取码:0916 二、...
  • easyexcel 导出导入合并单元格的表格

    千次阅读 2021-09-29 18:04:58
    easyexcel 导入、导出合并单元格的表格 现在经常遇到导入导出表格,又有列重复的数据,想要合并,手动有太慢的(所以直接导入或导入和并的表格) 1. 引入pom 引入pom 参考 java导入Excel(使用阿里巴巴的easyexcel...
  • 主要包 <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --> <dependency> <groupId>com.alibaba<...easyexcel</artifactId> <version>2.2.
  • EasyExcel解析合并单元格@ExcelProperty

    万次阅读 2020-12-23 15:38:30
    } /** * 处理合并单元格 * * @param data 解析数据 * @param extraMergeInfoList 合并单元格信息 * @param headRowNumber 起始行 * @return 填充好的解析数据 */ private List<T> explainMergeData(List<T> data, ...
  • 关于easyexcel,其主要目的是为了降低读取excel时的内存消耗,简化读写excel的api 。 同时2.x版本提供了很多新功能,具体大家可以直接参考官方说明吧,github文档上写一清二楚,这里就不传播一些没啥必要的二三手...
  • 第一步,引进EasyExcel依赖 第二步,引进时间管理工具依赖,用来自动生成时间 第三步,写实体类,属性与数据库字段保持一致 第四步,声明excel表格对应的字段为一级目录和二级目录 第五步,写mapper,声明数据...
  • 使用easyexcel读取excel

    2022-01-11 13:54:25
    导入jar包 使用psotman传人excel文件,选取文件类型 后端代码如下 ...GoodsBaseExcelVO为转换的对象,有可能出现,读取为空的情况,具体为@Accessors(chain = true)注解影响,去除即可,具体原因可参考 ...
  • 引入依赖 <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --> <dependency> <groupId>com.alibaba<...easyexcel</artifactId> <version>2.2.6<.
  • 1 EasyExcel简介 EasyExcel是阿里巴巴开源的一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 github地址:https://github.com/alibaba/easyexcel 官方文档:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,112
精华内容 444
关键字:

easyexcel读取指定单元格