网站找谁备案,垂直行业门户网站有哪些,装修免费咨询平台,商业网站和企业网站的区别在 Spring Boot 中结合 EasyExcel 实现动态表头导出#xff08;无实体类#xff0c;表头和字段#xff08;前端传表名#xff0c;字段值动态查询#xff0c;返回ListMapString,Object#xff09;由前端传递#xff09;可以通过以下步骤实现。以下是完整…在 Spring Boot 中结合 EasyExcel 实现动态表头导出无实体类表头和字段前端传表名字段值动态查询返回ListMapString,Object由前端传递可以通过以下步骤实现。以下是完整示例 1. 前端请求数据结构
假设前端传递的 JSON 格式如下
{headers: [{title: 姓名, field: name},{title: 年龄, field: age},{title: 城市, field: city}],data: [{name: 张三, age: 25, city: 北京},{name: 李四, age: 30, city: 上海}]
}2. 后端 DTO 定义
定义接收参数的 DTO 类
Data
public class ExportRequest {private ListHeader headers;private ListMapString, Object data;Datapublic static class Header {private String title; // 表头名称private String field; // 数据字段名}
}3. Controller 层接口
处理导出请求
RestController
public class ExportController {Autowiredprivate ExportService exportService;PostMapping(/export)public void exportExcel(RequestBody ExportRequest request, HttpServletResponse response) {exportService.export(request, response);}
}4. Service 层实现
核心导出逻辑
Service
public class ExportService {public void export(ExportRequest request, HttpServletResponse response) {try {// 设置响应头response.setContentType(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet);response.setCharacterEncoding(UTF-8);String fileName URLEncoder.encode(动态导出.xlsx, UTF-8);response.setHeader(Content-Disposition, attachment; filename fileName);// 获取输出流OutputStream outputStream response.getOutputStream();// 动态构建表头和数据WriteSheet writeSheet EasyExcel.writerSheet(Sheet1).build();ExcelWriter excelWriter EasyExcel.write(outputStream).build();// 动态添加表头WriteTable writeTable new WriteTable();ListListString head buildHead(request.getHeaders());writeTable.setHead(head);// 动态填充数据ListListObject data buildData(request.getHeaders(), request.getData());excelWriter.write(data, writeSheet, writeTable);// 关闭流excelWriter.finish();outputStream.flush();} catch (IOException e) {throw new RuntimeException(导出失败, e);}}// 构建表头private ListListString buildHead(ListExportRequest.Header headers) {ListListString head new ArrayList();for (ExportRequest.Header header : headers) {ListString columnHead Collections.singletonList(header.getTitle());head.add(columnHead);}return head;}// 构建数据行private ListListObject buildData(ListExportRequest.Header headers, ListMapString, Object dataList) {ListListObject data new ArrayList();for (MapString, Object rowData : dataList) {ListObject row new ArrayList();for (ExportRequest.Header header : headers) {row.add(rowData.get(header.getField()));}data.add(row);}return data;}
}5. 关键点说明 动态表头 通过 buildHead() 方法将前端传递的 headers 转换为 EasyExcel 需要的 ListListString 格式。 动态数据 通过 buildData() 方法根据 headers 中定义的 field 字段顺序从 data 中提取对应值构建数据行。 流式导出 使用 ExcelWriter 直接操作输出流避免内存溢出适合大数据量。 6. 测试与验证
使用 Postman 发送请求 URL: POST http://localhost:8080/export BodyJSON {headers: [{title: 姓名, field: name},{title: 年龄, field: age},{title: 城市, field: city}],data: [{name: 张三, age: 25, city: 北京},{name: 李四, age: 30, city: 上海}]
}响应浏览器自动下载 动态导出.xlsx内容如下 姓名年龄城市张三25北京李四30上海 7. 扩展优化
字段校验确保前端传递的 field 在 data 中存在对应值。大数据量分页如果数据量过大可分页查询后分批写入。自定义样式通过 WriteHandler 动态设置单元格样式如字体、颜色。 通过这种方式无需定义实体类即可实现完全动态的 Excel 导出功能表头和字段完全由前端控制。