当前位置: 首页 > 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;
}

http://www.xdnf.cn/news/408205.html

相关文章:

  • MapReduce 的工作原理
  • 数据库分区与分表详解
  • java 中 pojo 的详细讲解
  • BGP练习
  • Java 内存模型(JMM)与内存屏障:原理、实践与性能权衡
  • Python基础:类的深拷贝与浅拷贝-->with语句的使用及三个库:matplotlib基本画图-->pandas之Series创建
  • 用户态到内核态:Linux信号传递的九重门(二)
  • 微信小程序仿淘宝拍照/照片点位识图、点位裁剪生图、图片裁剪组件、图片点位框选、裁剪生成图片,canvasToImg
  • 使用 DMM 测试 TDR
  • Ai应用部署离不开Docker环境
  • shell脚本实现docker运行镜像挂载
  • 【分享】利用自定义表单,文件摆渡系统实现数据合规与高效流转
  • Spark,hadoop 集群的常用命令
  • 科技快讯 | 字节跳动开源一款Deep Research项目;全球首个氮化镓量子光源芯片发布
  • 如何使用 Winget 命令安装 Microsoft Teams
  • 2.2 微积分的解释
  • Xubuntu系统详解
  • 解决pip安装PyPI默认源速度慢
  • TCPIP详解 卷1协议 八 ICMPv4和ICMPv6 Internet控制报文协议
  • Bash 执行命令的基本流程
  • [Java][Leetcode middle] 121. 买卖股票的最佳时机
  • tensorflow-cpu
  • 9.渐入佳境 -- 套接字的多种可选项
  • 配置yarn模式
  • 使用 gma 绘制汉魏洛阳城
  • 针对面试-mysql篇
  • 人工智能100问☞第21问:神经网络如何模拟人脑结构?
  • 自适应主从复制模拟器的构建与研究
  • mysql dump 导入导出用法
  • 2024河南省赛vp补题