目录

对比:

相同点:

不同点

功能方面:

性能方面

代码方面:

建议:

示例

easypoi

easyexcel


最近项目中有需要导出一下excel的需求,这边找了两种常用的工具easyexcel、easypoi,以下对比一下这两个工具类的优缺点及对比。

对比:

相同点:

easypoi和easyexcel都是基于apache poi进行二次开发的。底层都是依赖的 apache poi。

两者都是可以基于实体类的注解配置来控制导入导出

不同点

EasyExcel是一款阿里开源的Excel导入导出工具,具有处理快速、占用内存小、使用方便的特点

功能方面:

easypoi 功能更加强大,对定制化的导出支持非常的丰富

easyexcel对于实现枚举类型到字符串的转换,需要自定义转换器;对于一些嵌套的一对多对象的导出,需要自定义合并策略,

性能方面

easypoi的解析方式是dom解析,把结果一次都读入内存操作,这样的操作平时是不会有问题的,但是并发量上来的时候就会出现OOM

easyexcel运用的SAX的解析方式,数据量比较大的时候,easyexcel 速度有着明显优势

代码方面:

easypoi导出:

最终是生成了一个 Workbook 对象,由我们自己来输出流下载,较为灵活

Workbook workbook = ExcelExportUtil.exportExcel(params, MaterialOutputExportVO.class, list);
ServletOutputStream outputStream = response.getOutputStream();
workbook.write(outputStream);

easyexcel导出

直接提供了导出+下载的方法,较为方便

EasyExcel.write(response.getOutputStream(),pojoClass).includeColumnFieldNames(includeColumnFieldNames).autoCloseStream(Boolean.TRUE).sheet(sheetName).doWrite(dataSet);
 

建议:

依据当前项目需求,如果并发量不大、数据量也不大,但是需要导出 excel 的文件样式千差万别,那么推荐用 easypoi;反之,使用 easyexcel 。

示例

下面附上两种框架的示例

easypoi

domain

将宽度之类的放在了一个注解配置上

@Data
public class EMAbnormalRecordContentVO {

    @Excel(name = "编码", isImportField = "true", width = 20)
    private String taskCode;

    @Excel(name = "名称", isImportField = "true")
    private String userName;
}

导出: 

List<UserInfo> list = findVoList();

ExportParams params = new ExportParams(null, "用户");
#可以设置样式和样式文件
params.setType(ExcelType.XSSF);
params.setStyle(EquipExcelStyle.class);
Workbook workbook = ExcelExportUtil.exportExcel(params, EMAbnormalRecordContentVO.class, voList);

easyexcel

domain

包含列宽之类的设置


@Data
@ColumnWidth(20)
@HeadRowHeight(20)
public class EquipmentExportVO {

    @ExcelProperty("工程名称")
    private String projectName;

    @ExcelProperty("工程编号")
    private String projectCode;

}

导出

 public void export(String sheetName, String fileName, Class<?> pojoClass, Collection<?> dataSet, Collection<String> includeColumnFieldNames, HttpServletResponse response) {
        try {
            response.setCharacterEncoding("utf-8");
            String filename = URLEncoder.encode(fileName, StandardCharsets.UTF_8).replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename=" + filename + ".xlsx");
            response.setHeader("filename", filename + ".xlsx");
            if (!CollectionUtils.isEmpty(includeColumnFieldNames)) {
                EasyExcel.write(response.getOutputStream(), pojoClass).includeColumnFieldNames(includeColumnFieldNames).autoCloseStream(Boolean.TRUE).sheet(sheetName).doWrite(dataSet);
            } else {
                EasyExcel.write(response.getOutputStream(), pojoClass).autoCloseStream(Boolean.TRUE).sheet().doWrite(dataSet);
            }
        } catch (IOException e) {
            throw new RuntimeException("导出失败!");
            //response.getWriter().println(ReturnVO.failed("导出失败!"));
        }
    }

GitHub 加速计划 / ea / easyexcel
31.64 K
7.47 K
下载
快速、简洁、解决大文件内存溢出的java处理Excel工具
最近提交(Master分支:2 个月前 )
c42183df Bugfix 2 个月前
efa7dff6 * 重新加回 `commons-io` 2 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