EasyExcel导出 -- 学习记录

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

开始时,用的时2.x的版本。导出时自定义Converter转换,老是出错。于是决定换成高版本。

实体类

@ExcelIgnoreUnannotated
@ColumnWidth(16)
@HeadRowHeight(14)
@HeadFontStyle(fontHeightInPoints = 11)
@Data
public class LotteryRecordAliExcel implements Serializable {

    @ExcelProperty(value = "手机号" ,index = 0)
    private String mobile;

    @ExcelProperty(value = "昵称",index = 1)
    private String name;

    @ExcelProperty(value = "ureid",index = 2)
    private String userId;

    @ExcelProperty(value = "活动名称",index = 3)
    private String actTitle;

    @ExcelProperty(value = "活动类型" ,index = 4)
    private String actType;

    @ExcelProperty(value = "卡券批次",index = 5)
    private String code;

    @ExcelProperty(value = "优惠金额" , index = 6)
    private BigDecimal money;

    @ExcelProperty(value = "订单金额",index = 7)
    private BigDecimal orderMoney;

    @ExcelProperty(value = "订单号",index = 8)
    private String orderNo;

    @ExcelProperty(value = "奖品状态",index = 9,converter = GiftStatusConverter.class)
    private Integer giftStatus;

    @ExcelProperty(value = "核销商户",index = 10)
    private String receivedId;

    @ColumnWidth(30)
    @ExcelProperty(value = "发放时间" , index = 11,converter = DateConverter.class)
    private Date createdAt;

    @ColumnWidth(30)
    @ExcelProperty(value = "核销时间" , index = 12,converter = DateConverter.class)
    private Date receivedAt;

    @ExcelProperty(value = "领取厂房",index = 13 ,converter = TenantConverter.class)
    private Integer tenantId;

}

自定义转换

时间 

@DateTimeFormat("yyyy-MM-dd HH:mm:ss")

输出的结果 : #########  

采用自定义时间类型转换

public class DateConverter implements Converter<Date> {
    private static final String PATTERN_YYYY_MM_DD = "yyyy-MM-dd HH:mm:ss";

    @Override
    public Class<Date> supportJavaTypeKey() {
        return Date.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    /**
     * EasyExcel导出数据类型转换
     * @param cellData
     * @param contentProperty
     * @param globalConfiguration
     * @return
     * @throws Exception
     */
    @Override
    public Date convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        String value = cellData.getStringValue();
        SimpleDateFormat sdf = new SimpleDateFormat(PATTERN_YYYY_MM_DD);
        Date parse = sdf.parse(value);
        return parse;
    }

    @Override
    public WriteCellData<?> convertToExcelData(Date date, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        if (date == null) {
            return null;
        }
        SimpleDateFormat sdf = new SimpleDateFormat(PATTERN_YYYY_MM_DD);
        return new WriteCellData<>(sdf.format(date));
    }

}

other

@SuppressWarnings("rawtypes")
public class GiftStatusConverter implements Converter<Integer>{

    @Override
    public Class supportJavaTypeKey()
    {
        return Integer.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey()
    {
        return CellDataTypeEnum.STRING;
    }
    /**
     * -1=过期,0=待激活,1=激活,2=使用中,3=下架,4=上架
     */
    @Override
    public Integer convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty,
                                     GlobalConfiguration globalConfiguration)
    {
        Integer value = 0;
        String str = cellData.getStringValue();
        if ("过期".equals(str))
        {
            value = -1;
        }
        else if ("激活".equals(str))
        {
            value = 1;
        }
        else if ("使用中".equals(str))
        {
            value = 2;
        }
        else if ("下架".equals(str))
        {
            value = 3;
        }
        else if ("上架".equals(str))
        {
            value = 4;
        }
        else if ("待激活".equals(str))
        {
            value = 0;
        }
        return value;
    }

    /***
     * 导入
     * @param value
     * @param excelContentProperty
     * @param globalConfiguration
     * @return
     * @throws Exception
     */
    /**
     * -1=过期,0=待激活,1=激活,2=使用中,3=下架,4=上架
     */
    @Override
    public WriteCellData<?> convertToExcelData(Integer value, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        String str = "待激活";
        if (value.equals(-1))
        {
            str = "过期";
        }
        else if (value.equals(1))
        {
            str = "激活";
        }
        else if (value.equals(2))
        {
            str = "使用中";
        }
        else if (value.equals(3))
        {
            str = "下架";
        }
        else if (value.equals(4))
        {
            str = "上架";
        }
        else if (value.equals(0)) {
            str = "待激活";
        }
        return new WriteCellData<>(str);
    }

}

