SpringBoot集成Hutool 实现数据库数据导出到Excel 功能

日常开发中,在B端页面上,经常需要将数据库中的数据,导出到Excel。我们今天用Hutool工具包,实现一下这个功能。

一、Hutool简介

Hutool是一个功能丰富且易用的Java工具库,通过诸多实用工具类的使用,旨在帮助开发者快速、便捷地完成各类开发任务。 这些封装的工具涵盖了字符串、数字、集合、编码、日期、文件、IO、加密、数据库JDBC、JSON、HTTP客户端等一系列操作, 可以满足各种不同的开发需求。

Pom文件依赖注入

<dependency>
    <groupId>cn.hutool</groupId>
		<artifactId>hutool-all</artifactId>
		<version>5.3.10</version>
</dependency>

二、代码实现

1、实体类

@Data
@EqualsAndHashCode(callSuper = false)
@TableName("test_user")
@ApiModel(value="User对象", description="普通用户表")
public class User implements Serializable {

    private static final long serialVersionUID=1L;

    @TableId(type = IdType.ASSIGN_ID)
    private Long id;

    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建人")
    private Long createBy;

    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间")
    private LocalDateTime createDate;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty(value = "修改人")
    private Long updateBy;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty(value = "修改时间")
    private LocalDateTime updateDate;

    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "删除状态")
    @TableLogic
    private Integer deleted;

    @ApiModelProperty(value = "邮箱")
    private String userName;

    @ApiModelProperty(value = "密码")
    private String password;

    @ApiModelProperty(value = "昵称")
    private String nickName;

    @ApiModelProperty(value = "手机号")
    private String phone;

    @ApiModelProperty(value = "头像地址")
    private String headUrl;

    @ApiModelProperty(value = "用户状态;0:正常;1封禁")
    private Integer status;

}

2、接口定义

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;

@RestController
@RequestMapping("/api/user")
@Api(tags = "用户导出测试")
public class UserExportController {

    @Resource
    private UserExportService userExportService;

    @GetMapping("/export")
    @ApiOperation(value = "导出订单")
    public void export(UserExportRequest request, HttpServletResponse response) {
        userExportService.exportService(request, response);
    }

}

3、DTO

请求对象

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
public class UserExportRequest {

    @ApiModelProperty(value = "邮箱")
    private String userName;

    @ApiModelProperty(value = "手机号")
    private String phone;

    @ApiModelProperty(value = "用户状态;0:正常;1封禁")
    private Integer status;

}

返回对象

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
public class UserExportResponse {

    @ApiModelProperty(value = "主键ID")
    private String id;

    @ApiModelProperty(value = "创建时间")
    private String createDate;

    @ApiModelProperty(value = "邮箱")
    private String userName;

    @ApiModelProperty(value = "昵称")
    private String nickName;

    @ApiModelProperty(value = "手机号")
    private String phone;

    @ApiModelProperty(value = "用户状态")
    private String status;

}

4、实现类

接口

import javax.servlet.http.HttpServletResponse;

public interface UserExportService {

    void exportService(UserExportRequest request, HttpServletResponse response);

}

实现类

@Service
public class UserExportServiceImpl implements UserExportService {

    @Resource
    private UserMapper userMapper;

