easypoi导入导出完整代码

easypoi 导入/导出

        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.2.1</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
        </dependency>
        <dependency>
      <groupId>cn.afterturn</groupId>
      <artifactId>easypoi-base</artifactId>
    </dependency>
    <dependency>
      <groupId>cn.afterturn</groupId>
      <artifactId>easypoi-annotation</artifactId>
    </dependency>

1.导出
导出的实体类

/**
 * 加油费用管理
 * Author:  shx
 * Date: 2022/11/29 10:54
 */
@Data
@TableName("cost_oil_card_refuel")
@EqualsAndHashCode(callSuper = true)
public class CostOilCardRefuel  extends BaseEntity<Long> {
    private static final long serialVersionUID = 1L;

    /**
     * 主键id
     */
    @JsonSerialize(using = ToStringSerializer.class)
    @Schema(description = "主键")
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;

    /**
     * 车辆使用机构部门
     */
    @Schema(description = "车辆使用机构部门")
    @Column(comment = "车辆使用机构部门")
    private String hostOrgId;

    /**
     * 车辆编号
     */
    @Schema(description = "车辆编号")
    @Column(comment = "车辆编号")
    private String hostId;

    /**
     * 车牌号码
     */
    @Schema(description = "车牌号码")
    @Column(comment = "车牌号码")
    @Excel(name = "车牌号码", width = 10)
    private String hostNo;

    /**
     * 机构编号
     */
    @Schema(description = "机构编号")
    @Column(comment = "机构编号")
    private String orgId;

    /**
     * 驾驶员编号
     */
    @Schema(description = "驾驶员编号")
    @Column(comment = "驾驶员编号")
    private String driverId;

    /**
     * 驾驶员姓名
     */
    @Schema(description = "驾驶员姓名")
    @Column(comment = "驾驶员姓名")
    private String driverName;

    /**
     * 供应商编号
     */
    @Schema(description = "供应商编号")
    @Column(comment = "供应商编号")
    private String providerId;

    /**
     * 供应商名称
     */
    @Schema(description = "供应商名称")
    @Column(comment = "供应商名称")
    @Excel(name = "供应商名称", width = 10)
    private String providerName;

    /**
     * 加油时间
     */
    @DateTimeFormat(pattern = SigConstant.PATTERN_DATETIME)
    @JsonFormat(pattern = SigConstant.PATTERN_DATETIME)
    @Schema(description = "加油时间")
    @TableField("refuel_date")
    @ColumnComment("加油时间")
    @Excel(name = "加油时间", format = "yyyy-MM-dd HH:mm:ss", width = 10)
    private LocalDateTime refuelDate;

    /**
     * 付费方式:1现金、2油卡,默认1现金
     */
    @Schema(description = "付费方式:1现金、2油卡,默认1现金")
    @Column(comment = "付费方式:1现金、2油卡,默认1现金")
    private Integer payType;

    /**
     * 油料类型。取值范围:1:98#  2:97#  3:95#   4:93#  5:92#  6:90#  7:89#  8:5#柴油  9:0#柴油
     */
    @Schema(description = "油料类型。取值范围:1:98#  2:97#  3:95#   4:93#  5:92#  6:90#  7:89#  8:5#柴油  9:0#柴油")
    @Column(comment = "油料类型。取值范围:1:98#  2:97#  3:95#   4:93#  5:92#  6:90#  7:89#  8:5#柴油  9:0#柴油")
    private Integer oilType;

    /**
     * 加油卡号
     */
    @Schema(description = "加油卡号")
    @Column(comment = "加油卡号")
    @Excel(name = "加油卡号", width = 10)
    private String oilCardNo;

    /**
     * 加油量(单位升)
     */
    @Schema(description = "加油量(单位升)")
    @Column(comment = "加油量(单位升)")
    @Excel(name = "加油量(升)", width = 10)
    private Double oilAmount;

    /**
     * 单价(单位:元)
     */
    @Schema(description = "单价(单位:元)")
    @Column(comment = "单价(单位:元)")
    @Excel(name = "单价(元/升)", width = 10)
    private Double oilPrice;

