当前位置: 首页 > 工具软件 > easyexcel > 使用案例 >

EasyExcel 快速生成Excel工具的使用

陆文斌
2023-12-01

EasyExcel 快速生成Excel工具的使用

前言

当我从数据库查询到数据,如何将它变成Excel表格的形式展示

一个简单的导出模板如下

导入依赖
<!-- easyexcel-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.6</version>
        </dependency>
    <!--lombok-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.14.6</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>RELEASE</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.58</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.58</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.28</version>
    </dependency>
编写日志信息属性文件

log4j.properties

log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
在bo实体类上 添加对应注解
@ContentRowHeight(20)
@HeadRowHeight(20)
@ColumnWidth(25)
@Data
@NoArgsConstructor
public class AllNodeList implements Serializable {

    @ExcelProperty(value = "Level",index = 0)
    private Integer orderno;

    @ExcelProperty(value = "Id",index = 1)
    private Integer id;

    @ExcelProperty(value = "rname",index = 2)
    @ColumnWidth(30)
    private String rname;

    @ExcelProperty(value = "resourcetype",index = 3)
    @ColumnWidth(30)
    private String resourcetype;

    @ExcelProperty(value = "priority",index = 4)
    private Integer priority;

    @ExcelProperty(value = "parentid",index = 5)
    private Integer parentid;

    //此处空出了第7 列
    @ExcelProperty(value = "permission",index = 7)
    @ColumnWidth(40)
    private String permission;

    }
}
创建监听类

在写的过程中暂时没有用到

package study.controller;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import study.bo.Node4Menu;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.List;

/**
 * @author wangshiqin
 * @version 1.0
 * @className NodeDataListener
 * @description 监听节点信息生成Excel
 * @date 2021/5/28
 */
public class NodeDataListener extends AnalysisEventListener<Node4Menu> {

    List<Node4Menu> list = new ArrayList<>();
    private final Logger logger = LoggerFactory.getLogger(NodeDataListener.class);
    /**
     * 如果使用了spring,请使用这个构造方法。
     * 每次创建Listener的时候需要把spring管理的类传进来
     */
    public NodeDataListener() {}

    /**
     * 这个每一条数据解析都会来调用
     * @param
     * @param analysisContext
     */
    @Override
    public void invoke(Node4Menu node4Menu, AnalysisContext analysisContext) {
        System.out.println("完成了一条数据的解析 --> " + JSON.toJSONString(node4Menu));
        list.add(node4Menu);
    }

    /**
     * 所有数据解析完成了
     * 都会来调用
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println(JSON.toJSONString(list));
    }

}

调用解析并生成 Execl 表 存在项目同级文件夹中
package study.service;

import com.alibaba.excel.EasyExcel;
import study.bo.Node4Menu;

import java.util.List;

/**
 * @author wangshiqin
 * @version 1.0
 * @className Data2Excel
 * @description 写到Excel中
 * @date 2021/5/28
 */
public class Data2Excel {
    public void writetoExcel(List<Node4Menu> node4Menu){
        //桌面文件名
        String fileName = "node4menu.xlsx";
        // 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        // 参数一:写入excel文件路径
        // 参数二:写入的数据类型是Person
        // data()方法是写入的数据,结果是List<Person>集合
        EasyExcel.write(fileName, Node4Menu.class).sheet("模板").doWrite(node4Menu);

    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2GdlwdxZ-1622440007412)(G:\Excel.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ntysI98n-1622440007418)(G:\模板.png)]

扩展:

public class ComplexHeadData {
    /**
    * 主标题 将整合为一个单元格效果如下:
    * —————————————————————————
    * |          主标题        |
    * —————————————————————————
    * |字符串标题|日期标题|数字标题|
    * —————————————————————————
    */
    @ExcelProperty({"主标题", "字符串标题"})
    private String string;
    @ExcelProperty({"主标题", "日期标题"})
    private Date date;
    @ExcelProperty({"主标题", "数字标题"})
    private Double doubleData;
}

读表

public void simpleRead() {
    // 根据名字读取
    String fileName = "demo.xlsx";
    // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
    EasyExcel.read(fileName
                   , DemoData.class, new DemoDataListener()).sheet().doRead();

在实体类中,会根据注释中的名称 或者index = 多少列 来读取

 类似资料: