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

发布于:2025-05-15 ⋅ 阅读:(12) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到