Alibaba Easy Excel
https://www.yuque.com/easyexcel/doc/read#5c70a7ac
读取
<dependencies>
<!-- Alibaba Easy Excel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.6</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<!-- fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
</dependencies>
student.xlsx 被读取的文件
| 姓名 | 年龄 | 地址 | 余额 |
|---|---|---|---|
| 张三 | 22 | 广东省深圳市 | 6543 |
| 李四 | 18 | 湖北省武汉市 | 4900 |
| 王五 | 36 | 云南省昆明市 | 5200 |
Student 实体类
import lombok.Data;
@Data
public class Student {
private String stu_name;
private Integer age;
private String address;
private Float money;
}
测试代码
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
//存储读取出来的数据
List<Student> studentList = new ArrayList<>();
//获取文件路径
String filename = "src/main/resources/student.xlsx";
// 这里需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
// excel中表的列要与对象的字段相对应
EasyExcel.read(filename, Student.class, new AnalysisEventListener<Student>() {
// 每解析一条数据都会调用该方法
@Override
public void invoke(Student student, AnalysisContext analysisContext) {
System.out.println("解析一条Student对象:" + JSON.toJSONString(student));
studentList.add(student);
}
// 解析完毕的回调方法
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("excel文件读取完毕!");
}
}).sheet().doRead();
System.out.println(studentList);
}
}
控制台输出
解析一条Student对象:{"address":"广东省深圳市","age":22,"money":6543.0,"stu_name":"张三"}
解析一条Student对象:{"address":"湖北省武汉市","age":18,"money":4900.0,"stu_name":"李四"}
解析一条Student对象:{"address":"云南省昆明市","age":36,"money":5200.0,"stu_name":"王五"}
excel文件读取完毕!
[Student(stu_name=张三, age=22, address=广东省深圳市, money=6543.0), Student(stu_name=李四, age=18, address=湖北省武汉市, money=4900.0), Student(stu_name=王五, age=36, address=云南省昆明市, money=5200.0)]
指定列的下标或者列名
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
@Data
public class Student {
@ExcelProperty("姓名")
private String stu_name;
private Integer age;
@ExcelProperty("地址")
private String address;
private Float money;
}
读多个sheet
excel sheel1
| 姓名 | 年龄 | 地址 | 余额 |
|---|---|---|---|
| 张三 | 22 | 广东省深圳市 | 6543 |
| 李四 | 18 | 湖北省武汉市 | 4900 |
| 王五 | 36 | 云南省昆明市 | 5200 |
excel sheel2
| 姓名 | 年龄 | 地址 | 余额 |
|---|---|---|---|
| 张三 | 22 | 广东省深圳市 | 6543 |
| 李四 | 18 | 湖北省武汉市 | 4900 |
| 王五 | 36 | 云南省昆明市 | 5200 |
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
//存储读取出来的数据
List<Student> studentList = new ArrayList<>();
//获取文件路径
String filename = "src/main/resources/student.xlsx";
// 这里需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
// excel中表的列要与对象的字段相对应
EasyExcel.read(filename, Student.class, new AnalysisEventListener<Student>() {
// 每解析一条数据都会调用该方法
@Override
public void invoke(Student student, AnalysisContext analysisContext) {
System.out.println("解析一条Student对象:" + JSON.toJSONString(student));
studentList.add(student);
}
// 解析完毕的回调方法
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("excel文件读取完毕!");
}
//这里调用的方法不一样
}).doReadAll();
System.out.println(studentList);
}
}
日期、数字或者自定义格式转换
本人未测试
@Data
public class ConverterData {
/**
* 我自定义 转换器,不管数据库传过来什么 。我给他加上“自定义:”
*/
@ExcelProperty(converter = CustomStringStringConverter.class)
private String string;
/**
* 这里用string 去接日期才能格式化。我想接收年月日格式
*/
@DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
private String date;
/**
* 我想接收百分比的数字
*/
@NumberFormat("#.##%")
private String doubleData;
}
读取表头数据
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class Test {
public static void main(String[] args) {
//存储读取出来的数据
List<Student> studentList = new ArrayList<>();
//获取文件路径
String filename = "src/main/resources/student.xlsx";
// 这里需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
// excel中表的列要与对象的字段相对应
EasyExcel.read(filename, Student.class, new AnalysisEventListener<Student>() {
// 每解析一条数据都会调用该方法
@Override
public void invoke(Student student, AnalysisContext analysisContext) {
System.out.println("解析一条Student对象:" + JSON.toJSONString(student));
studentList.add(student);
}
// 解析完毕的回调方法
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("excel文件读取完毕!");
}
//读取完头数据进行调用
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
System.out.println("头数据" + JSON.toJSONString(headMap));
}
}).doReadAll();
System.out.println(studentList);
}
}
console
头数据{0:"姓名",1:"年龄",2:"地址",3:"余额"}
解析一条Student对象:{"address":"广东省深圳市","age":22,"money":6543.0,"stu_name":"张三"}
解析一条Student对象:{"address":"湖北省武汉市","age":18,"money":4900.0,"stu_name":"李四"}
解析一条Student对象:{"address":"云南省昆明市","age":36,"money":5200.0,"stu_name":"王五"}
excel文件读取完毕!
头数据{0:"姓名",1:"年龄",2:"地址",3:"余额"}
解析一条Student对象:{"address":"广东省深圳市","age":22,"money":6543.0,"stu_name":"张三"}
解析一条Student对象:{"address":"湖北省武汉市","age":18,"money":4900.0,"stu_name":"李四"}
解析一条Student对象:{"address":"云南省昆明市","age":36,"money":5200.0,"stu_name":"王五"}
excel文件读取完毕!
写入
先简单了解一下 ,不学了
import com.alibaba.excel.EasyExcel;
import java.util.ArrayList;
import java.util.List;
public class WriteTest {
public static void main(String[] args) {
List<Student> students = generatorData();
System.out.println(students);
//定义fileName
String fileName = "simpleWrite" + System.currentTimeMillis() + ".xlsx";
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
// 如果这里想使用03 则 传入excelType参数即可
EasyExcel.write(fileName, Student.class).sheet("模板").doWrite(students);
}
/**
* 生成数据
* @return List<Student>
*/
public static List<Student> generatorData(){
ArrayList<Student> students = new ArrayList<Student>();
for (int i = 0; i <10; i++) {
Student student = new Student("test"+i,i,"address"+i, i+0.1F);
students.add(student);
}
return students;
}
}

浙公网安备 33010602011771号