    @Override
    public void exportService(UserExportRequest request, HttpServletResponse response) {
        // 初始化查询条件
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        if (StringUtils.isNotBlank(request.getUserName())) {
            lambdaQueryWrapper.like(User::getUserName, request.getUserName());
        }
        if (StringUtils.isNotBlank(request.getPhone())) {
            lambdaQueryWrapper.like(User::getPhone, request.getPhone());
        }
        if (ObjectUtils.isNotEmpty(request.getStatus())) {
            lambdaQueryWrapper.eq(User::getStatus, request.getStatus());
        }
        // 查询用户列表
        List<User> userList = userMapper.selectList(lambdaQueryWrapper);
        // 如果查询不到内容,直接结束方法
        if (CollectionUtils.isEmpty(userList)) {
            return;
        }
        // 组装输出内容
        List<UserExportResponse> userResponseList = userList.stream().map(user -> {
            UserExportResponse userExportResponse = new UserExportResponse();
            BeanUtil.copyProperties(user, userExportResponse, CopyOptions.create().setIgnoreError(true));
            // 用户状态赋值中文
            if (ObjectUtils.isNotEmpty(user.getStatus())) {
                switch (user.getStatus()) {
                    case 0:
                        userExportResponse.setStatus("正常");
                        break;
                    case 1:
                        userExportResponse.setStatus("封禁");
                        break;
                    default:
                        userExportResponse.setStatus("状态异常");
                        break;
                }
            }
            // 创建时间 = 年月日 日分秒
            DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            String createDate = df.format(user.getCreateDate());
            userExportResponse.setCreateDate(createDate);
            return userExportResponse;
        }).collect(Collectors.toList());
        // 导出
        exportExcel(userResponseList, response);
    }

    /**
     * 导出到Excel
     *
     * @param userResponseList    导出内容
     * @param httpServletResponse 输出流
     */
    public void exportExcel(List<UserExportResponse> userResponseList, HttpServletResponse httpServletResponse) {
        // 开始生成Excel
        ExcelWriter excelWriter = ExcelUtil.getWriter();
        // 注入属性
        excelWriter.addHeaderAlias("id", "用户ID");
        excelWriter.addHeaderAlias("userName", "用户邮箱");
        excelWriter.addHeaderAlias("nickName", "用户昵称");
        excelWriter.addHeaderAlias("phone", "手机号");
        excelWriter.addHeaderAlias("status", "用户状态");
        excelWriter.addHeaderAlias("createDate", "创建时间");
        // 写入
        if (!CollectionUtils.isEmpty(userResponseList)) {
            excelWriter.write(userResponseList, true);
        }
        httpServletResponse.setContentType("application/vnd.ms-excel;charset=utf-8");
        httpServletResponse.setHeader("Content-Disposition",
                "attachment;filename=" + URLEncoder.createDefault().encode("用户列表",
                        Charset.defaultCharset()) + ".xls");
        ServletOutputStream out = null;
        try {
            out = httpServletResponse.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        excelWriter.flush(out, true);
        // 关闭流
        excelWriter.close();
        IoUtil.close(out);
    }

}

三、测试结果

PostMan测试
在这里插入图片描述
将二进制流导出为文件,保存到本地
在这里插入图片描述
文件内容
在这里插入图片描述

所有你想象的一切,皆是现实!
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您想要了解如何使用SpringBoot实现将给定数据导出Excel吗? 首先,您需要在pom.xml中添加以下依赖项: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> ``` 这些依赖项将帮助您使用Apache POI库来生成Excel文件。 接下来,您需要创建一个方法,该方法将使用POI库将数据写入Excel文件。以下是一个简单的示例: ```java public void exportDataToExcel(List<YourDataClass> dataList) { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Your sheet name"); // create header row Row header = sheet.createRow(0); header.createCell(0).setCellValue("Header 1"); header.createCell(1).setCellValue("Header 2"); header.createCell(2).setCellValue("Header 3"); // create data rows int rowNumber = 1; for (YourDataClass data : dataList) { Row row = sheet.createRow(rowNumber++); row.createCell(0).setCellValue(data.getField1()); row.createCell(1).setCellValue(data.getField2()); row.createCell(2).setCellValue(data.getField3()); } // write to file try { FileOutputStream outputStream = new FileOutputStream("Your file path"); workbook.write(outputStream); workbook.close(); } catch (IOException e) { e.printStackTrace(); } } ``` 您可以将此方法添加到适当的控制器类中,并将数据列表作为参数传递。接下来,您可以将此方法公开为对外的API,以便其他应用程序也可以调用它。 这就是使用SpringBoot数据导出Excel的基本步骤。希望对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值