详细聊下easyexcel导出

之前介绍了下复杂表头的导出,如果是那种非常简单的只是一行表头的导出,可以这样处理

pom背景

java 复制代码
<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.1.0</version>
        </dependency>

easyexcel版本需要跟poi保持对应官网地址

我因为是旧版本poi就使用的是2.2.6版本(升级poi代价有点大许多方法不能用了)

先上标准的导出dto文件

java 复制代码
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.write.style.ColumnWidth;

import java.math.BigDecimal;
import java.util.Date;

public class UserExportDto {
    @ExcelProperty(value = "名字")
    private String name;
    @ExcelProperty(value = "年纪")
    private Integer age;

    @ExcelProperty(value = "时间1")
    @DateTimeFormat("yyyy/MM/dd")
    @ColumnWidth(18)
    private Date vDate;

    @ExcelProperty(value = "时间2")
    @DateTimeFormat("yyyy/MM/dd")
    @ColumnWidth(18)
    private Date mDate;

    @ExcelProperty(value = "比例")
    private BigDecimal value;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Date getvDate() {
        return vDate;
    }

    public void setvDate(Date vDate) {
        this.vDate = vDate;
    }

    public Date getmDate() {
        return mDate;
    }

    public void setmDate(Date mDate) {
        this.mDate = mDate;
    }

    public BigDecimal getValue() {
        return value;
    }

    public void setValue(BigDecimal value) {
        this.value = value;
    }
}

这里格式化了时间yyyy/MM/dd

导出文件代码

java 复制代码
ExcelWriter excelWriter = EasyExcel.write("D://1.xlsx")
                .registerWriteHandler(new HeaderWriteHandler())
                .registerWriteHandler(new DateTimeWriteHandler())
                .registerWriteHandler(new PercentWriteHandler()).build();
        WriteSheet sheet = EasyExcel.writerSheet(0,"用户").head(UserExportDto.class).build();
        List<UserExportDto> dtos = initData();
        excelWriter.write(dtos,sheet);
        excelWriter.finish();

post请求的话把第一行改成

java 复制代码
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream)

低版本的easyexcel导出的时间、数值在excel里都是文本格式的,如果有严格的版本要求可以参考我以下代码

标题背景色代码HeaderWriteHandler

java 复制代码
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.util.StyleUtil;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.style.AbstractCellStyleStrategy;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;

public class HeaderWriteHandler extends AbstractCellStyleStrategy implements CellWriteHandler {
    private XSSFCellStyle headCellStyle;
    @Override
    protected void initCellStyle(Workbook workbook) {
        headCellStyle = (XSSFCellStyle) StyleUtil.buildHeadCellStyle(workbook,null);
        headCellStyle.setFillForegroundColor(new XSSFColor(new java.awt.Color(245,233,245,255)));
        headCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        Font font = workbook.createFont();
        font.setFontHeightInPoints((short) 11);
        font.setBold(true);
        headCellStyle.setFont(font);
    }

    @Override
    protected void setHeadCellStyle(Cell cell, Head head, Integer integer) {
        cell.setCellStyle(headCellStyle);
    }

    @Override
    protected void setContentCellStyle(Cell cell, Head head, Integer integer) {

    }
}

时间格式化代码DateTimeWriteHandler

java 复制代码
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class PercentWriteHandler implements CellWriteHandler {
    private static final Logger logger = LoggerFactory.getLogger(PercentWriteHandler.class);
    private static Set<String> DATA_SET = new HashSet<>(Arrays.asList("value"));
    private CellStyle cellStyle;
    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean isHead) {

    }

    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean isHead) {

    }

    @Override
    public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean isHead) {

    }

    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean isHead) {
        if(!isHead && DATA_SET.contains(head.getFieldName())){
            if(cell==null){
                return;
            }
            //不同版本这个不一样看情况
            if(cell.getCellType()!= CellType.NUMERIC){
                return;
            }
            Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
            DataFormat dataFormat = workbook.createDataFormat();
            short percentFormat = dataFormat.getFormat("0.00%");
            if(cellStyle == null){
                cellStyle = workbook.createCellStyle();
                cellStyle.setDataFormat(percentFormat);
            }
            //应用样式到单元格
            cell.setCellStyle(cellStyle);
        }
    }
}

百分比格式化代码PercentWriteHandler

java 复制代码
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class PercentWriteHandler implements CellWriteHandler {
    private static final Logger logger = LoggerFactory.getLogger(PercentWriteHandler.class);
    private static Set<String> DATA_SET = new HashSet<>(Arrays.asList("value"));
    private CellStyle cellStyle;
    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean isHead) {

    }

    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean isHead) {

    }

    @Override
    public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean isHead) {

    }

    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean isHead) {
        if(!isHead && DATA_SET.contains(head.getFieldName())){
            if(cell==null){
                return;
            }
            //不同版本这个不一样看情况
            if(cell.getCellType()!= CellType.NUMERIC){
                return;
            }
            Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
            DataFormat dataFormat = workbook.createDataFormat();
            short percentFormat = dataFormat.getFormat("0.00%");
            if(cellStyle == null){
                cellStyle = workbook.createCellStyle();
                cellStyle.setDataFormat(percentFormat);
            }
            //应用样式到单元格
            cell.setCellStyle(cellStyle);
        }
    }
}

截图展示下具体的结果

标题背景浅粉红色,字体加粗等等

时间筛选的时候是这样的

百分比显示保留2位,但是原始值仍然存在

对了如果提示导出报错类不存在org/objectweb/asm/Type

pom文件引入一个包即可

java 复制代码
<dependency>
            <groupId>org.ow2.asm</groupId>
            <artifactId>asm</artifactId>
            <version>7.0</version>
        </dependency>
相关推荐
打野二师兄20 分钟前
网关 + MDC 过滤器方案,5分钟集成 日志 traceid
java·开发语言
三原32 分钟前
6年前端学习Java Spring boot 要怎么学?
java·前端·javascript
励志成为糕手35 分钟前
编程语言Java——核心技术篇(六)解剖反射:性能的代价还是灵活性的福音?
java·开发语言·intellij-idea
yourkin66635 分钟前
Bean Post-Processor
java·开发语言·前端
qq_2663487339 分钟前
idea 源码阅读笔记
java·笔记·intellij-idea
飞翔的佩奇1 小时前
Java项目:基于SSM框架实现的小区物业管理系统【ssm+B/S架构+源码+数据库+毕业论文+开题报告+任务书+远程部署】
java·数据库·mysql·毕业设计·jsp·ssm框架·小区物业管理系统
天天开心(∩_∩)1 小时前
代码随想录算法训练营第三十七天
java·开发语言·算法
YuTaoShao1 小时前
【LeetCode 热题 100】20. 有效的括号
java·linux·数据库·leetcode
丶小鱼丶1 小时前
JVM之【Java虚拟机概述】
java·jvm
小李是个程序1 小时前
分层解耦(Controller,Service,Dao)
java·开发语言·spring boot·后端