EasyExcel 的使用
一、简介
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。
ExsyExcel 的使用
- 依赖
<!-- easyexcel 依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.7</version>
</dependency>
- 创建实体类
@Data
public class Student implements Serializable {
// @ExcelProperty(index = 2) index 设置从第几行读取数据默认从第一行 通过index修改
//@DateTimeFormat("yyyy年MM月dd日 HH时mm分ss秒") 时间格式化 想要的指定格式
// @NumberFormat("#.##%") 想要的百分比数子
/**
* converter属性定义自己的字符串转换器
*@ExcelProperty(converter = CustomStringConverter.class) 见下方自定义转换器
*private String string;
*
*/
@ExcelProperty(converter = CustomStringConverter.class)
@ExcelProperty("id")
private Integer id;
@ExcelProperty("name")
private String name;
}
- 读表
@Test
public void read() {
String fileName = "zzy.xlsx";
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
// 参数一:读取的excel文件路径
// 参数二:读取sheet的一行,将参数封装在DemoData实体类中
// 参数三:读取每一行的时候会执行DemoDataListener监听器
EasyExcel.read(fileName, Student.class, new DemoDataListener()).sheet().doRead();
}
- 写表
@Test
public void simpleWrite() {
String fileName = "zzy.xlsx";
// 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
// 如果这里想使用03 则 传入excelType参数即可
// 参数一:写入excel文件路径
// 参数二:写入的数据类型是DemoData
// data()方法是写入的数据,结果是List<DemoData>集合
EasyExcel.write(fileName, Student.class).sheet("模板").doWrite(data());
}
- 文件的上传和下载
/**
excel文件的下载
*/
@GetMapping("download")
public void download(HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename=demo.xlsx");
EasyExcel.write(response.getOutputStream(), Student.class).sheet("zzy").doWrite(data());
}
/**
excel文件的上传
*/
@PostMapping("upload")
@ResponseBody
public String upload(MultipartFile file) throws IOException {
EasyExcel.read(file.getInputStream(), Student.class, new DemoDataListener()).sheet().doRead();
return "success";
}
- 创建监听器
public class DemoDataListener extends AnalysisEventListener<DemoData> {
List<DemoData> list = new ArrayList<DemoData>();
/**
* 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
*/
public DemoDataListener() {}
/**
* @param data
* @param context
*/
@Override
public void invoke(DemoData data, AnalysisContext context) {
System.out.println("每一行的数据:{}", JSON.toJSONString(data));
list.add(data);
}
/**
* 数据处理完之后都会来调用
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println(JSON.toJSONString(list));
}
}
- 自定义转化器
public class CustomStringConverter implements Converter<String> {
@Override
public Class supportJavaTypeKey() {
return String.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
/**
* 这里读的时候会调用
*/
@Override
public String convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
return "自定义:" + cellData.getStringValue();
}
/**
* 这里是写的时候会调用
*/
@Override
public CellData convertToExcelData(String value, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
return new CellData(value);
}
}
- 读取头文件
@Test
public void complexHeaderRead() {
String fileName = "zzy.xlsx";
// 这里 需要指定读用哪个class去读,然后读取第一个sheet
EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet()
// 这里可以设置1,因为头就是一行。如果多行头,可以设置其他值。不传入默认1行
.headRowNumber(1).doRead();
}