其他链接:
easyexcel+springboot导入导出
https://blog.csdn.net/qq_33745371/article/details/110822811
文章目录
easyExcel官网
https://www.yuque.com/easyexcel
代码下载地址
百度网盘
https://pan.baidu.com/s/16me3vEOeJnbDD2kD3mj-XA 提取码:udam
天翼云盘
https://cloud.189.cn/t/F7naaiviymym
导入功能
单实体导入
1.创建实体类(这里我使用了lombok,直接添加了@Data)
@Data
public class Student {
/**
* 姓名
*/
private String name;
/**
* 性别
*/
private String gender;
/**
*年龄
*/
private Integer age;
/**
*特点
*/
private String specialty;
/**
* id
*/
private Long id;
}
2.创建监听类
public class StudentListener extends AnalysisEventListener<Student> {
/**
* 每读一行内容,都会调用一次该对象的invoke,在invoke可以操作使用读取到的数据
* @param student
* @param analysisContext
*/
@Override
public void invoke(Student student, AnalysisContext analysisContext) {
System.out.println("invoke每次读取到的数据:"+student);
}
/**
* 读取完整个文档之后,调用的方法
* @param analysisContext
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
3.写导入代码(这里我把代码写在了 测试类中)
@SpringBootTest
class EasyexcelApplicationTests {
/**
* 单实体导入
*/
@Test
void test01() {
//---读excel---
/**
* 构建一个"读"的工作簿对象
*pathName:要读的文件路径
* head:文件中每一行数据要存储到的实体类(class)
* readListener:读监听器,每读一行内容,都会调用一次该对象的invoke,在invoke可以操作使用读取到的数据
*/
//1.获得一个工作簿对象
ExcelReaderBuilder read = EasyExcel.read("学生表.xlsx", Student.class, new StudentListener());
//2.获得一个工作表对象
ExcelReaderSheetBuilder sheet = read.sheet();
//3.读取工作表内容
sheet.doRead();
}
}
学生表.xlsx我放在了这个项目的目录里
运行结果:
导出功能
单实体导出
/**
* 单实体导出
*/
@Test
void test02() {
//---写excel---
//1.获得一个工作簿对象
ExcelWriterBuilder write = EasyExcel.write("写学生表啦.xlsx", Student.class);
//2.获得一个工作表对象
ExcelWriterSheetBuilder sheet = write.sheet();
//3.写
sheet.doWrite(initData());
}
/**
* 生成导出的数据
* @return
*/
private static List<Student> initData(){
ArrayList<Student> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Student student = new Student();
student.setName("root机器人"+i+"号");
student.setGender("男");
student.setAge(i+10);
student.setSpecialty("干啥啥不行,干饭第一名。没啥特点"+i);
list.add(student);
}
return list;
}
运行结果:
修改样式
将导出的excel表头换成中文
将导出的excel表头换成中文,需使用注解 @ExcelProperty("")
@Data
public class Student {
/**
* 姓名
*/
@ExcelProperty("姓名")
private String name;
/**
* 性别
*/
@ExcelProperty("性别")
private String gender;
/**
*年龄
*/
@ExcelProperty("年龄")
private Integer age;
/**
*特点
*/
@ExcelProperty("特点")
private String specialty;
/**
* id
*/
@ExcelProperty("ID")
private Long id;
}
运行结果:
修改列宽
此时,特点的值比较长,需要将列宽改变,在Student类的字段上添加注解:@ColumnWidth(?) -------?:填写int值,默认是-1
/**
*特点
*/
@ExcelProperty("特点")
@ColumnWidth(40)
private String specialty;
运行结果:
修改表头字段顺序
现在的表头顺序是姓名、性别、年龄、特点、ID
我想要他的顺序为ID、姓名、性别、年龄、特点
第一种解决方案是:将id字段,放在Student类最前面。(不推荐,不可能每次换位置都去调整)
第二种解决方案是:添加注解:@ExcelProperty(value = “ID”,index = 0) //不填写的话默认值是-1,0是第一列
运行结果:
设置字段不参与读和写
id一直没啥用,让它不参与读和写。注解:@ExcelIgnore
/**
* id
*/
@ExcelProperty(value = "ID",index = 0)
@ExcelIgnore
private Long id;
写的运行结果:
格式化日期
在Student类添加birthday字段
/**
* 生日
*/
@ExcelProperty("生日")
@ColumnWidth(20)
private Date birthday;
生成导出数据时,setBitthday
/**
* 生成导出的数据
* @return
*/
private static List<Student> initData(){
ArrayList<Student> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Student student = new Student();
student.setName("root机器人"+i+"号");
student.setGender("男");
student.setAge(i+10);
student.setSpecialty("干啥啥不行,干饭第一名。没啥特点"+i);
student.setBirthday(new Date());
list.add(student);
}
return list;
}
写的运行结果:
此时,生日显示,日期加时间。在Student类的birthday字段上加注解,可格式化。@DateTimeFormat(“yyyy-MM-dd”)
/**
* 生日
*/
@ExcelProperty("生日")
@ColumnWidth(20)
@DateTimeFormat("yyyy-MM-dd")
private Date birthday;
写的运行结果:
设置行高
均属于类注解
@HeadRowHeight(100)//表头行高
@ContentRowHeight(50)//内容行高
写的运行结果:
设置sheet名称
/**
* 单实体导出
*/
@Test
void test02() {
//---写excel---
//1.获得一个工作簿对象
ExcelWriterBuilder write = EasyExcel.write("写学生表啦.xlsx", Student.class);
//2.获得一个工作表对象
//ExcelWriterSheetBuilder sheet = write.sheet("");//默认为index----0
ExcelWriterSheetBuilder sheet = write.sheet("学生表");//改名为学生表
//3.写
sheet.doWrite(initData());
}
写的运行结果:
表头上再添加公共表头
例子:@ExcelProperty({“我是歌手报名信息”,“生日”})
@Data
@HeadRowHeight(100)//表头行高
@ContentRowHeight(50)//内容行高
public class Student {
/**
* 姓名
*/
@ExcelProperty({"我是歌手报名信息","姓名"})
private String name;
/**
* 性别
*/
@ExcelProperty({"我是歌手报名信息","性别"})
private String gender;
/**
*年龄
*/
@ExcelProperty({"我是歌手报名信息","年龄"})
private Integer age;
/**
*特点
*/
@ExcelProperty({"我是歌手报名信息","特点"})
@ColumnWidth(40)
private String specialty;
/**
* 生日
*/
@ExcelProperty({"我是歌手报名信息","生日"})
@ColumnWidth(20)
@DateTimeFormat("yyyy-MM-dd")
private Date birthday;
/**
* id
*/
@ExcelProperty(value = "ID",index = 0)
@ExcelIgnore
private Long id;
}
写的运行结果:
样式填充
1.根据模板样式导出多条数据
1.学生导出模板01:
2.测试类中的代码:
/**
* 根据模板样式导出多条数据
*/
@Test
void test03(){
//模板路径
String Template = "学生导出模板01.xlsx";
//创建工作簿对象
ExcelWriterBuilder excelWriterBuilder = EasyExcel.write("快来看我的多组数据导出结果.xlsx", Student.class).withTemplate(Template);
//创建sheet对象
ExcelWriterSheetBuilder sheet = excelWriterBuilder.sheet();
//数据
List<Student> list = initData();
//导入数据(doXXX方法,会在读写后自动关闭流)
sheet.doFill(list);
}
3.运行结果:
2.根据模板样式导出多条数据(也含有单条数据)
1.学生导出模板02:
2.测试类中的代码:
/**
* 根据模板样式导出多条数据(包含单条数据)
*/
@Test
void test04(){
//模板路径
String Template = "学生导出模板02.xlsx";
//创建工作簿对象
ExcelWriter workBook = EasyExcel.write("多组数据(包含单条数据)导出结果.xlsx", Student.class).withTemplate(Template).build();
//创建sheet对象
WriteSheet sheet = EasyExcel.writerSheet().build();
//换行
FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();
//多条数据
List<Student> list = initData();
//单条数据
HashMap<String, Object> map = new HashMap<>();
map.put("date",new Date());
map.put("total",list.size());
//多组填充
workBook.fill(list,fillConfig,sheet);//这里加上换行,避免单组填充覆盖了多组填充的数据
//单组填充
workBook.fill(map,sheet);
//关闭流
workBook.finish();
}
3.运行结果:
3.数据水平填充
1.学生水平导出模板03:
2.测试类中的代码:
/**
* 数据水平填充
*/
@Test
void test05(){
//模板路径
String Template = "学生水平导出模板03.xlsx";
//创建工作簿对象
ExcelWriter workBook = EasyExcel.write("水平填充导出结果.xlsx", Student.class).withTemplate(Template).build();
//创建sheet对象
WriteSheet sheet = EasyExcel.writerSheet().build();
//水平填充
FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
//多条数据
List<Student> list = initData();
//多组填充
workBook.fill(list,fillConfig,sheet);
//关闭流
workBook.finish();
}
3.运行结果: