【Java常用工具类】easyexcel基本使用演示

介绍

easyexcel是阿里巴巴开源的,基于Java开发的一款简单、高效、省内存的excel工具类。

其他工具类

【Java常用工具类】日期类

【Java常用工具类】数学计算

【Java常用工具类】字符串

【Java常用工具类】集合操作常用方法

基本使用

1、简单写

@Test
public void simpleWrite() {
    
    
    String fileName = "D:\\easyexcel_demo\\simpleWrite.xlsx";
    EasyExcel.write(fileName, ExcelDataEntity.class).sheet("演示sheet名称").doWrite(getData());
}

private List<ExcelDataEntity> getData() {
    
    
    List<ExcelDataEntity> list = new ArrayList<>();
    for (int i = 1; i <= 10; i++) {
    
    
        ExcelDataEntity entity = new ExcelDataEntity();
        entity.setIndexData("index " + i);
        entity.setStringData("string " + i);
        entity.setDate(new Date());
        entity.setDoubleData((double) i);
        list.add(entity);
    }
    return list;
}

@Data
// 指定列宽、行高等样式
@ContentRowHeight(25)
@HeadRowHeight(25)
@ColumnWidth(25)
public class ExcelDataEntity {
    
    

    @ExcelProperty("演示字符串标题")
    private String stringData;

    @ExcelProperty("演示日期标题")
    // 可以单独设置
    @ColumnWidth(50)
    private Date date;

    @ExcelProperty("演示数值标题")
    private Double doubleData;

    @ExcelProperty(value = "指定下标在第1列", index = 0)
    private String indexData;

}

在这里插入图片描述

2、过滤指定列

@Test
public void excludeColumnWrite() {
    
    
    String fileName = "D:\\easyexcel_demo\\excludeColumnWrite.xlsx";
    // 可以按列的名称过滤
    //Set<String> excludeColumnsName = new HashSet<>();
    //excludeColumnsName.add("stringData");
    // 可以按照列的下标过滤
    Set<Integer> excludeColumnsIndex = new HashSet<>();
    excludeColumnsIndex.add(1);
    EasyExcel.write(fileName, ExcelDataEntity.class)
            //.excludeColumnFiledNames(excludeColumnsName)
            .excludeColumnIndexes(excludeColumnsIndex)
            .sheet()
            .doWrite(getData());
}

在这里插入图片描述

3、 重复写入列

@Test
public void repeatedWrite() {
    
    
    String fileName = "D:\\easyexcel_demo\\repeatedWrite.xlsx";
    ExcelWriter excelWriter = EasyExcel.write(fileName, ExcelDataEntity.class).build();
    // 创建一个sheet
    WriteSheet writeSheet = EasyExcel.writerSheet("sheet01").build();
    // 重复写入2次,共产生20条数据
    for (int i = 0; i < 2; i++) {
    
    
        List<ExcelDataEntity> list = getData();
        excelWriter.write(list, writeSheet);
    }
    // 写完需要关闭资源
    excelWriter.finish();
}

在这里插入图片描述

4、重复写入不同的sheet

@Test
public void repeatedWrite2() {
    
    
    String fileName = "D:\\easyexcel_demo\\repeatedWrite2.xlsx";
    ExcelWriter excelWriter = EasyExcel.write(fileName, ExcelDataEntity.class).build();
    // 重复写入2次,共产生20条数据
    for (int i = 0; i < 2; i++) {
    
    
        // 把sheet放入循环里面即可
        WriteSheet writeSheet = EasyExcel.writerSheet("sheet" + i).build();
        List<ExcelDataEntity> list = getData();
        excelWriter.write(list, writeSheet);
    }
    // 写完需要关闭资源
    excelWriter.finish();
}

产生了2个sheet页,数据是一样的
在这里插入图片描述

5、多级表头写入

@Test
public void multilevelHeadWrite() {
    
    
    String fileName = "D:\\easyexcel_demo\\multilevelHeadWrite.xlsx";
    EasyExcel.write(fileName, MultilevelHeadEntity.class).sheet().doWrite(getMultilevelData());
}

private List<MultilevelHeadEntity> getMultilevelData() {
    
    
    List<MultilevelHeadEntity> list = new ArrayList<>();
    for (int i = 1; i <= 10; i++) {
    
    
        MultilevelHeadEntity entity = new MultilevelHeadEntity();
        entity.setS1("" + i);
        entity.setS2("" + i);
        entity.setS3("" + i);
        entity.setS4("" + i);
        list.add(entity);
    }
    return list;
}

@Data
@ContentRowHeight(25)
@HeadRowHeight(25)
@ColumnWidth(25)
public class MultilevelHeadEntity {
    
    

    @ExcelProperty({
    
    "一级标题","二级标题-1","三级标题-1"})
    private String s1;

    @ExcelProperty({
    
    "一级标题","二级标题-1","三级标题-2"})
    private String s2;

    @ExcelProperty({
    
    "一级标题","二级标题-2","三级标题-1"})
    private String s3;

    @ExcelProperty({
    
    "一级标题","二级标题-2","三级标题-2"})
    private String s4;
}

在这里插入图片描述

6、字段格式化

@Test
public void formatWrite() {
    
    
    String fileName = "D:\\easyexcel_demo\\formatWrite.xlsx";
    EasyExcel.write(fileName, FormatEntity.class).sheet().doWrite(getFormatDate());
}

private List<FormatEntity> getFormatDate() {
    
    
    List<FormatEntity> list = new ArrayList<>();
    for (int i = 1; i <= 10; i++) {
    
    
        FormatEntity entity = new FormatEntity();
        entity.setDate(new Date());
        entity.setD1(i / 3d);
        entity.setD2(i / 3d);
        entity.setD3(i / 3d);
        entity.setD4(i / 3d);
        list.add(entity);
    }
    return list;
}

@Data
@ContentRowHeight(25)
@HeadRowHeight(25)
@ColumnWidth(25)
public class FormatEntity {
    
    

    @DateTimeFormat("yyyy-MM-dd")
    @ExcelProperty("日期标题")
    private Date date;

    @NumberFormat("#.##%")
    @ExcelProperty(value = "百分比")
    private Double d1;

    @NumberFormat("#.###")
    @ExcelProperty(value = "保留三位小数")
    private Double d2;

    @NumberFormat("#.##")
    @ExcelProperty(value = "默认四舍五入")
    private Double d3;

    @NumberFormat(value = "#.##", roundingMode = RoundingMode.DOWN)
    @ExcelProperty(value = "直接截取")
    private Double d4;

}

在这里插入图片描述

7、合并单元格

@Test
public void mergeCellWrite() {
    
    
    String fileName = "D:\\easyexcel_demo\\mergeCellWrite.xlsx";
    // LoopMergeStrategy构建方法参数中,2:表示每两行进行合并,0:表示合并下标为0的列,也就是第一列
    LoopMergeStrategy loopMergeStrategy = new LoopMergeStrategy(2, 0);
    EasyExcel.write(fileName, FormatEntity.class)
            .registerWriteHandler(loopMergeStrategy)
            .sheet()
            .doWrite(getFormatDate());
}

在这里插入图片描述

8、模板写入

@Test
// 先把simpleWrite.xlsx数据写入templateWrite.xlsx中,然后再写入其他的数据到templateWrite.xlsx中
public void templateWrite() {
    
    
    String fileName = "D:\\easyexcel_demo\\templateWrite.xlsx";
    String templateFileName = "D:\\easyexcel_demo\\simpleWrite.xlsx";
    ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();
    WriteSheet writeSheet = EasyExcel.writerSheet("演示sheet名称").build();
    // 再写一点自己的数据
    excelWriter.write(getTemplateData(), writeSheet);
    // 关闭资源
    excelWriter.finish();
}

private List<ExcelDataEntity> getTemplateData() {
    
    
    List<ExcelDataEntity> list = new ArrayList<>();
    for (int i = 1; i <= 10; i++) {
    
    
        ExcelDataEntity entity = new ExcelDataEntity();
        entity.setIndexData("template index " + i);
        entity.setStringData("template string " + i);
        entity.setDate(new Date());
        entity.setDoubleData((double) i);
        list.add(entity);
    }
    return list;
}

在这里插入图片描述

9、自定义样式

