前端传入哪些字段,后端就导出哪些到Excel表格中,具体代码实现如下
controller
/**
* 用户导出
* @param dto
*/
@PostMapping("/exportUser")
public void exportCharterOrder(@RequestBody UserExportDTO dto){
userService.exportUser(dto);
}
serviceImpl
@Override
public 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;
}