EasyPoi导出复杂Excel

简介

还是关于毕设的,现在有个导出复杂Excel的需求,与前面的文章关系很大,感兴趣的看一下哈🥰🥰🥰

https://wnhyang.gitee.io/article/854b9337.html

问题

前面不是解决了,属性列表展示问题吗?

随之而来,便是导出Excel的问题了🥱🥱🥱

看了前面都知道了,我需要能导出这样的Excel

image

然而ruoyi最原生的基于org.apache.poi实现的一种简单的导出,只支持简单的数据,就是一行一行非常规范的那种,不支持复杂类型的Excel导出

解决

查了很多资料后,确定了使用EasyPoi,如果确实是想深入学习,下面有链接,不过这里就说一下我的应用

  • https://easypoi.mydoc.io/
  • https://gitee.com/lemur/easypoi
  • https://blog.51cto.com/u_9771070/2722382
  • https://cloud.tencent.com/developer/article/1472607

@Excel

这个是必须使用的注解,如果需求简单只使用这一个注解也是可以的,涵盖了常用的Excel需求,需要大家熟悉这个功能,主要分为基础,图片处理,时间处理,合并处理几块,name_id是上面讲的id用法,这里就不累言了

属性类型默认值功能
nameStringnull列名,支持name_id
needMergebooleanfasle是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row)
orderNumString“0”列的排序,支持name_id
replaceString[]{}值得替换 导出是{a_id,b_id} 导入反过来
typeint1导出类型 1 是文本 2 是图片,3 是函数,10 是数字 默认是文本
widthdouble10列宽
exportFormatString“”导出的时间格式,以这个是否为空来判断是否需要格式化日期
importFormatString“”导入的时间格式,以这个是否为空来判断是否需要格式化日期
formatString“”时间格式,相当于同时设置了exportFormat 和 importFormat
databaseFormatString“yyyyMMddHHmmss”导出时间设置,如果字段是Date类型则不需要设置 数据库如果是string 类型,这个需要设置这个数据库格式,用以转换时间格式输出
suffixString“”文字后缀,如% 90 变成90%
isWrapbooleantrue是否换行 即支持\n

上面的表格已经省略了很多属性了

下面直接看应用吧

1、导出类标记注解

public class Workload extends BaseEntity {
    private static final long serialVersionUID = 1L;

    ...
        
	/**
     * 工作量id
     */
    private Long id;

    /**
     * 类型
     */
    @Excel(name = "类型", needMerge = true, dict = "workload_type", width = 10)
    private String type;

    /**
     * 任务信息
     */
    @ExcelCollection(name = "任务")
    private List<Task> taskList;

    /**
     * 工作量
     */
    @Excel(name = "工作量", needMerge = true, width = 10)
    private BigDecimal workload;
    
    ...
}

这里注意

  • @ExcelCollection(name = "任务")就是用来标记列表属性的,记得标注了这个,那么对应的类也要加上必要的注解
  • needMerge = true表示需要合并

2、列表属性标记

public class Task extends BaseEntity {
    private static final long serialVersionUID = 1L;

    ...
    
	/**
     * 人数
     */
    @Excel(name = "人数")
    @Excel(name = "人数", orderNum = "10", width = 10)
    private Integer headcount;

    /**
     * 人数系数
     */
    @Excel(name = "人数系数", orderNum = "11", width = 10)
    private BigDecimal headcountCoefficient;    

	/**
     * 难度系数
     */
    @Excel(name = "难度系数", orderNum = "12", width = 10)
    private BigDecimal degreeCoefficient;

    /**
     * 单工作量
     */
    @Excel(name = "单工作量", orderNum = "13", width = 10)
    private BigDecimal workload;
 
    ...
}

EasyPoi使用非常简单,到这里基本工作已经完成了

3、导出

关于导出,要做的就是在Controller中用EasyPoi处理一下查到的数据,我这里用的封装的工具类(为了配合ruoyi使用😂😂😂)

    /**
     * 导出工作量列表
     */
    @Log(title = "工作量", businessType = BusinessType.EXPORT)
    @GetMapping("/export")
    public AjaxResult export(Workload workload) {
        List<Workload> list = workloadService.selectWorkloadList(workload);

        return ExcelExportUtil.exportExcel("教师工作量数据", Workload.class, list);
    }
导出工具类
public class ExcelExportUtil {
    private static final Logger log = LoggerFactory.getLogger(ExcelExportUtil.class);

    private static final IExcelDictHandler EXCEL_DICT_HANDLER = new ExcelDictHandlerImpl();

    private ExcelExportUtil() {
    }

    public static AjaxResult exportExcel(String sheetName, Class<?> pojoClass,
                                         Collection<?> dataSet) {
        OutputStream out = null;
        Workbook wb = null;
        try {
            String filename = ExcelUtil.encodingFilename(sheetName);
            ExportParams exportParams = new ExportParams(sheetName, sheetName);
            exportParams.setDictHandler(EXCEL_DICT_HANDLER);
            out = new FileOutputStream(ExcelUtil.getAbsoluteFile(filename));
            wb = cn.afterturn.easypoi.excel.ExcelExportUtil.exportExcel(exportParams, pojoClass, dataSet);
            wb.write(out);
            return AjaxResult.success(filename);
        } catch (Exception e) {
            log.error("导出Excel异常{}", e.getMessage());
            throw new UtilException("导出Excel失败,请联系网站管理员!");
        } finally {
            IOUtils.closeQuietly(wb);
            IOUtils.closeQuietly(out);
        }
    }
}

不知道我故意遗漏了dict = "workload_type"没说,有注意到没🐶🐶🐶

这是EasyPoi提供的一个关于字典转换的,简单说就是

我们导入输入“小明”,会通过字典查询对应的值,生成对应类属性,(小明)->(0)

导出也是同样,只要有对应的字典数据,都是可以完成的

字典使用

只需实现IExcelDictHandler接口即可,再

public class ExcelDictHandlerImpl implements IExcelDictHandler {

    private static final Logger log = LoggerFactory.getLogger(ExcelDictHandlerImpl.class);

    /**
     * 从值翻译到名称
     *
     * @param dict  字典Key
     * @param obj   对象
     * @param name  属性名称
     * @param value 属性值
     * @return
     */
    @Override
    public String toName(String dict, Object obj, String name, Object value) {
        log.debug(dict, obj, name, value);
        return DictUtils.getDictLabel(dict, String.valueOf(value));
    }

    /**
     * 从名称翻译到值
     *
     * @param dict  字典Key
     * @param obj   对象
     * @param name  属性名称
     * @param value 属性值
     * @return
     */
    @Override
    public String toValue(String dict, Object obj, String name, Object value) {
        log.debug(dict, obj, name, value);
        return DictUtils.getDictValue(dict, String.valueOf(value));
    }
}

这里用的也是ruoyi已有的字典工具,就不再继续往下深讲

通过上面的步骤就可以完成复杂Excel的导出来😊😊😊,配合ruoyi使用哦

总结

完成了这个毕设大体上算是完成了,接下来可能依照着老师的意见进行修改吧

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无奈何杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值