Easyexcel导入导出多个sheet

EasyExcel对于导入导出的操作十分简洁,记录一下多个sheet且内容不一致的导入导出。

引入 easyExcel依赖

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>3.0.1</version>
    </dependency>
  1. 导出下载

提示:其中部分代码操作Dao层可以删除,可以自己创建ExportUserExcel 对象进行测试,思路数据映射到excel中。
这里ExportUserExcel .class 映射的模板替换下面代码中

@AllArgsConstructor
@NoArgsConstructorUser
@Builder
@HeadRowHeight(value = 20)
public class ExportUserExcel {

    @ExcelProperty(value = "姓名",index = 0)
    @ColumnWidth(value = 10)
    private String userName;

    @ExcelProperty(value = "年龄",index = 1)
    @ColumnWidth(value = 20)
    private String age;

    @ExcelProperty(value = "性别",index = 2)
    @ColumnWidth(value = 20)
    private String gender;
}

  1. 导出下载 ExportUserExcel.class 模板
 public void modelExport(HttpServletResponse response, Long id) {
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码
        try {
            String fileName = URLEncoder.encode("Physical", "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
            //新建ExcelWriter
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
            //获取sheet0对象
            WriteSheet mainSheet = EasyExcel.writerSheet(0, "模型信息").head(ExportUserExcel.class).build();
            //获取模型信息,向sheet0写入数据
            DmmPhysicalModel dmmPhysicalModel = dmmPhysicalModelMapper.selectById(id);
            List<DmmPhysicalModel> dmmPhysicalModels1 = Arrays.asList(dmmPhysicalModel);
            excelWriter.write(dmmPhysicalModels1, mainSheet);
            //获取sheet1对象
            WriteSheet detailSheet = EasyExcel.writerSheet(1, "词条信息").head(ExportUserExcel.class).build();
            HashMap entryHashMap = new HashMap<>();
            entryHashMap.put("model_id", id);
            //获取词条信息,向sheet1写入数据
            List<DmmPhysicalEntry> list = dmmPhysicalEntryMapper.selectByMap(entryHashMap);
            excelWriter.write(list, detailSheet);
            //关闭流
            excelWriter.finish();
        } catch (IOException e) {
            log.error("导出异常{}", e.getMessage());
        }
    }
  1. 导入excel 存入数据库,

    2.1 接收excel实体数据类
    

    注意:一定要和excel表标题内容一致 ,
    @ExcelProperty(value = “标题名称”)

/**
  * Copyright 2022 bejson.com 
  */
package com.dtyunxi.yundt.cube.biz.item.svr.rest;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

/**
 * Auto-generated: 2022-07-20 14:18:43
 *
 * @author bejson.com (i@bejson.com)
 * @website http://www.bejson.com/java2pojo/
 */
@Data
public class ModelImportVO{

    @ExcelProperty(value = "标题名称")
    private String title;

    @ExcelProperty(value = "标题名称")
    private String merchant_no;

    @ExcelProperty(value = "标题名称")
    private String terminal_id;

    @ExcelProperty(value = "标题名称")
    private String token;
    
}

这里很多博客的代码没有贴全,少了一个监视器读取excel的类!

package com.infinitus.dmm.service.impl;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

import java.util.ArrayList;
import java.util.List;

/**
 * excel表格读取监视器
 */
public class ExcelListener extends AnalysisEventListener {
    //可以通过实例获取该值
    private List<Object> datas = new ArrayList<Object>();
    public void invoke(Object o, AnalysisContext analysisContext) {
        datas.add(o);
        doSomething(o);
    }

    private void doSomething(Object object) {
    }

    public List<Object> getDatas() {
        return datas;
    }

    public void setDatas(List<Object> datas) {
        this.datas = datas;
    }

    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    }
}