    /**
     * 费用(单位:元)
     */
    @Schema(description = "费用(单位:元)")
    @Column(comment = "费用(单位:元)")
    @Excel(name = "费用", width = 10)
    private Double oilCost;

    /**
     * 备注
     */
    @Schema(description = "备注")
    @Column(comment = "备注")
    private String remark;

    /**
     * 创建人名字
     */
    @Schema(description = "创建人名字")
    @Column(comment = "创建人名字")
    private String createUserName;

    /**
     * 创建人部门编号
     */
    @Schema(description = "创建人部门编号")
    @Column(comment = "创建人部门编号")
    private String createOrgId;

    /**
     * 修改人名字
     */
    @Schema(description = "修改人名字")
    @Column(comment = "修改人名字")
    private String updateUserName;

    /**
     * 修改人部门编号
     */
    @Schema(description = "修改人部门编号")
    @Column(comment = "修改人部门编号")
    private String updateOrgId;

    /**
     * 油料类型描述
     */
    @Schema(description = "油料类型描述")
    @Column(comment = "油料类型描述")
    private String oilTypeDesc;

    /**
     * 出车单编号
     */
    @Schema(description = "出车单编号")
    @Column(comment = "出车单编号")
    private String vehOutRunId;

    /**
     * 是否审核
     */
    @Schema(description = "是否审核")
    @Column(comment = "是否审核")
    private Integer feeVerify;

    /**
     * 消费地点
     */
    @Schema(description = "消费地点")
    @Column(comment = "消费地点")
    private String consumeAddress;

    /**
     * 油料类型
     */
    @TableField(exist = false)
    @Excel(name = "油标号", width = 10)
    private String oilTypeName;

    @TableField(exist = false)
    @Excel(name = "付款方式", width = 10)
    private String payTypeName;
}

Controller代码

/**
     * 导出加油费用列表
     * @param costOilCardRefuelVo
     * @param response
     * @throws Exception
     */
    @Operation(description = "加油费用导出", summary = "加油费用导出")
    @PostMapping(value = "/exportCostOilCardRefuel")
    public void exportCostOilCardRefuel(@RequestBody CostOilCardRefuelVo costOilCardRefuelVo , HttpServletResponse response
    ) throws Exception {
        iCostOilCardRefuelService.exportCostOilCardRefuel(costOilCardRefuelVo, response);
    }

接口类

void  exportCostOilCardRefuel(CostOilCardRefuelVo costOilCardRefuelVo, HttpServletResponse response) throws Exception;

接口实现类代码

@Override
    public void exportCostOilCardRefuel(CostOilCardRefuelVo costOilCardRefuelVo, HttpServletResponse response) throws Exception {
        PageHelper.startPage(costOilCardRefuelVo.getPageNo(),costOilCardRefuelVo.getPageSize());
        PageInfo pageInfo = new PageInfo();
        List<CostOilCardRefuel> costOilCardRefuelList = baseMapper.getCostOilCardRefuelList(costOilCardRefuelVo);
        costOilCardRefuelList.forEach(c->{
            //
            c.setOilTypeName(dictMapper.getValueName("OIL_TYPE",String.valueOf(c.getOilType())));
            if (c.getPayType()==1){
                c.setPayTypeName("现金");
            }else {
                c.setPayTypeName("油卡");
            }

        });
        pageInfo.setTotal(costOilCardRefuelList.size());
        pageInfo.setList(costOilCardRefuelList);
        ExportParams params = new ExportParams();
        params.setType(ExcelType.HSSF);
        PoiUtil.defaultExport(pageInfo.getList(), CostOilCardRefuel.class, "加油费用列表.xls", response, params);
    }

2.导入Excel
错误返回实体

import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.AllArgsConstructor;
import lombok.Data;

import java.io.Serializable;
@Data
@AllArgsConstructor
public class ImportErrorInfo implements Serializable {
    @Excel(name = "行数", width = 10)
    private Integer lineNum;
    @Excel(name = "错误描述", width = 10)
    private String errMsg;
}

接受EXCEL数据实体

import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.handler.inter.IExcelDataModel;
import cn.afterturn.easypoi.handler.inter.IExcelModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;


