前端傳入哪些字段,后端就導出哪些到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;
}