详细聊下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 分钟前
Java 中的 Consumer 与 Supplier 接口
java·面试·响应式编程
北城以北888827 分钟前
Java高级编程--XML
xml·java·开发语言·intellij-idea
SXJR43 分钟前
Java mp4parser 实现视频mp4 切割
java·python·音视频
冬天vs不冷1 小时前
Java基础(十一):关键字final详解
java·开发语言
上官浩仁1 小时前
springboot maven 多环境配置入门与实战
java·spring boot·maven
元直数字电路验证1 小时前
新建Jakarta EE项目,Maven Archetype 选项无法加载出内容该怎么办?
java·maven
我叫汪枫1 小时前
Spring Boot图片验证码功能实现详解 - 从零开始到完美运行
java·前端·javascript·css·算法·html
小王不爱笑1321 小时前
Java基础知识(十四)
java·windows·python
pianmian12 小时前
Spring 项目骨架
java·后端·spring
麦兜*2 小时前
Docker 部署 MongoDB:单节点与副本集的最佳实践
java·spring boot·mongodb·spring cloud·docker·容器·maven