导出效果图:
在这里插入图片描述

数据导入效果图:
在这里插入图片描述

存入mysql库效果图:
在这里插入图片描述
效果也看到了,基本能满足所需要求,这种复杂的表头都是自定义的,根据模板直接使用,特别容易上手。

1,导入所需依赖
 		<!--导入导出-->
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>4.2.0</version>
        </dependency>
2,给数据库实体类添加@Excel注解

这是我测试创建的一个easypoi_test表,字段简单(无需特别关注)
在这里插入图片描述
实体类与数据库的表对应,这没什么好说的

EsaypoiTest .java

package com.myqxin.pojo;

import cn.afterturn.easypoi.excel.annotation.Excel;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.io.Serializable;

/**
 * <p>
 * 
 * </p>
 *
 * @author myqxin
 * @since 2021-11-05
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("esaypoi_test")
public class EsaypoiTest implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @Excel(name = "名称1",groupName = "基本信息")
    private String m1;
    @Excel(name = "名称2",groupName = "名称15",replace = {"男_1","女_0"})
    private String m2;
    @Excel(name = "名称3")
    private String m3;
    @Excel(name = "名称4",groupName = "名称16")
    private String m4;
    @Excel(name = "名称5")
    private String m5;
    @Excel(name = "名称6")
    private String m6;
    @Excel(name = "名称7")
    private String m7;
    @Excel(name = "名称8")
    private String m8;
    @Excel(name = "名称9",groupName = "特殊信息")
    private String m9;
    @Excel(name = "名称10",groupName = "名称17")
    private String m10;
    @Excel(name = "名称11")
    private String m11;
    @Excel(name = "名称12",groupName = "名称18")
    private String m12;
    @Excel(name = "名称13")
    private String m13;
    @Excel(name = "名称14")
    private String m14;

}

关于@Excel注解的详细说明,看官网:http://easypoi.mydoc.io

我这里对它做简单的解释:

属性描述
name与离表格数据最近的哪一行表头的名称
groupName一个组合,在第一个表头位置加上这个,下一个不用加,默认到结尾
replace文本替换

@Excel(name=“”):可以理解对应这个红框里面的值,离数据最近的一行表头

在这里插入图片描述
@Excel(groupName=“”):用来区分当前单元格所属那个表格范围

我这里用了三种颜色来标示,我说的应该能明白吧,那个groupName会从当前单元格开始,一直包容这之后的单元格,但他不会对同级的进行包容,例如m8(名称8)就是和“基本信息”处在同级。基本信息包含了m1~m7(名称1-名称7)。名称15就只包含了m2,m3(名称2,名称3)。名称16就包含了m4,m5,m6(名称4,名称5,名称6)

在这里插入图片描述
在这里插入图片描述
@Excel(replace = {“”}):用于文本替换的

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
导入的时候就会自动给我替换成想要的值了

3,execl数据导入,案例:
    @PostMapping("/import")
    public void importData(MultipartFile file) throws Exception {
        ImportParams params = new ImportParams();
        params.setTitleRows(1);
        // 从第几行开始,因为第一个大标题被上面的参数给占了,所以不是4
        params.setHeadRows(3);
        List<EsaypoiTest> list = ExcelImportUtil.importExcel(file.getInputStream(), EsaypoiTest.class, params);
        list.forEach(System.out::println);
        for (EsaypoiTest esaypoiTest : list) {
            esaypoiTestService.save(esaypoiTest);
        }
    }

导入相对简单,数据入库效果:

在这里插入图片描述

4,数据库数据导出到excel表
  • 设置导出格式模板

在这里插入图片描述

在自定义的模板下,设置成这样的形式,可以了,表头与导入时保持一致。只是导出的时候,导出的模板没有数据,只有属性值,用来接收数据的

代码实现:

    @GetMapping("/export")
    public void exportData(HttpServletResponse response) throws Exception {
        List<EsaypoiTest> list = esaypoiTestService.list();
        // 模板路径
        String path = "C:\\Users\\myqxin\\Desktop\\poi\\模板测试.xlsx";
        TemplateExportParams temp = new TemplateExportParams(path);
        HashMap<String, Object> map = new HashMap<>();
        map.put("maplist", list);
        Workbook workbook = ExcelExportUtil.exportExcel(temp, map);
        if (workbook == null) {
            //读取模板失败
        }
        // 设置excel的文件名称
        String fileName = "模板测试成功" + ".xlsx";

        // 重置响应对象
        response.reset();
        try {
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        response.setContentType("textml;charset=utf-8");
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        // 写出数据输出流到页面
        try {
            OutputStream output = response.getOutputStream();
            BufferedOutputStream bufferedOutPut = new BufferedOutputStream(output);
            workbook.write(bufferedOutPut);
            bufferedOutPut.flush();
            bufferedOutPut.close();
            output.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

在这里插入图片描述
在这里插入图片描述
注意事项:在遍历的列中不能有空单元格

在这里插入图片描述
如非要留着占用,可以使用&NULL&进行占位
在这里插入图片描述

更多问题参考这里:https://blog.csdn.net/weixin_38312502/article/details/105627498

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