一、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进而可以一条条操作
本文详细介绍如何在SpringBoot项目中实现SQL数据转换为Excel文件,以及如何将Excel数据批量导入数据库。涵盖项目结构、各层实现、DAO层、Mapper配置、Controller层处理及实体类设计,提供完整代码示例。
1951

被折叠的 条评论
为什么被折叠?



