EasyExcel基础使用教程

本文详细介绍如何在SpringBoot项目中实现SQL数据转换为Excel文件,以及如何将Excel数据批量导入数据库。涵盖项目结构、各层实现、DAO层、Mapper配置、Controller层处理及实体类设计,提供完整代码示例。

一、sql转excel

1、项目结构(springboot项目)
在这里插入图片描述
2、各个分层

dao层

@Repository
public interface ReadAllInfo {
    List<Order> getorders();
}

对应的mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sqltoexcel.demo.dao.ReadAllInfo">
    <select id="getorders" resultType="com.sqltoexcel.demo.pojo.Order">
        select * from orders
    </select>
</mapper>

Controller层

@Controller
public class MyController {

    @Autowired
    ReadAllInfo readAllInfo;//这里因为只是简单demo,所以在controller层直接调用了dao层

//访问/all接口实现将sql内容导入并生成excel文件
    @RequestMapping("/all")
    @ResponseBody
    public String getall(){
        String filepath="D://ORDERS.xlsx";//设置生成excel文件的路径
        List<Order> orders = readAllInfo.getorders();//数据库中每一条数据都是一个实体类,dao层的方法返回一个装有实体类的List,用来传入easyexcel的方法中
        EasyExcel.write(filepath, Order.class).sheet("订单表").doWrite(orders);//.write方法的参数为excel文件生成路径,实体类信息
        //.sheet方法的参数为表格名称
        //.doWrite方法的参数为dao层返回的含有实体类的List
        return "生成表格成功";
    }

}

实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order {
    @ExcelProperty("id")//这个注释用于写入excel时的列名
    private int id;

    @ExcelProperty("ordertype")
    private String ordertype;

    @ExcelProperty("orderprice")
    private int orderprice;

    @ExcelProperty("orderbuyer")
    private String orderbuyer;

    @ExcelProperty("orderseller")
    private String orderseller;

    @ExcelProperty("ordertime")
    private Date ordertime;
}

在这里插入图片描述

二、excel转sql

1、项目结构(springboot项目)
在这里插入图片描述
2、各个分层

dao层

@Repository
public interface WriteAllInfo {
    int writeorders(List<Order2> list);
}

对应的mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.exceltosql.demo.dao.WriteAllInfo">
    <insert id="writeorders" parameterType="java.util.List" useGeneratedKeys="false">
        insert into orders_copy1
        (id,ordertype,orderprice,orderbuyer,orderseller,ordertime) values
        <foreach collection="list" item="item" index="index" separator=",">
        (#{item.id},#{item.ordertype},#{item.orderprice},#{item.orderbuyer},#{item.orderseller},#{item.ordertime})
        </foreach>
    </insert>
</mapper>

service层

@Service
// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
public class DemoDataListener extends AnalysisEventListener<Order2> {

    private static final int BATCH_COUNT = 5;
    List<Order2> list = new ArrayList<Order2>();


    @Autowired
    private WriteAllInfo writeAllInfo;//调用dao层

    @Override
    public void invoke(Order2 data, AnalysisContext context) {//在使用EasyExcel的doread时会调用这个方法
        System.out.println(JSON.toJSONString(data));

        list.add(data);//将每个实体类添加到List中
        System.out.println(list.toString());
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (list.size() >= BATCH_COUNT) {//如果列表中实体类的个数大于定义的阈值
            saveData();//调用saveData方法来执行dao操作,saveData定义在下方
            // 存储完成清理 list
            list.clear();//list相当于一个暂存区(缓冲)
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
        saveData();//如果最后阅读的数据小于阈值,那么整个流程走到这里,同样也要进行dao操作,否则最后几条数据会丢失
        System.out.println("所有数据解析完成!");
    }

    private void saveData() {
        System.out.println("{}条数据,开始存储数据库!"+ list.size());
        writeAllInfo.writeorders(list);//调用dao层的writeorders方法写入数据库
        System.out.println("存储数据库成功!");
    }
}

Controller层

@Controller
public class MyController {

    @Autowired
    DemoDataListener demoDataListener;



    @RequestMapping("/insert")
    @ResponseBody
    public String insertall(){
        String fileName = "D://ORDERS.xlsx";
        // 这里需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
        EasyExcel.read(fileName, Order2.class,demoDataListener).sheet().doRead();
        return "读取成功";
    }


}

实体类:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order2 {

    private int id;

    private String ordertype;


    private int orderprice;


    private String orderbuyer;

    private String orderseller;


    private String ordertime;
}

3、注意点

实体类的属性名要和数据库的对应上,数据类型可以视情况而变,特别是datetime格式,dao操作如果是传入List的话,insert语句中需要使用collection和foreach进而可以一条条操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值