/**
 * Author:  shx
 * Date: 2022/12/2 13:51
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class InputCostOilCardRefuelVo implements IExcelDataModel, IExcelModel {
    /**
     * 车牌号码
     */
    @Excel(name = "车牌号码", width = 10)
    private String hostNo;
    @Excel(name = "驾驶员", width = 10)
    private String driverName;
    @Excel(name = "供应商名称", width = 10)
    private String providerName;
    @Excel(name = "加油时间", format = "yyyy-MM-dd HH:mm:ss", width = 10)
    private String refuelDate;
    @Excel(name = "油标号", width = 10)
    private String oilTypeName;
    @Excel(name = "付款方式", width = 10)
    private String payTypeName;
    @Excel(name = "付费卡号", width = 10)
    private String oilCardNo;
    @Excel(name = "加油量(升)", width = 10)
    private Double oilAmount;
    @Excel(name = "单价(元/升)", width = 10)
    private Double oilPrice;
    @Excel(name = "费用", width = 10)
    private Double oilCost;
    @Excel(name = "消费地点", width = 10)
    private String consumeAddress;
    @Excel(name = "备注", width = 10)
    private String remark;
    /**
     * 行号
     */
    private Integer rowNum;

    /**
     * 错误消息
     */
    private String errorMsg;
}

controller层代码

/**
     * 导入加油费用
     * @param file
     * @throws Exception
     */
    @Operation(description = "导入加油费用", summary = "导入加油费用")
    @PostMapping(value = "/inputCostOilCardRefuel")
    public R<List<ImportErrorInfo>> inputCostOilCardRefuel(@RequestParam("file") MultipartFile file) throws Exception {
        return iCostOilCardRefuelService.inputCostOilCardRefuel(file);
    }

接口类代码

R<List<ImportErrorInfo>> inputCostOilCardRefuel(MultipartFile file)throws Exception;

接口实现类代码