2.excel导入到数据库 多个sheet、
ModelImportVO.class这也是模板,自己可以定义,对应的值。

 @PostMapping("test/excel/import")
 public void modelImport(MultipartFile serviceFile) throws IOException {
        //输入流
        InputStream inputStream = serviceFile.getInputStream();
        //监视器
        ExcelListener listener = new ExcelListener();
        ExcelReader excelReader = EasyExcel.read(inputStream, listener).build();
        // 第一个sheet读取类型
        ReadSheet readSheet1 = EasyExcel.readSheet(0).head(ModelImportVO.class).build();
        // 第二个sheet读取类型
        ReadSheet readSheet2 = EasyExcel.readSheet(1).head(EntryImportVO.class).build();
        // 开始读取第一个sheet
        excelReader.read(readSheet1);
        //excel sheet0 信息
        List<Object> list = listener.getDatas();
      	//List<object> 转 List<实体类>
		 List<JsonRootBean> dtoList = new ArrayList<>();
        //List object for 转换 实体类
        for (Object objects : list) {
            JsonRootBean dto = (JsonRootBean) objects;
            dtoList.add(dto);
        }
        //List 转JOSN
        String json = JSON.toJSONString(dtoList);
        System.out.println("json = " + json);


        // 清空之前的数据
        listener.getDatas().clear();
        // 开始读取第二个sheet
        excelReader.read(readSheet2);
        //excel sheet1 信息
        List<Object> entry = listener.getDatas();
   		//copy上面作法
       
    }

执行psotman接口请求
在这里插入图片描述

补充获取sheet名称 长度等信息方法
//获取从第二个sheet读取类型 词条多个sheet
//监视器
ExcelListener listener = new ExcelListener();
ExcelReader excelReader = EasyExcel.read(inputStream, listener).build();
//弃用方法 List sheets = excelReader.getSheets();
// 新方法
List sheets = excelReader.excelExecutor().sheetList();

导入文件没有创建实例类模板

兼容任何标题的Excel
  //文件获取流
                InputStream inputStream = checkDTO.getFile().getInputStream();
                //excel监听器
                NoModelDataListener noModelDataListener = new NoModelDataListener(tableType);
                EasyExcel.read(inputStream, noModelDataListener).sheet().doRead();
数据统一在监听器进行插入更新
package io.sugo.cdp.upload.download.config;

import cn.hutool.core.date.DateUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import io.sugo.cdp.upload.download.util.RegularUtils;
import lombok.Data;
import org.apache.commons.lang.StringUtils;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;

/**
 * easyExcel监听器
 * 不创建实体读取excel方式泛型用map:<Map<Integer, String>>
 *
 * @author
 */
@Data
public class NoModelDataListener extends AnalysisEventListener<Map<Integer, String>> {
    /**
     * excel标题字段类型
     */
    private List<String> excelType;
    /**
     * 统计对比错误次数
     */
    private AtomicInteger rowCountError = new AtomicInteger();
    /**
     * 执行总条数
     */
    private AtomicLong rowCount = new AtomicLong();
    /**
     * 返回错误信息的结果集
     */
    List<String> results = new ArrayList<>();

    @Override
    public void invoke(Map<Integer, String> data, AnalysisContext context) {
        //map
        for (Map.Entry<Integer, String> next : data.entrySet()) {
            String message = next.getValue();
            if (message != null) {
                message = message.replaceAll("[\\t\\n\\r]", "");
            }
            //正则检验每一列
            String result = RegularUtils.excelRegular(excelType.get(next.getKey()), message);
            if (StringUtils.isNotBlank(result)) {
                //返回前10条校验错误信息
                if (rowCountError.get() < 10) {
                    long numberOfRows = rowCount.get() + 1L;
                    String stringResult = "校验失败 - 第" + numberOfRows + "行:" +
                            "(" + next.getValue() + ") " + result;
                    String jsonString = JSON.toJSONString(stringResult);
                    results.add(jsonString);
                    rowCountError.incrementAndGet();
                }
            }
        }
        //统计总行数
        rowCount.incrementAndGet();
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        saveData();
        System.out.println("rowCount = " + rowCount.get());
    }

