当前位置: 首页 > news >正文

Java使用POI+反射灵活的控制字段导出Excel

前端传入哪些字段,后端就导出哪些到Excel表格中,具体代码实现如下

controller

/*** 用户导出* @param dto*/@PostMapping("/exportUser")public void exportCharterOrder(@RequestBody UserExportDTO dto){userService.exportUser(dto);}

serviceImpl

@Overridepublic void exportCharterOrderDetails(UserExportDTO dto) {if (dto.getName() == null){throw new MyException("用户名称不能为空");}// 导出标题处理Map<String,String> headTitieMap = showTxtHandle(dto);try{// 创建一个新的工作簿Workbook workbook = new XSSFWorkbook();// 创建一个新的工作表Sheet sheet = workbook.createSheet("列表导出");// 2. 创建单元格样式CellStyle style = workbook.createCellStyle();// 3. 设置对齐方式style.setAlignment(HorizontalAlignment.CENTER);      // 水平居中style.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中Row row = sheet.createRow(0);Cell cell = row.createCell(0);if (StringUtils.isNotBlank(dto.getBeginTime()) && StringUtils.isNotBlank(dto.getEndTime())) {cell.setCellValue(dto.getBeginTime() + " 至 " + dto.getEndTime() + "用户信息表");}else{cell.setCellValue("用户信息表");}cell.setCellStyle(style);// 设置行高row.setHeightInPoints(20);// 设置列标题row = sheet.createRow(1);// 标题集合List<String> headers = new ArrayList<>();for (String key : headTitieMap.keySet()){headers.add(key);}// 设置标题for (int i = 0; i < headers.size(); i++) {cell = row.createCell(i);cell.setCellValue(headers.get(i));cell.setCellStyle(style);// 设置列宽sheet.setColumnWidth(i,25 * 256);}// 设置行高row.setHeightInPoints(30);// 查询数据List<UserExportVO> list = userMapper.getUserExport(dto);if(list == null || (list != null && list.size() <= 0)){throw new MyException("未查询到数据,无法导出!");}for (int i = 0; i < list.size(); i++) {row = sheet.createRow(2 + i);for (int j = 0; j < headers.size(); j++) {cell = row.createCell(j);cell.setCellStyle(style);String key1 = headTitieMap.get(headers.get(j));Field field = list.get(i).getClass().getDeclaredField(key1);field.setAccessible(true);Object value = field.get(list.get(i));if (value == null){value = "无";}cell.setCellValue(String.valueOf(value));}}String fileName = "用户信息表.xlsx";if (StringUtils.isNotBlank(dto.getBeginTime()) && StringUtils.isNotBlank(dto.getEndTime())){fileName = dto.getBeginTime() + "至" + dto.getEndTime() + fileName;}// 请求头response.setContentType("applicaliton/vnd.ms-excel");response.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));response.setCharacterEncoding("UTF-8");ServletOutputStream outputStream = null;outputStream = response.getOutputStream();workbook.write(outputStream);//关闭资源outputStream.flush();workbook.close();outputStream.close();} catch (UnsupportedEncodingException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);} catch (NoSuchFieldException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);}}/*** 导出标题处理* @param dto* @return*/private static Map<String,String> showTxtHandle(UserExportDTO dto) {Map<String, String> showTxtMap = new LinkedHashMap<>();if (dto.getShowTxt().getId() != null && dto.getShowTxt().getId() > 0){showTxtMap.put("序号","id");}if (dto.getShowTxt().getName() != null && dto.getShowTxt().getName() > 0){showTxtMap.put("用户名称","name");}if (dto.getShowTxt().getSex() != null && dto.getShowTxt().getSex() > 0){showTxtMap.put("用户性别","sex");}if (dto.getShowTxt().getAge() != null && dto.getShowTxt().getAge() > 0){showTxtMap.put("用户年龄","age");}if (dto.getShowTxt().getTel() != null && dto.getShowTxt().getTel() > 0){showTxtMap.put("用户电话","tel");}if (dto.getShowTxt().getUserStatus() != null && dto.getShowTxt().getUserStatus() > 0){showTxtMap.put("用户状态","userStatus");}return showTxtMap;}

dto前端入参实体类

/*** 用户导出入参*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserExportDTO {/*** 用户id*/private Integer id;/*** 用户id集合*/private List<String> ids;/*** 开始时间*/private String beginTime;/*** 结束时间*/private String endTime;/*** 状态:1-启用,2-禁用*/private String status;/*** 用户excel导出展示字段*/private UserExportShowTxt showTxt;
}

UserExportShowTxt实体类,需要导出的字段,前端传值为1

/*** 用户excel导出展示字段*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CharterOrderDetailsExportShowTxt {/*** 用户id*/private Integer id;/*** 名称*/private Integer name;/*** 性别*/private Integer sex;/*** 年龄*/private Integer age;/*** 电话*/private Integer userTel;/*** 用户状态*/private Integer userStatus;
}

相关文章:

  • 18.three官方示例+编辑器+AI快速学习webgl_buffergeometry_points_interleaved
  • 神经网络初步学习——感知机
  • 《步进电机最小转速终极指南:从理论到实战,突破低速极限的5大秘技》
  • 了解神经网络声音定制,实现多情绪、多语言演绎
  • 推理加速新范式:火山引擎高性能分布式 KVCache (EIC)核心技术解读
  • 搜索二维矩阵 II 算法讲解
  • 矩阵置零算法讲解
  • 使用 AddressSanitizer 检测栈内存越界错误
  • 什么是数据集市(Data Mart)?
  • 如何查看电脑处理器配置 电脑处理器查看方法
  • Koa知识框架
  • 菊厂0510面试手撕题目解答
  • 一、HAL库的设计理念详解:从架构到实践
  • 简述DNS域名服务器
  • 前端面试每日三题 - Day 32
  • Browserless 快速上手
  • 全栈工程师实战手册:LuatOS日志系统开发指南!
  • C 语言_可变参数宏详解
  • temu自养号采购如何解决多账号防关联问题
  • (done) 补充:xv6 的一个用户程序 init 是怎么启动的 ?它如何启动第一个 bash ?
  • 智能手表眼镜等存泄密隐患,国安部提醒:严禁在涉密场所使用
  • 济南市委副秘书长吕英伟已任历下区领导
  • “80后”李灿已任重庆市南川区领导,此前获公示拟提名为副区长人选
  • 深入贯彻中央八项规定精神学习教育中央指导组完成进驻
  • 2025年两岸关系研讨会在上海开幕
  • 新华时评:中国维护国际经贸秩序的立场坚定不移