Easy Excel是阿里的一款开源的读写Excel文件的工具
所用到的注解:
@ExcelProperty
用于匹配excel和实体类的匹配
@ExcelIgnore
默认所有字段都会和excel去匹配,加了这个注解会忽略该字段
@DateTimeFormat
日期转换,用String去接收excel日期格式的数据会调用这个注解
@NumberFormat
数字转换,用String去接收excel数字格式的数据会调用这个注解。
参数:
概念介绍
WriteWorkbook
可以理解成一个excelWriteSheet
理解成一个excel里面的一个表单WriteTable
一个表单里面如果有多个实际用的表格,则可以用WriteTable
通用参数
WriteWorkbook,WriteSheet ,WriteTable都会有的参数,如果为空,默认使用上级。
名称 | 默认值 | 描述 |
---|---|---|
converter | 空 | 默认加载了很多转换器,这里可以加入不支持的字段 |
writeHandler | 空 | 写的处理器。可以实现WorkbookWriteHandler,SheetWriteHandler,RowWriteHandler,CellWriteHandler,在写入excel的不同阶段会调用 |
relativeHeadRowIndex | 空 | 写入到excel和上面空开几行 |
head | 0 | 与clazz二选一。读取文件头对应的列表,会根据列表匹配数据,建议使用class |
clazz | 空 | 与head二选一。读取文件的头对应的class,也可以使用注解。如果两个都不指定,则会读取全部数据 |
autoTrim | true | 会对头、读取数据等进行自动trim |
use1904windowing | false | excel中时间是存储1900年起的一个双精度浮点数,但是有时候默认开始日期是1904,所以设置这个值改成默认1904年开始 |
useScientificFormat | false | 数字转文本的时候在较大的数值的是否是否采用科学计数法 |
needHead | true | 是否需要写入头到excel |
useDefaultStyle | true | 是否使用默认的样式 |
automaticMergeHead | true | 自动合并头,头中相同的字段上下左右都会去尝试匹配 |
excludeColumnIndexes | 空 | 需要排除对象中的index的数据 |
excludeColumnFieldNames | 空 | 需要排除对象中的字段的数据 |
includeColumnIndexes | 空 | 只要导出对象中的index的数据 |
includeColumnFieldNames | 空 | 只要导出对象中的字段的数据 |
@上代码
WriteWorkbook
EasyExcel.write(fileName, DemoData.class)
// 在 write 方法之后, 在 sheet方法之前都是设置WriteWorkbook的参数
.sheet("模板")
.doWrite(() -> {
// 分页查询数据
return data();
});
WriteSheet
EasyExcel.write(fileName, DemoData.class)
.sheet("模板")
// 在 sheet 方法之后, 在 doWrite方法之前都是设置WriteSheet的参数
.doWrite(() -> {
// 分页查询数据
return data();
});
WriteTable
EasyExcel.write(fileName, DemoData.class)
.sheet("模板")
.table()
// 在 table 方法之后, 在 doWrite方法之前都是设置WriteTable的参数
.doWrite(() -> {
// 分页查询数据
return data();
});
一,写Excel
1.首先导入Easy Excel依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.2</version>
</dependency>
2.创建一个写数据的实体对象类,这个类主要用来设置标题内容,单元格的宽度,高度,以及标题的高度等.
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import com.alibaba.excel.metadata.BaseRowModel;
@Getter
@Setter
@EqualsAndHashCode
//@HeadRowHeight(20)
@ColumnWidth(12)
@ContentRowHeight(20)
public class AttendanceStatisticsExl2 extends BaseRowModel {
/**
* 序号
*如果是两级标题,就写成集合形式,标题按顺序排列,
*左右两个单元格的一级标题一致的话,会自动合并单元格
*/
@ExcelProperty({"员工考勤统计","序号"})
private Integer number;
/**
* 公司名称
*/
@ExcelProperty({"员工考勤统计","公司名称"})
private String entName;
/**
* 工号
*/
@ExcelProperty({"员工考勤统计","工号"})
private String jobNumber;
/**
* 姓名
*/
@ExcelProperty({"员工考勤统计","姓名"})
private String reamName;
/**
* 迟到小于5分钟的次数
*/
@ExcelProperty({"员工考勤统计","迟到","5分钟以下(次数)"})
private Integer late1;
/**
* 迟到5分钟到30分钟的次数
*/
@ExcelProperty({"员工考勤统计","迟到","5分钟到30分钟(次数)"})
private Integer late2;
/**
* 迟到30分钟以上的次数
*/
@ExcelProperty({"员工考勤统计","迟到","30分钟以上(次数)"})
private Integer late3;
/**
* 早退小于5分钟的次数
*/
@ExcelProperty({"员工考勤统计","早退","5分钟以下(次数)"})
private Integer leaveEarly1;
/**
* 早退5分钟到30分钟的次数
*/
@ExcelProperty({"员工考勤统计","早退","5分钟到30分钟(次数)"})
private Integer leaveEarly2;
/**
* 早退30分钟以上的次数
*/
@ExcelProperty({"员工考勤统计","早退","30分钟以上(次数)"})
private Integer leaveEarly3;
/**
* 考勤异常次数
*/
@ExcelProperty({"员工考勤统计","考勤异常次数"})
private Integer abnormalAttendance;
/**
* 事假
*/
@ExcelProperty({"员工考勤统计","休假","事假(h)"})
private String leaveAbsence;
/**
* 病假
*/
@ExcelProperty({"员工考勤统计","休假","病假(h)"})
private String sickAbsence;
/**
* 年假
*/
@ExcelProperty({"员工考勤统计","休假","年假(h)"})
private String annualLeave;
/**
* 调休假
*/
@ExcelProperty({"员工考勤统计","休假","调休假(h)"})
private String compensatoryLeave;
/**
* 婚假
*/
@ExcelProperty({"员工考勤统计","其他","婚假(h)"})
private String marriageHoliday;
/**
* 产假
*/
@ExcelProperty({"员工考勤统计","其他","产假(h)"})
private String maternityHoliday;
/**
* 丧假
*/
@ExcelProperty({"员工考勤统计","其他","丧假(h)"})
private String funeralHoliday;
/**
* 旷工
*/
@ExcelProperty({"员工考勤统计","旷工(h)"})
private String absenteeism;
/**
* 加班
*/
@ExcelProperty({"员工考勤统计","加班(h)"})
private String workOvertime;
/**
* 签名
*/
@ExcelProperty({"员工考勤统计","签名"})
private String autograph;
/**
* 备注
*/
@ExcelProperty({"员工考勤统计","备注"})
private String remark;
3.根据获取到的数据写入exel
String month="";
Integer number=1;
//创建一个集合,用来存储所有行的数据
List<AttendanceStatisticsExl2> attendanceStatisticsExlList2= Lists.newArrayList();
//遍历获取到的数据
if (attendanceStatisticsList != null && attendanceStatisticsList.size() > 0) {
for (CheckWorkAttendanceStatistics statistics : attendanceStatisticsList) {
//创建对象,把获取到的数据存入对象中
AttendanceStatisticsExl2 attendanceStatisticsExl=new AttendanceStatisticsExl2();
SysOrg sysOrg = sysOrgMapper.selectById(statistics.getOrgId());
attendanceStatisticsExl.setNumber(number);
number++;
attendanceStatisticsExl.setEntName(sysOrg.getEntName());
attendanceStatisticsExl.setJobNumber(statistics.getJobNumber());
attendanceStatisticsExl.setReamName(statistics.getRealName());
month=statistics.getAttendanceMonth();
attendanceStatisticsExl.setLate1(statistics.getLate1());
attendanceStatisticsExl.setLate2(statistics.getLate2());
attendanceStatisticsExl.setLate3(statistics.getLate3());
attendanceStatisticsExl.setLeaveEarly1(statistics.getLeaveEarly1());
attendanceStatisticsExl.setLeaveEarly2(statistics.getLeaveEarly2());
attendanceStatisticsExl.setLeaveEarly3(statistics.getLeaveEarly3());
attendanceStatisticsExl.setAbnormalAttendance(statistics.getAbnormalAttendance());
attendanceStatisticsExl.setLeaveAbsence(String.valueOf(statistics.getLeaveAbsence()));
attendanceStatisticsExl.setSickAbsence(String.valueOf(statistics.getSickAbsence()));
attendanceStatisticsExl.setAnnualLeave(String.valueOf(statistics.getAnnualLeave()));
attendanceStatisticsExl.setCompensatoryLeave(String.valueOf(statistics.getCompensatoryLeave()));
attendanceStatisticsExl.setMarriageHoliday(String.valueOf(statistics.getMarriageHoliday()));
attendanceStatisticsExl.setMaternityHoliday(String.valueOf(statistics.getMaternityHoliday()));
attendanceStatisticsExl.setFuneralHoliday(String.valueOf(statistics.getFuneralHoliday()));
attendanceStatisticsExl.setAbsenteeism(String.valueOf(statistics.getAbsenteeism()));
attendanceStatisticsExl.setWorkOvertime(String.valueOf(statistics.getWorkOvertime()));
attendanceStatisticsExl.setAutograph("");
attendanceStatisticsExl.setRemark("");
//把存入数据的对象添加到list中
attendanceStatisticsExlList2.add(attendanceStatisticsExl);
}
//导出excel 设置响应类型和编码
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("考勤统计导出", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
// HorizontalCellStyleStrategy 每一行的样式都一样 或者隔行一样
// AbstractVerticalCellStyleStrategy 每一列的样式都一样 需要自己回调每一页
// 头的策略
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
// 背景设置为白色
headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
// 内容的策略
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
// 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
//contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
// 背景绿色
//contentWriteCellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex());
// 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
HorizontalCellStyleStrategy horizontalCellStyleStrategy =
new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
// 这里 需要指定写用哪个class去写,然后写到第一个sheet, 然后文件流会自动关闭
EasyExcel.write(response.getOutputStream(), AttendanceStatisticsExl2.class)
.sheet("sheet0")
.registerWriteHandler(horizontalCellStyleStrategy)
.doWrite(attendanceStatisticsExlList2);
二,读Excel
读取excel分三步:
1.获取文件的路径
File file = new File(“D:\test\d1.xlsx”);在内存中创建文件映射
2.List<Map<Integer, CellData>> datas = EasyExcel.read(file).doReadAllSync();获取到文件的数据
3.保存数据
package com.alibaba.easyexcel.test.temp.read;
import java.io.File;
import java.util.List;
import java.util.Map;
import org.junit.Ignore;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.metadata.data.CellData;
import com.alibaba.fastjson.JSON;
/**
* @author
**/
public class CommentTest {
private static final Logger LOGGER = LoggerFactory.getLogger(CommentTest.class);
@Test
public void comment() throws Exception {
File file = new File("D:\\test\\d1.xlsx");
List<Object> objects = EasyExcel.read(file).doReadAllSync();
List<Map<Integer, CellData>> datas = EasyExcel.read(file).doReadAllSync();
for (Map<Integer, CellData> data : datas) {
//LOGGER.info("数据:{}", JSON.toJSONString(data));
LOGGER.info("数据:{}", JSON.toJSONString(data));
}
}
}
详情可参考官网:EasyExcel