Easyexcel配置自定义列与自定义顺序导出下载Excel文件

依赖版本

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

数据对象类

public class KsClAdReportBo  {
    @ExcelProperty("计划状态")
    private String unitStatus;
    @ExcelProperty("投放状态")
    private String putStatus;
    @ExcelProperty("出价类型")
    private String bidType;
    @ExcelProperty("优化目标")
    private String ocpxActionType;
    @ExcelProperty("投放方式")
    private String speed;
    @ExcelProperty("订单提交数")
    private Long eventOrderSubmit;
    @ExcelProperty("新增付费人数")
    private Long eventNewUserPay;
    @ExcelProperty("3秒播放数")
    private Long playDuration3s;
    @ExcelProperty("3秒播放率")
    private Double playDuration3sRate;
    //有效播放数,对标快手的played_three_seconds
    @ExcelProperty("有效播放数")
    private Long validPlay;
    //视频播放完成数,对标快手的played_end
    @ExcelProperty("完播数")
    private Long play100FeedBreak;
    //播放完成率
    @ExcelProperty("完播率")
    private Double playOverRate;

    public String getUnitStatus() {
        return unitStatus;
    }

    public void setUnitStatus(String unitStatus) {
        this.unitStatus = unitStatus;
    }

    public String getPutStatus() {
        return putStatus;
    }

    public void setPutStatus(String putStatus) {
        this.putStatus = putStatus;
    }

    public String getBidType() {
        return bidType;
    }

    public void setBidType(String bidType) {
        this.bidType = bidType;
    }

    public String getOcpxActionType() {
        return ocpxActionType;
    }

    public void setOcpxActionType(String ocpxActionType) {
        this.ocpxActionType = ocpxActionType;
    }

    public String getSpeed() {
        return speed;
    }

    public void setSpeed(String speed) {
        this.speed = speed;
    }

    public Long getEventOrderSubmit() {
        return eventOrderSubmit;
    }

    public void setEventOrderSubmit(Long eventOrderSubmit) {
        this.eventOrderSubmit = eventOrderSubmit;
    }

    public Long getEventNewUserPay() {
        return eventNewUserPay;
    }

    public void setEventNewUserPay(Long eventNewUserPay) {
        this.eventNewUserPay = eventNewUserPay;
    }

    public Long getPlayDuration3s() {
        return playDuration3s;
    }

    public void setPlayDuration3s(Long playDuration3s) {
        this.playDuration3s = playDuration3s;
    }

    public Double getPlayDuration3sRate() {
        return playDuration3sRate;
    }

    public void setPlayDuration3sRate(Double playDuration3sRate) {
        this.playDuration3sRate = DoubleUtil.getDouble2(playDuration3sRate);
    }

    public Long getValidPlay() {
        return validPlay;
    }

    public void setValidPlay(Long validPlay) {
        this.validPlay = validPlay;
    }

    public Long getPlay100FeedBreak() {
        return play100FeedBreak;
    }

    public void setPlay100FeedBreak(Long play100FeedBreak) {
        this.play100FeedBreak = play100FeedBreak;
    }

    public Double getPlayOverRate() {
        return playOverRate;
    }

    public void setPlayOverRate(Double playOverRate) {
        this.playOverRate =  DoubleUtil.getDouble2(playOverRate);
    }
}

导出下载方法

    /**
     * excl 文件导出响应下载
     *
     * @param response    响应体
     * @param exportData  导出数据
     * @param fileName    文件名
     * @param columnNames 自定义字段名
     */
    public static <E> void write(HttpServletResponse response, List<E> exportData, String fileName,
                                 List<String> columnNames) throws IOException {
        if (CollectionUtils.isEmpty(exportData)) throw new HMException("暂无可导出数据");
        try {
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName);
            //获取对象,并且根据自定义列的顺序反射赋值index顺序
            Class<?> aClass = exportData.get(0).getClass();
            //设置导出表格的字段顺序
            setExcelIndex(aClass, columnNames);
            //设置输出流和对象类型
            ExcelWriterBuilder write = EasyExcel.write(response.getOutputStream(), aClass);
            if (!CollectionUtils.isEmpty(columnNames)) {
                //设置参数字段
                write.includeColumnFieldNames(columnNames);
            }
            // 写入数据
            write.sheet("sheet1").doWrite(() -> exportData);
            write.excelType(ExcelTypeEnum.XLSX);
            write.autoCloseStream(true);
        } catch (Exception e) {
            LOGGER.error("write Exception:", e);
        }

    }
    /**
     * 设置导出表格的字段顺序
     *
     * @param aClass      需要写入Excel的数据对象
     * @param columnNames 需要展示的自定义列
     */
    private static void setExcelIndex(Class<?> aClass, List<String> columnNames) throws NoSuchFieldException, IllegalAccessException {
        //获取当前对象的字段
        ArrayList<Field> fields = Lists.newArrayList(aClass.getDeclaredFields());
        Class<?> superclass = aClass.getSuperclass();
        if (superclass != null) {//有父类则获取父类对象的字段
            fields.addAll(Lists.newArrayList(superclass.getDeclaredFields()));
        }
        for (int i = 0; i < columnNames.size(); i++) {
            for (Field field : fields) {
                if (!field.getName().equals(columnNames.get(i))) continue;
                ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);
                if (annotation == null) continue;
                InvocationHandler handler = Proxy.getInvocationHandler(annotation);
                //获取 AnnotationInvocationHandler 的 memberValues 字段
                Field fieldMv = handler.getClass().getDeclaredField("memberValues");
                //因为这个字段事 private final 修饰,所以要打开权限
                fieldMv.setAccessible(true);
                Map<Object, Object> memberValues = (Map<Object, Object>) fieldMv.get(handler);
                if (!memberValues.containsKey("value")) continue;
                memberValues.put("index", i);
            }
        }
    }

效果展示

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
EasyExcel中,我们可以使用注解来自定义导出不同的。首先,我们需要创建一个自定义的实体类,用于存储需要导出的数据。在这个实体类中,我们可以使用@ExcelProperty注解来指定每个字段在导出时的名和顺序。 例如,我们有一个实体类User,包含以下字段:id、name、age和email。我们希望在导出时只显示name和email这两,可以进行如下配置: ```java public class User { @ExcelProperty("姓名") private String name; @ExcelProperty("邮箱") private String email; // 省略其他字段的定义及getter/setter方法 } ``` 在这个示例中,通过@ExcelProperty注解指定了字段name对应导出名为"姓名",字段email对应导出名为"邮箱"。 接下来,我们需要创建一个导出Excel的方法,并使用EasyExcel来实现导出功能。在这个方法中,我们需要指定要导出的数据表和目标文件的路径。 ```java public void exportExcel(List<User> userList, String filePath) { try { // 创建导出ExcelWriter 对象 ExcelWriter excelWriter = EasyExcel.write(filePath, User.class).build(); // 创建Sheet对象 WriteSheet sheet = EasyExcel.writerSheet().sheetName("用户信息").build(); // 写入数据 excelWriter.write(userList, sheet); // 关闭资源 excelWriter.finish(); } catch (Exception e) { e.printStackTrace(); } } ``` 通过以上代码,我们可以实现将指定的User导出到指定路径的Excel中,并且只包含name和email这两。 总结起来,要实现在EasyExcel自定义导出不同的,我们需要在实体类中使用@ExcelProperty注解来配置每个字段的名和顺序,并在导出时指定要导出的数据表和目标文件路径。这样就可以轻松地实现自定义导出不同的功能了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Acmen-zym

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

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

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

打赏作者

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

抵扣说明:

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

余额充值