EasyExcel介绍

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。反正他提供的案例:64M内存20秒读取75M(46W行25列)的Excel。

EasyExcel相关链接

EasyExcel官网:https://easyexcel.opensource.alibaba.com/

EasyExcel 文档地址:https://easyexcel.opensource.alibaba.com/docs/current/

EasyExcel Github地址:https://github.com/alibaba/easyexcel

EasyExcel上手Demo

Maven依赖

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.2</version>
        </dependency>

读、写案例代码参考

请跳转:https://github.com/alibaba/easyexcel/tree/master/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo

伪代码

        try {
            // 这里URLEncoder.encode可以防止中文乱码
            String fName = URLEncoder.encode("表格文件名" + DateUtil.format(new Date(), "yyyy-MM-dd"), "UTF-8");
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fName + ".xlsx");
            EasyExcel.write(response.getOutputStream(), 导出那个对象的数据.class)
                    .sheet("sheet名称")
                    .registerConverter(new LongStringConverter())
                    .registerWriteHandler(new SimpleColumnWidthStyleStrategy(20))
                    .doWrite(数据集合);
        } catch (IOException e) {
            log.error("导出的数据.", e);
            throw new RuntimeException();
        }

EasyExcel相关注解

设置单元格的长、宽

@ColumnWidth(25) 可以直接注解在类上,也可使用字段上


示例:
    @ExcelProperty(value = {"最后走访时间"}, index = 10)
    @DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
    @ColumnWidth(40)
    private Date roomLastVisitTime;

时间格式处理

@DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")

自定义事件格式转换@DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")

不过注意哦Excel时间这一栏过长,就容易变成 #########,鼠标点击#才能正常展示。要不设置cell长度?

    @ExcelProperty(value = {"最后走访时间"})
    @DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
    private Date roomLastVisitTime;
    // 导出的Excel

浮点型数据处理

    @NumberFormat("#.##%")
    @ExcelProperty(value = "数字标题")
    private Double doubleData;

字段不导出 @ExcelIgnore

从名字我们就应该能看出来Ignore就是忽略的意思。

忽略这个字段在导出Excel的作用!

@ExcelProperty()

    @ExcelProperty({"房屋主键"})
    private Integer id;

自定义转换器 Converter

如果导出的结果是空白,一定要注意检查到处对象是不是空!

如果导出的结果是空白,一定要注意检查到处对象是不是空!

如果导出的结果是空白,一定要注意检查到处对象是不是空!

不得使用内部类!单独放一个新的类中。不然会报错,你百度搜不的报错!

注意使用自定义Convert。如果输入在Java对象写入到Excel过程中,Java对象属性是null,则不会触发Convret执行哦!所以如果你需要你的对象在写入Excel过程中走了自定义转换器,一定要校验一下属性是否为空哦!

// 定义转换的内容。Convert<T>中的T一定要与你写入Excle的泛型保持一致,不然会报错
public class AddressTypeConverter implements Converter<String> {
    @Override
    public Class<?> supportJavaTypeKey() {
        // 定义Java转换类型
        return String.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        // 写入到Excel的格式
        return CellDataTypeEnum.STRING;
    }

    // 将Excel数据转为Java属性
    @Override
    public String convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        return "自定义" + Converter.super.convertToJavaData(cellData, contentProperty, globalConfiguration);
    }


    // Java对象写入到Excel的数据,其中我们的Java对象值是在context的value属性
    @Override
    public WriteCellData<?> convertToExcelData(WriteConverterContext<String> context) throws Exception {
        if (StringUtils.equals("0", context.getValue())) {
            return new WriteCellData<>("非标准地址");
        } else if (StringUtils.equals("1", context.getValue())) {
            return new WriteCellData<>("标准地址");
        } else {
            return new WriteCellData<>("未知");
        }
    }
}

使用Convert

    @Schema(description = "地址类型 0=非标准地址 1=标准地址")
    @ExcelProperty(value = {"地址类型"}, converter = AddressTypeConverter.class, index = 3)
    private String roomAddressType;
特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取全部资料 ❤