@Override
    public R<List<ImportErrorInfo>> inputCostOilCardRefuel(MultipartFile file) throws Exception {
        if (!Objects.requireNonNull(file.getOriginalFilename()).endsWith("xls")) {
            throw new ValidationException("请导入正确的文件");
        }
        ImportParams importParams = new ImportParams();
        importParams.setTitleRows(1);//去掉标题行
        importParams.setTitleRows(0);
        importParams.setNeedVerify(true);
        //数据集合
        List<CostOilCardRefuel> costOilCardRefuelList = new ArrayList<>();
        //卡集合
        List<FuelCard> fuelCardList = new ArrayList<>();
        //错误集合
        List<ImportErrorInfo> importErrorInfoList = new ArrayList<>();
        //返回集合
        R<List<ImportErrorInfo>> res = new R<>();
        //用流的方式导入数据,获取到当前导入的内容  校验通过的集合
        List<InputCostOilCardRefuelVo> inputCostOilCardRefuelVoList = ExcelImportUtil.importExcel(file.getInputStream(), InputCostOilCardRefuelVo.class, importParams);

        //校验失败的数据结果
        ExcelImportResult<InputCostOilCardRefuelVo> result = ExcelImportUtil.importExcelMore(file.getInputStream(),
                InputCostOilCardRefuelVo.class, importParams);

        for (InputCostOilCardRefuelVo entity : result.getFailList()) {
            ImportErrorInfo err = new ImportErrorInfo(entity.getRowNum() + 1, entity.getErrorMsg());
            importErrorInfoList.add(err);
        }
        for (InputCostOilCardRefuelVo inputCostOilCardRefuelVo : inputCostOilCardRefuelVoList){

            //时间校验
            Date refuelDate = DateUtil.parseStrDate(inputCostOilCardRefuelVo.getRefuelDate(), "yyyy-MM-dd HH:mm:ss");
            Date oracleDate = DateUtil.parseStrDate(DateUtil.formatDate(new Date(), "yyyy-MM-dd HH:mm:ss") ,"yyyy-MM-dd HH:mm:ss");
            if (refuelDate.after(oracleDate)){
                ImportErrorInfo err = new ImportErrorInfo(inputCostOilCardRefuelVo.getRowNum() + 1,"加油时间不能在当前时间之后");
                importErrorInfoList.add(err);
                continue;
            }
            //TODO 根据供应商providerId 查询信息进行校验

            //TODO 校验车辆信息
            CostOilCardRefuel costOilCardRefuel = new CostOilCardRefuel();
            BeanUtils.copyProperties(inputCostOilCardRefuelVo,costOilCardRefuel);
            //付款方式
            if (inputCostOilCardRefuelVo.getPayTypeName().equals("现金")){
                costOilCardRefuel.setPayType(1);
            }else {
                costOilCardRefuel.setPayType(2);
            }
            //油料类型
            costOilCardRefuel.setOilType(Integer.parseInt(dictMapper.getValue("OIL_TYPE",inputCostOilCardRefuelVo.getOilTypeName())));

            //校验付款方式
            if(costOilCardRefuel.getPayType()==1){
                costOilCardRefuel.setOilCardNo("");
            }else if(costOilCardRefuel.getPayType()==2){
                if(Util.isEmpty(costOilCardRefuel.getOilCardNo())){
                    ImportErrorInfo err = new ImportErrorInfo(inputCostOilCardRefuelVo.getRowNum() + 1,"付费方式为油卡时,请输入加油卡号");
                    importErrorInfoList.add(err);
                    continue;
                }
            }else{
                ImportErrorInfo err = new ImportErrorInfo(inputCostOilCardRefuelVo.getRowNum() + 1,"付费方式不正确");
                importErrorInfoList.add(err);
                continue;
            }

            String oilCardNo = costOilCardRefuel.getOilCardNo();
            Long oilCardRecordId = null;
            if(!Util.isEmpty(oilCardNo)){
                List<FuelCard> oilCardInfos = fuelCardMapper.selectList(new QueryWrapper<FuelCard>().eq("is_deleted","0").eq("card_no",oilCardNo));
                if(oilCardInfos.size() != 1){
                    ImportErrorInfo err = new ImportErrorInfo(inputCostOilCardRefuelVo.getRowNum() + 1,"加油卡信息不正确");
                    importErrorInfoList.add(err);
                    continue;
                }

                if(oilCardInfos.get(0).getCardType() == 1){
                    ImportErrorInfo err = new ImportErrorInfo(inputCostOilCardRefuelVo.getRowNum() + 1,"加油时只能输入副卡");
                    importErrorInfoList.add(err);
                    continue;
                }

                oilCardRecordId = oilCardInfos.get(0).getCardId();
            }
            //获取当前登录人的信息
            User user = userService.getById(SecureUtil.getUser().getUserId());
            costOilCardRefuel.setUpdateOrgId(user.getOrgId());
            costOilCardRefuel.setUpdateTime(LocalDateTime.now());
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            costOilCardRefuel.setRefuelDate(LocalDateTime.parse(inputCostOilCardRefuelVo.getRefuelDate(),formatter));
            costOilCardRefuel.setOrgId(user.getOrgId());
            costOilCardRefuel.setUpdateUserName(user.getRealName());
            if(!StringUtils.isEmpty(oilCardRecordId)) { // 油卡加油 减去当前油卡余额
                FuelCard cardInfo = fuelCardMapper.selectById(oilCardRecordId);
                Double balanceAmount = cardInfo.getBalanceAmount();
                cardInfo.setBalanceAmount(balanceAmount - inputCostOilCardRefuelVo.getOilCost());
                if(cardInfo.getBalanceAmount() < 0) {
                    ImportErrorInfo err = new ImportErrorInfo(inputCostOilCardRefuelVo.getRowNum() + 1, "当前油卡余额(" + balanceAmount + ")不足,请先充值");
                    importErrorInfoList.add(err);
                    continue;
                }
                fuelCardList.add(cardInfo);
            }
            costOilCardRefuelList.add(costOilCardRefuel);
        }
        if (Func.isNotEmpty(importErrorInfoList)) {
            res.setData(importErrorInfoList);
            res.setMessage("校验不通过");
            res.setStatus(ResultCode.FAILURE.getStatus());
            return res;
        }
        //导入数据库
        boolean add = super.saveBatch(costOilCardRefuelList);
        fuelCardList.forEach(f->{
            fuelCardMapper.updateById(f);
        });
        if (add){
            res.setMessage("操作成功");
        }
        return res;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

司小白

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

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

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

打赏作者

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

抵扣说明:

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

余额充值