1.后端代码
第一步:UserMapper定义根据ID列表批量查询用户方法
// 批量查询用户信息List<User> selectUserByIds(List<Integer> ids);
第二步:UserMapper.xml写动态SQL,实现批量查询用户
<!--根据Ids批量查询用户--><select id="selectUserByIds" resultType="com.example.deepseek.account.pojo.entity.User">SELECT *FROM usersWHERE id in<foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach></select>
第三步:UserService中定义批量查询接口
/*** 根据Ids批量查询用户信息,用于导出用户信息到Excel* @return Excel文件*/List<User> selectUserByIds(List<Integer> ids);
第四步:UserServiceImpl中实现Service接口
/*** 根据Ids批量查询用户信息,用于批量导出用户信息** @param ids 用户id列表* @return*/@Overridepublic List<User> selectUserByIds(List<Integer> ids) {return userMapper.selectUserByIds(ids);}
第五步:FileController中调用UserService方法,并配置导出Excel表格的相关设置
/*** 导出数据库数据到Excel*/@GetMapping("/exportUser")public void exportExcel(@RequestParam(value = "ids") List<Integer> ids, HttpServletResponse response) throws IOException {// 1. 查询数据库中的用户数据List<User> userList = userService.selectUserByIds(ids);// 2. 构建Writer对象ExcelWriter writer = ExcelUtil.getWriter(true);// 3. 设置中文表头writer.addHeaderAlias("id", "编号");writer.addHeaderAlias("name", "用户名");writer.addHeaderAlias("role", "角色");writer.addHeaderAlias("email", "邮箱");writer.addHeaderAlias("phone", "手机号");writer.addHeaderAlias("avatar", "头像地址");writer.addHeaderAlias("createTime", "创建时间");writer.addHeaderAlias("updateTime", "更新时间");// 4. 写出数据到sheet// 默认的,未添加alias的属性也会写出;但是如果想要只输出加了别名的字段,可以调用此方法writer.setOnlyAlias(true);// 4. 写出数据到writerwriter.write(userList);// 5. 设置输出的文件的名称以及输出流的头信息response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");String fileName = URLEncoder.encode("管理员信息", String.valueOf(StandardCharsets.UTF_8));response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");// 6. 写出到输出流 并关闭 writerServletOutputStream os = response.getOutputStream();writer.flush(response.getOutputStream(), true); // 自动flushwriter.close();}
第六步:使用测试工具(Postman、Apifox等)测试后端导出接口
(1)由于后端接口返回的是数据格式是Binary,所以需要先设置接口的返回响应的内容格式为Binary。

(2)添加请求参数,发送请求。

(3) 发送之后可以看到是乱码,但是右边响应是200。这个时候我们只需点击下载按钮即可将导出的表格进行下载。


2.前端代码
第一步:<template>
<!--选择列--><el-table-column type="selection" width="50"/>. . . . . .. . . . . .. . . . . .<el-button type="primary" @click="handleExport">批量导出</el-button>
第二步:<script>
// 存储选中用户的ID
const selectedIds = ref(new Set())// 批量导出用户
const handleExport = async () => {if (!selectedIds.value.size) {ElMessage.warning('请先选择要导出的用户');return;}const ids = Array.from(selectedIds.value);console.log(ids);let url = `http://localhost:8080/api/file/exportUser?ids=${ids.join(',')}`;window.open(url);
}