easyExcel使用

一、带条件的数据导出为Excel

1、先确认需要导出的字段,在导出的字段上面加入@ExcelProperty(“value”)注解。
例如:

	@Data
	@ExcelIgnoreUnannotated // 忽略不需要导出的字段
	@TableName("user")
	public class User {
	
	    /**
	    * id
	    */
	    private String id;
	    
	    /**
	     * 姓名
	     */
	    @QueryField(type = QueryField.Type.LIKE)
	    @ExcelProperty(value = "人员姓名")
	    private String name;
	    
			/**
	     * 年龄
	     */
	    @ExcelProperty(value = "人员年龄")
	    private String age;
	    
			/**
	     * 性别  0: 男  1:女
	     */
	    @QueryField(type = QueryField.Type.EQUAL)
	    @ExcelProperty(value = "人员性别")
	    private String sex;
	}

2、controller接口

@Slf4j
@RestController
@RequestMapping("/user")
@Api(tags = "用户信息接口")
public class UserController{
 
    @Autowired
    private UserService userService;
 
    /**
     * 导出用户信息
     * @return
     */
    @ApiOperation(value = "导出用户信息")
    @PostMapping(value = "/exportUserList")
    public void exportUserList(@RequestBody QueryParam<User> query, HttpServletResponse response) {
        try {
        	response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding(StandardCharsets.UTF_8.name());
            fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.name());
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), User.class).build();
            String pathName = fileName + ".xls";
        	//筛选条件
        	QueryWrapper<User> queryWrapper = query.buildQueryWrapper(User.class);
            List<User> dataList = userService.list(queryWrapper);
            // 这里注意如果同一个sheet只要创建一次
            WriteSheet writeSheet = EasyExcel.writerSheet(pathName).build();
            excelWriter.write(dataList, writeSheet);
            excelWriter.finish();
        } catch (Exception e) {
            log.error("导出用户信息异常",e);
        }
    }

调用接口即可完成下载

3、这里会发现:在导出的Excel中,在性别这一列的男,女显示的是0和1 ,不便于分辨,我们可以写一个工具类进行转换:

public class SexConverter implements Converter<String> {
    @Override
    public Class<?> supportJavaTypeKey() {
        return String.class;
    }

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

    /**
     * 这里是写的时候会调用,将Java的Integer对象转换成Excel中的字符串
     *
     * @return Excel中要存储的字符串
     */
    @Override
    public WriteCellData<?> convertToExcelData(WriteConverterContext<String> context) {
        String gender = context.getValue().equals("0") ? "男" : "女";
        return new WriteCellData<String>(gender);
    }
}

然后我们再将这个工具类注入到实体类需要转换的字段上面:

		/**
	     * 性别  0: 男  1:女
	     */
	    @QueryField(type = QueryField.Type.EQUAL)
	    @ExcelProperty(value = "人员性别",converter = SexConverter.class)
	    private String sex;

这样导出的时候获取的性别就是所需要转换的字了。

二、复杂数据导入(参考)

1、导入接口:

	@ApiOperation("上传用户数据")
    @PostMapping(value = "/userUpload")
    public void userUpload(MultipartFile file) throws Exception {
        EasyExcel.read(file.getInputStream(), ExcelRecordsModel.class, new UserExcelEventListener(userService)).sheet().doRead();
    }

2、创建监听器

@Slf4j
public class UserExcelEventListener extends AnalysisEventListener<ExcelRecordsModel> {

    private static final int BATCH_COUNT = 100;
    List<User> dataList = new ArrayList<User>(BATCH_COUNT);
    User user;

    private UserService userService;

    public CanteenRecordExcelEventListener(UserService userService) {
        this.userService= userService;
    }

    @Override
    public void invoke(ExcelRecordsModel excelModel, AnalysisContext context) {
        ReadRowHolder readRowHolder = context.readRowHolder();
        log.info("行号: {}", readRowHolder.getRowIndex());

		//如果是第二行(第二行还是头,提取里面表示第几张表)
        if (readRowHolder.getRowIndex() == 2) {
            user = new User();
            String sheetName = context.readSheetHolder().getSheetName();
            if (sheetName.contains("1")) {
                userService.setType("1");
            } else if (sheetName.contains("2")) {
                userService.setType("2");
            } else if (sheetName.contains("3")) {
                userService.setType("3");
            }

            if (StringUtil.isNotEmpty(excelModel.getObj2())) {
                String[] checkTime = excelModel.getObj2().split("~");
                userService.setCheckStartTime(checkTime[0]);
                userService.setCheckEndTime(checkTime[1]);
                userService.setMakeTime(excelModel.getObj11());
            }
        }

        if (readRowHolder.getRowIndex() > 3) {
            if (readRowHolder.getRowIndex() % 2 == 0) {
                user= new User();
                user.setName(user.getName());
                user.setAge(user.getAge());
                user.setSex(user.getSex());
                dataList.add(canteenRecords);
            } else {
                SuperviseHelper.setValue(canteenRecords, excelModel);
            }
        }

        if (dataList.size() >= BATCH_COUNT) {
            saveData();
            dataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println(context);
        saveData();
    }

    private void saveData() {
        userService.saveOrUpdateBatch(dataList);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

春花.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值