动态表头导出EasyExcel

打印 上一主题 下一主题

主题 901|帖子 901|积分 2703

在 Spring Boot 中联合 EasyExcel 实现动态表头导出(无实体类,表头和字段(前端传表名,字段值动态查询,返回List<Map<String,Object>>)由前端传递)可以通过以下步骤实现。以下是完整示例:

1. 前端请求数据结构

假设前端传递的 JSON 格式如下:
  1. {
  2.   "headers": [
  3.     {"title": "姓名", "field": "name"},
  4.     {"title": "年龄", "field": "age"},
  5.     {"title": "城市", "field": "city"}
  6.   ],
  7.   "data": [
  8.     {"name": "张三", "age": 25, "city": "北京"},
  9.     {"name": "李四", "age": 30, "city": "上海"}
  10.   ]
  11. }
复制代码

2. 后端 DTO 界说

界说吸收参数的 DTO 类:
  1. @Data
  2. public class ExportRequest {
  3.     private List<Header> headers;
  4.     private List<Map<String, Object>> data;
  5.     @Data
  6.     public static class Header {
  7.         private String title;  // 表头名称
  8.         private String field;  // 数据字段名
  9.     }
  10. }
复制代码

3. Controller 层接口

处置惩罚导出请求:
  1. @RestController
  2. public class ExportController {
  3.     @Autowired
  4.     private ExportService exportService;
  5.     @PostMapping("/export")
  6.     public void exportExcel(@RequestBody ExportRequest request, HttpServletResponse response) {
  7.         exportService.export(request, response);
  8.     }
  9. }
复制代码

4. Service 层实现

焦点导出逻辑:
  1. @Service
  2. public class ExportService {
  3.     public void export(ExportRequest request, HttpServletResponse response) {
  4.         try {
  5.             // 设置响应头
  6.             response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
  7.             response.setCharacterEncoding("UTF-8");
  8.             String fileName = URLEncoder.encode("动态导出.xlsx", "UTF-8");
  9.             response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
  10.             // 获取输出流
  11.             OutputStream outputStream = response.getOutputStream();
  12.             // 动态构建表头和数据
  13.             WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build();
  14.             ExcelWriter excelWriter = EasyExcel.write(outputStream).build();
  15.             // 动态添加表头
  16.             WriteTable writeTable = new WriteTable();
  17.             List<List<String>> head = buildHead(request.getHeaders());
  18.             writeTable.setHead(head);
  19.             // 动态填充数据
  20.             List<List<Object>> data = buildData(request.getHeaders(), request.getData());
  21.             excelWriter.write(data, writeSheet, writeTable);
  22.             // 关闭流
  23.             excelWriter.finish();
  24.             outputStream.flush();
  25.         } catch (IOException e) {
  26.             throw new RuntimeException("导出失败", e);
  27.         }
  28.     }
  29.     // 构建表头
  30.     private List<List<String>> buildHead(List<ExportRequest.Header> headers) {
  31.         List<List<String>> head = new ArrayList<>();
  32.         for (ExportRequest.Header header : headers) {
  33.             List<String> columnHead = Collections.singletonList(header.getTitle());
  34.             head.add(columnHead);
  35.         }
  36.         return head;
  37.     }
  38.     // 构建数据行
  39.     private List<List<Object>> buildData(List<ExportRequest.Header> headers, List<Map<String, Object>> dataList) {
  40.         List<List<Object>> data = new ArrayList<>();
  41.         for (Map<String, Object> rowData : dataList) {
  42.             List<Object> row = new ArrayList<>();
  43.             for (ExportRequest.Header header : headers) {
  44.                 row.add(rowData.get(header.getField()));
  45.             }
  46.             data.add(row);
  47.         }
  48.         return data;
  49.     }
  50. }
复制代码

5. 关键点说明


  • 动态表头

    • 通过 buildHead() 方法将前端传递的 headers 转换为 EasyExcel 必要的 List<List<String>> 格式。

  • 动态数据

    • 通过 buildData() 方法,根据 headers 中界说的 field 字段次序,从 data 中提取对应值,构建数据行。

  • 流式导出

    • 使用 ExcelWriter 直接操作输出流,制止内存溢出(得当大数据量)。


6. 测试与验证

使用 Postman 发送请求:


  • URL: POST http://localhost:8080/export
  • Body(JSON):
    1. {
    2.   "headers": [
    3.     {"title": "姓名", "field": "name"},
    4.     {"title": "年龄", "field": "age"},
    5.     {"title": "城市", "field": "city"}
    6.   ],
    7.   "data": [
    8.     {"name": "张三", "age": 25, "city": "北京"},
    9.     {"name": "李四", "age": 30, "city": "上海"}
    10.   ]
    11. }
    复制代码
  • 响应:浏览器自动下载 动态导出.xlsx,内容如下:
       姓名年龄城市张三25北京李四30上海

7. 扩展优化



  • 字段校验:确保前端传递的 field 在 data 中存在对应值。
  • 大数据量分页:如果数据量过大,可分页查询后分批写入。
  • 自界说样式:通过 WriteHandler 动态设置单元格样式(如字体、颜色)。

通过这种方式,无需界说实体类即可实现完全动态的 Excel 导出功能,表头和字段完全由前端控制。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

傲渊山岳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表