@Test
public void styleWrite() {
    
    
    String fileName = "D:\\easyexcel_demo\\styleWrite.xlsx";
    // 设置头部样式
    WriteCellStyle headWriteCellStyle = new WriteCellStyle();
    // 头部背景色
    headWriteCellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());
    WriteFont headWriteFont = new WriteFont();
    // 字体大小
    headWriteFont.setFontHeightInPoints((short) 18);
    headWriteCellStyle.setWriteFont(headWriteFont);
    // 设置内容样式
    WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
    // 指定FillPatternType.SOLID_FOREGROUND不然无法显示背景颜色,头部默认了这个属性所以可以不指定
    contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
    contentWriteCellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex());
    WriteFont contentWriteFont = new WriteFont();
    contentWriteFont.setFontHeightInPoints((short) 12);
    contentWriteCellStyle.setWriteFont(contentWriteFont);
    // 构建头部和内容的样式
    HorizontalCellStyleStrategy horizontalCellStyleStrategy =
            new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
    EasyExcel.write(fileName, ExcelDataEntity.class).registerWriteHandler(horizontalCellStyleStrategy).sheet("")
            .doWrite(getData());
}

在这里插入图片描述

10、简单的读

@Test
public void simpleRead() {
    
    
    String fileName = "D:\\easyexcel_demo\\simpleWrite.xlsx";
    EasyExcel.read(fileName, ExcelReadDataEntity.class, new SimpleReadListener()).sheet().doRead();
}

@Data
public class ExcelReadDataEntity {
    
    

    // 用列的名称去匹配
    @ExcelProperty("演示字符串标题")
    private String stringData;

    @ExcelProperty("演示日期标题")
    private Date date;

    @ExcelProperty("演示数值标题")
    private Double doubleData;

    // 用index匹配列,index=0,对应下标第一列
    @ExcelProperty(index = 0)
    private String indexData;

}

@Slf4j
public class SimpleReadListener extends AnalysisEventListener<ExcelReadDataEntity> {
    
    

    List<ExcelReadDataEntity> list = new ArrayList<>();

    @Override
    public void invoke(ExcelReadDataEntity excelDataEntity, AnalysisContext analysisContext) {
    
    
        log.info("解析到一条数据:" + excelDataEntity.toString());
        list.add(excelDataEntity);
        if (list.size() >= 3) {
    
    
            saveDataBase();
            list.clear();
        }
    }

    private void saveDataBase() {
    
    
        log.info("插入数据库: " + list);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    
    
    	// 真正操作数据库时,一般使用spring管理的bean,需要通过构造方法的方式传进来
        saveDataBase();
    }
}

在这里插入图片描述

11、web文件下载

@GetMapping("download")
public void download(HttpServletResponse response) throws IOException {
    
    
    response.setContentType("application/vnd.ms-excel");
    response.setCharacterEncoding("utf-8");
    String fileName = URLEncoder.encode("web文件上传", "UTF-8");
    response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
    EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet().doWrite(data());
}

12、web文件上传

@PostMapping("upload")
@ResponseBody
public void upload(MultipartFile file) throws Exception {
    
    
    EasyExcel.read(file.getInputStream(), ExcelReadDataEntity.class, new UploadListener()).sheet().doRead();
}

@Data
public class ExcelReadDataEntity {
    
    

    // 用列的名称去匹配
    @ExcelProperty("演示字符串标题")
    private String stringData;

    @ExcelProperty("演示日期标题")
    private Date date;

    @ExcelProperty("演示数值标题")
    private Double doubleData;

    // 用index匹配列,index=0,对应下标第一列
    @ExcelProperty(index = 0)
    private String indexData;

}

@Slf4j
public class UploadListener extends AnalysisEventListener<ExcelReadDataEntity> {
    
    

    List<ExcelReadDataEntity> list = new ArrayList<>();

    @Override
    public void invoke(ExcelReadDataEntity excelReadDataEntity, AnalysisContext analysisContext) {
    
    
        log.info("解析到一条数据:" + excelReadDataEntity.toString());
        list.add(excelReadDataEntity);
        if (list.size() >= 3) {
    
    
            saveDataBase();
            list.clear();
        }
    }

    private void saveDataBase() {
    
    
        log.info("插入数据库: " + list);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    
    
        // 真正操作数据库时,一般使用spring管理的bean,需要通过构造方法的方式传进来
        saveDataBase();
    }
}

猜你喜欢

转载自blog.csdn.net/CSDN_WYL2016/article/details/120734105
今日推荐