EasyExcel 导出

    @PostMapping("/excel/record/list")
    public void recordExport(HttpServletResponse response,LotteryRecordExcelVo lotteryRecordExcelVo) throws IOException {
        //设置内容类型
        response.setContentType("application/vnd.ms-excel");
        //设置编码格式
        response.setCharacterEncoding("utf-8");
        //设置导出文件名称(避免乱码)
        String fileName = URLEncoder.encode("记录列表", "UTF-8");
        // 设置响应头
        response.setHeader("Content-disposition", "attachment;filename="+fileName+".xlsx");
        LotteryRecordVo lotteryRecordVo = new LotteryRecordVo();
        BeanUtils.copyProperties(lotteryRecordExcelVo,lotteryRecordVo);
        AjaxResult resultTotal = recordFeign.getGiftList(lotteryRecordVo,null,null);
        Long total = 0L;
        if (resultTotal.get("data") != null) {
            Map<String, Object> resultMap = (Map<String, Object>) resultTotal.get("data");
            total = Long.valueOf(String.valueOf(resultMap.get("total")));
        } else {
            throw new RuntimeException(resultTotal.get("msg").toString());
        }
        ExcelWriter excelWriter = null;
        try {
            switch (lotteryRecordExcelVo.getType()){
                case 1:
                    //微信(自贩机)
                    excelWriter = EasyExcel.write(response.getOutputStream(), LotteryRecordWechatExcel.class).build();
                    break;
                case 2:
                    //支付宝
                    excelWriter = EasyExcel.write(response.getOutputStream(), LotteryRecordAliExcel.class).build();
                    break;
                case 3:
                    //第三方卡券
                    excelWriter = EasyExcel.write(response.getOutputStream(), LotteryRecordThirdExcel.class).build();
                    break;
                case 4:
                    //商城券
                    excelWriter = EasyExcel.write(response.getOutputStream(), LotteryRecordShopExcel.class).build();
                    break;
                case 5:
                    //自贩机核销卡券
                    excelWriter = EasyExcel.write(response.getOutputStream(), LotteryRecordReceiveExcel.class).build();
                    break;
                case 6:
                    //实物线下核销
                    excelWriter = EasyExcel.write(response.getOutputStream(), LotteryRecordOfflineExcel.class).build();
                    break;
                case 7:
                    //实物邮递
                    excelWriter = EasyExcel.write(response.getOutputStream(), LotteryRecordPostalExcel.class).build();
                    break;
                default:
                    break;
            }
            if (excelWriter == null) {
                throw new RuntimeException("EasyExcel创建失败!");
            }
            //创建excel 同一个只能创建一次 sheet
            WriteSheet writeSheet =new WriteSheet();
            writeSheet.setSheetName("记录列表");
            //调用接口获取数据
            Integer pageNum = 1;
            while (total != 0L) {
                BeanUtils.copyProperties(lotteryRecordExcelVo,lotteryRecordVo);
                AjaxResult result = recordFeign.getGiftList(lotteryRecordVo,100,pageNum);
                if (result.get("data") != null) {
                    Map<String, Object> resultMap = (Map<String, Object>) result.get("data");
                    Object rows = resultMap.get("rows");
                    if (rows instanceof List<?>) {
                        List<?> list = (List<?>) rows;
                        total = total - list.size();
                        //结果映射
                        switch (lotteryRecordExcelVo.getType()){
                            case 1:
                                //微信(自贩机)
                                List<LotteryRecordWechatExcel> wechatExcelList = wechatResultMap(list);
                                //excel表格输出
                                excelWriter.write(wechatExcelList, writeSheet);
                                break;
                            case 2:
                                //支付宝
                                List<LotteryRecordAliExcel> aliExcelList = aliResultMap(list);
                                excelWriter.write(aliExcelList, writeSheet);
                                break;
                            case 3:
                                //第三方卡券
                                List<LotteryRecordThirdExcel> thirdExcelList = thirdResultMap(list);
                                excelWriter.write(thirdExcelList, writeSheet);
                                break;
                            case 4:
                                //商城券
                                List<LotteryRecordShopExcel> shopExcelList = shopResultMap(list);
                                excelWriter.write(shopExcelList, writeSheet);
                                break;
                            case 5:
                                //自贩机核销卡券
                                List<LotteryRecordReceiveExcel> receiveExcelList = receiveResultMap(list);
                                excelWriter.write(receiveExcelList, writeSheet);
                                break;
                            case 6:
                                //实物线下核销
                                List<LotteryRecordOfflineExcel> offlineExcelList = offlineResultMap(list);
                                excelWriter.write(offlineExcelList, writeSheet);
                                break;
                            case 7:
                                //实物邮递
                                List<LotteryRecordPostalExcel> postalExcelList = postalResultMap(list);
                                excelWriter.write(postalExcelList, writeSheet);
                                break;
                            default:
                                break;
                        }
                    } else {
                        // obj不是List类型
                        total = 0L;
                        throw new RuntimeException("返回结果类型不匹配");
                    }
                    pageNum ++;
                }
            }
        } finally {
            excelWriter.finish();
        }
    }

根据分页循环,追加到excel表中,必须且只创建一个sheet。

wechatResultMap(list);  -- 数据转换方法

错误

1、The current operation is not supported by the current converter.

版本太老,转换器不适配。换成高版本。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值