    /**
     * 加上存储数据库
     */
    private void saveData() {
    }

    public NoModelDataListener(List<String> excelType) {
        this.excelType = excelType;
    }

}
常用excel导入 数据转JSON 格式  快速构建工具代码  配合上面的监视器
package com.dtyunxi.yundt.cube.biz.item.svr.rest;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.fastjson.JSON;
import com.dtyunxi.yundt.cube.biz.item.svr.rest.ExcelListener;
import com.dtyunxi.yundt.cube.biz.item.svr.rest.ModelImportVO;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @author 瑾秋
 * @date 2022-08-05 9:56
 */
@RestController
public class Test11 {


    @PostMapping("test/excel/import")
    public void modelImport(MultipartFile serviceFile) throws IOException {
        //输入流
        InputStream inputStream = serviceFile.getInputStream();
        //监视器
        ExcelListener listener = new ExcelListener();
        ExcelReader excelReader = EasyExcel.read(inputStream, listener).build();
        // 第一个sheet读取类型
        ReadSheet readSheet1 = EasyExcel.readSheet(0).head(ModelImportVO.class).build();
        // 开始读取第一个sheet
        excelReader.read(readSheet1);
        //excel sheet0 信息
        List<Object> list = listener.getDatas();
        //List<object> 转 List<实体类>
        List<ModelImportVO> dtoList = new ArrayList<>();
        //List object for 转换 实体类
        for (Object objects : list) {
            ModelImportVO dto = (ModelImportVO) objects;
            dtoList.add(dto);
        }

        List<ModelImportVO> ten = new ArrayList<>();
        //每个二十个输出一次
        for (ModelImportVO modelImportVO : dtoList) {
            if (ten.size() == 20) {
                System.out.println( JSON.toJSONString(ten));
                ten.clear();
            }
            ten.add(modelImportVO);
        }
        //最后不足二十输出一次
        System.out.println(JSON.toJSONString(ten));
    }


}
  • 15
    点赞
  • 133
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
EasyExcel 是一个基于 JavaExcel 操作工具,可以实现 Excel 文件的读、写、导入导出等操作。下面我将简单介绍 EasyExcel导入导出功能。 ## 导出 Excel 1. 添加 EasyExcel 依赖 ``` <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.10</version> </dependency> ``` 2. 创建 Excel 表头 ``` List<List<String>> head = new ArrayList<>(); List<String> head0 = new ArrayList<>(); head0.add("姓名"); head0.add("性别"); head0.add("年龄"); head.add(head0); ``` 3. 创建 Excel 数据 ``` List<List<Object>> data = new ArrayList<>(); List<Object> data0 = new ArrayList<>(); data0.add("张三"); data0.add("男"); data0.add(18); data.add(data0); ``` 4. 写入 Excel 文件 ``` String fileName = "test.xlsx"; String sheetName = "sheet1"; ExcelWriter writer = EasyExcel.write(fileName).build(); WriteSheet sheet = EasyExcel.writerSheet(sheetName).head(head).build(); writer.write(data, sheet); writer.finish(); ``` ## 导入 Excel 1. 添加 EasyExcel 依赖(同导出) 2. 创建 Excel 读取监听器 ``` public class DemoDataListener extends AnalysisEventListener<List<String>> { private List<List<String>> data = new ArrayList<>(); @Override public void invoke(List<String> row, AnalysisContext context) { data.add(row); } @Override public void doAfterAllAnalysed(AnalysisContext context) { // 数据处理完成后的操作 } public List<List<String>> getData() { return data; } } ``` 3. 读取 Excel 文件 ``` String fileName = "test.xlsx"; DemoDataListener listener = new DemoDataListener(); ExcelReader reader = EasyExcel.read(fileName, listener).build(); ReadSheet sheet = EasyExcel.readSheet(0).build(); reader.read(sheet); List<List<String>> data = listener.getData(); ``` 以上就是 EasyExcel导入导出功能的简单介绍,更多内容可以参考 EasyExcel 的官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值