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;
}