EasyExcel读写

Easy Excel是阿里的一款开源的读写Excel文件的工具

所用到的注解:

@ExcelProperty

用于匹配excel和实体类的匹配

@ExcelIgnore

默认所有字段都会和excel去匹配,加了这个注解会忽略该字段

@DateTimeFormat

日期转换,用String去接收excel日期格式的数据会调用这个注解

@NumberFormat

数字转换,用String去接收excel数字格式的数据会调用这个注解。

参数:

概念介绍

  • WriteWorkbook 可以理解成一个excel
  • WriteSheet 理解成一个excel里面的一个表单
  • WriteTable 一个表单里面如果有多个实际用的表格,则可以用WriteTable

通用参数

WriteWorkbook,WriteSheet ,WriteTable都会有的参数,如果为空,默认使用上级。

名称默认值描述
converter默认加载了很多转换器,这里可以加入不支持的字段
writeHandler写的处理器。可以实现WorkbookWriteHandler,SheetWriteHandler,RowWriteHandler,CellWriteHandler,在写入excel的不同阶段会调用
relativeHeadRowIndex0写入到excel和上面空开几行
headclazz二选一。读取文件头对应的列表,会根据列表匹配数据,建议使用class
clazzhead二选一。读取文件的头对应的class,也可以使用注解。如果两个都不指定,则会读取全部数据
autoTrimtrue会对头、读取数据等进行自动trim
use1904windowingfalseexcel中时间是存储1900年起的一个双精度浮点数,但是有时候默认开始日期是1904,所以设置这个值改成默认1904年开始
useScientificFormatfalse数字转文本的时候在较大的数值的是否是否采用科学计数法
needHeadtrue是否需要写入头到excel
useDefaultStyletrue是否使用默认的样式
automaticMergeHeadtrue自动合并头,头中相同的字段上下左右都会去尝试匹配
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));
        }
    }

}

详情可参考官网:
https://easyexcel.opensource.alibaba.com/

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,了解您的要求。关于easyexcel读写,可以参考以下步骤: 1. 引入依赖 ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.10</version> </dependency> ``` 2. 写入Excel文件 ```java // 创建Excel对应的实体对象 public class DemoData { @ExcelProperty("姓名") private String name; @ExcelProperty("年龄") private Integer age; } // 写入Excel public void writeExcel() { // 文件输出位置 String fileName = "demo.xlsx"; // 写法1 EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(dataList); // 写法2 ExcelWriter excelWriter = null; try { excelWriter = EasyExcel.write(fileName, DemoData.class).build(); WriteSheet writeSheet = EasyExcel.writerSheet("模板").build(); excelWriter.write(dataList, writeSheet); } finally { if (excelWriter != null) { excelWriter.finish(); } } } ``` 3. 读取Excel文件 ```java // 读取Excel public void readExcel() { // 文件路径 String fileName = "demo.xlsx"; // 读取sheet1内容 EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead(); // 读取所有sheet内容 EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).doReadAll(); } // 读取监听器 public class DemoDataListener extends AnalysisEventListener<DemoData> { private List<DemoData> dataList = new ArrayList<>(); @Override public void invoke(DemoData data, AnalysisContext context) { // 读取到一条数据时执行 dataList.add(data); } @Override public void doAfterAllAnalysed(AnalysisContext context) { // 读取完成后执行 // 可以将dataList进行保存操作 } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值