精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

震撼!我用 Spring Boot 封裝了一個通殺全場的 Excel 導出神器,任何數(shù)據(jù)一鍵搞定!

開發(fā) 前端
前陣子,組里一位同事小王又被這問題折磨得抓耳撓腮:“有沒有那種不用寫注解、隨便傳數(shù)據(jù)都能導出的 Excel 工具?。课疫@邊二十張表,全長得不一樣?!? 聽完我直接笑出聲 —— 誰還沒被這種需求折磨過?

在企業(yè)開發(fā)中,“導出 Excel” 一直是個繞不過去的痛點。 每次換個表結(jié)構(gòu)、改個字段名,就得新建 DTO、調(diào)整注解、修模板、測樣式——不僅繁瑣,還極易出錯。

前陣子,組里一位同事小王又被這問題折磨得抓耳撓腮:“有沒有那種不用寫注解、隨便傳數(shù)據(jù)都能導出的 Excel 工具啊?我這邊二十張表,全長得不一樣?!?nbsp;聽完我直接笑出聲 —— 誰還沒被這種需求折磨過?于是我干脆擼了個“通用型 Excel 導出神器”,能自動識別數(shù)據(jù)結(jié)構(gòu)、自動生成表頭、自動輸出 Excel, 無論你傳的是 List<Object> 還是 List<Map>,都能輕松搞定,一次封裝,全場通殺。

設(shè)計思路

核心思想其實非常樸素: 通過反射分析傳入對象的字段結(jié)構(gòu),用 EasyExcel(或 Apache POI)寫出 Excel 文件。 關(guān)鍵點在于“自動推斷表頭”,也就是說,不用再寫注解或者 DTO,工具會自動識別字段名并生成 Excel 頭部。

  • 如果傳入的是 List<User>:反射獲取字段名(如 idnameage);
  • 如果傳入的是 List<Map>:以第一條記錄的 key 作為表頭。

思路清晰明了,下面直接看代碼。

工具類實現(xiàn)

文件路徑:

/src/main/java/com/icoderoad/excel/util/ExcelExportUtil.java

代碼如下 :

package com.icoderoad.excel.util;


import com.alibaba.excel.EasyExcel;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;


import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.util.*;


/**
 * 通用 Excel 導出工具類
 * 支持 List<Object> 與 List<Map> 數(shù)據(jù)格式
 */
public class ExcelExportUtil {


    /**
     * 通用導出方法
     * @param response 響應(yīng)對象
     * @param data 導出數(shù)據(jù)
     * @param fileName 導出文件名
     */
    public static <T> void export(HttpServletResponse response, List<T> data, String fileName) throws IOException {
        if (data == null || data.isEmpty()) {
            throw new IllegalArgumentException("導出數(shù)據(jù)不能為空");
        }


        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
        response.setCharacterEncoding("utf-8");
        response.setHeader(HttpHeaders.CONTENT_DISPOSITION,
                "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");


        // 判斷類型:Map 或 普通對象
        if (data.get(0) instanceof Map) {
            writeMapData(response, (List<Map<String, Object>>) data);
        } else {
            writeObjectData(response, data);
        }
    }


    /** 處理 List<Map> 數(shù)據(jù)導出 */
    private static void writeMapData(HttpServletResponse response, List<Map<String, Object>> list) throws IOException {
        List<List<String>> head = new ArrayList<>();
        List<List<Object>> rows = new ArrayList<>();


        Set<String> headers = list.get(0).keySet();
        headers.forEach(k -> head.add(Collections.singletonList(k)));


        for (Map<String, Object> row : list) {
            List<Object> line = new ArrayList<>();
            for (String k : headers) {
                line.add(row.getOrDefault(k, ""));
            }
            rows.add(line);
        }


        EasyExcel.write(response.getOutputStream())
                .head(head)
                .sheet("Sheet1")
                .doWrite(rows);
    }


    /** 處理 List<Object> 數(shù)據(jù)導出 */
    private static <T> void writeObjectData(HttpServletResponse response, List<T> list) throws IOException {
        Class<?> clazz = list.get(0).getClass();
        List<List<String>> head = new ArrayList<>();
        List<Field> fields = Arrays.asList(clazz.getDeclaredFields());
        fields.forEach(f -> head.add(Collections.singletonList(f.getName())));


        List<List<Object>> rows = new ArrayList<>();
        for (T t : list) {
            List<Object> row = new ArrayList<>();
            for (Field f : fields) {
                f.setAccessible(true);
                try {
                    row.add(Optional.ofNullable(f.get(t)).orElse(""));
                } catch (IllegalAccessException e) {
                    row.add("");
                }
            }
            rows.add(row);
        }


        EasyExcel.write(response.getOutputStream())
                .head(head)
                .sheet("Sheet1")
                .doWrite(rows);
    }
}

實體類與 Controller 示例

路徑:

/src/main/java/com/icoderoad/excel/controller/ExportController.java
package com.icoderoad.excel.controller;


import com.icoderoad.excel.util.ExcelExportUtil;
import lombok.Data;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;


import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;


/**
 * Excel 導出控制器
 */
@RestController
public class ExportController {


    @Data
    public static class User {
        private Long id;
        private String name;
        private Integer age;


        public User(Long id, String name, Integer age) {
            this.id = id;
            this.name = name;
            this.age = age;
        }
    }


    /** 示例1:導出固定結(jié)構(gòu)對象 */
    @GetMapping("/export")
    public void export(HttpServletResponse response) throws IOException {
        List<User> users = Arrays.asList(
                new User(1L, "張三", 20),
                new User(2L, "李四", 25)
        );
        ExcelExportUtil.export(response, users, "用戶信息");
    }


    /** 示例2:導出動態(tài)結(jié)構(gòu) Map 數(shù)據(jù) */
    @GetMapping("/exportDynamic")
    public void exportDynamic(HttpServletResponse response) throws IOException {
        List<Map<String, Object>> list = new ArrayList<>();


        Map<String, Object> row1 = new LinkedHashMap<>();
        row1.put("姓名", "小王");
        row1.put("部門", "研發(fā)部");
        row1.put("薪資", 18000);
        list.add(row1);


        Map<String, Object> row2 = new LinkedHashMap<>();
        row2.put("姓名", "小李");
        row2.put("部門", "測試部");
        row2.put("薪資", 15000);
        list.add(row2);


        ExcelExportUtil.export(response, list, "員工薪資表");
    }
}

細節(jié)與擴展優(yōu)化

在后續(xù)使用中,我還為這個工具做了幾處增強優(yōu)化:

  1. 字段排序控制 可以通過注解(如 `@ExcelColumn(order = 1))控制導出列順序。
  2. 日期格式化 對于 Date 類型字段,默認格式化為 yyyy-MM-dd HH:mm:ss,避免直接輸出時間戳。
  3. 空值處理 自動將 null 轉(zhuǎn)為空字符串,防止出現(xiàn) NPE 異常。
  4. 中文表頭映射 支持自定義表頭注解,如 @ExcelColumn("用戶名"),導出時自動映射成中文列名。
  5. 緩存字段定義 當導出超大數(shù)據(jù)量時,可緩存字段元數(shù)據(jù)結(jié)構(gòu),減少反射次數(shù),提高性能。

總結(jié)

這套導出工具目前已經(jīng)在多個項目中穩(wěn)定運行,支持幾乎所有常見導出場景。 無論是動態(tài)結(jié)構(gòu)的前端數(shù)據(jù),還是固定結(jié)構(gòu)的 Java Bean,只要傳入 List,都能一鍵生成 Excel。

更重要的是:

不用再維護 DTO、注解、模板,告別字段對不上、列順序亂、手工測試累的問題。

如果你也經(jīng)常被導出 Excel 折騰,不妨嘗試這樣的通用思路。簡單、穩(wěn)健、可維護——這才是工程化實踐的真正魅力。

責任編輯:武曉燕 來源: 路條編程
相關(guān)推薦

2025-02-17 07:48:45

2025-04-08 01:00:00

Spring開發(fā)系統(tǒng)

2025-09-26 02:00:00

Spring接口開發(fā)

2021-04-23 10:38:52

Spring BootSpringMVC源碼

2022-06-06 08:42:04

spring-boo開發(fā)接口防盜刷

2025-03-26 00:35:00

Javaweb開發(fā)

2020-03-31 15:03:56

Spring Boot代碼Java

2025-04-17 04:00:00

2025-03-28 07:56:39

Spring服務(wù)配置

2022-06-23 08:42:08

配置加密解密

2024-06-17 10:30:38

運維IP地址網(wǎng)絡(luò)

2020-09-27 14:13:50

Spring BootJava框架

2021-04-20 23:44:25

Excel工具Java

2023-04-12 16:16:53

微軟開源

2020-08-25 20:10:53

GitHub代碼開發(fā)者

2015-10-09 15:18:24

2020-06-22 07:55:28

接口爬蟲

2022-05-26 10:42:30

數(shù)據(jù)權(quán)限注解

2019-10-11 11:00:53

Nginx神器前端

2020-03-16 17:20:02

異常處理Spring Boot
點贊
收藏

51CTO技術(shù)棧公眾號

男插女视频久久久| aaa级黄色片| 久久99蜜桃| 在线国产亚洲欧美| 中文字幕av日韩精品| 国内精品国产成人国产三级| 亚洲小说区图片区| 亚洲三级 欧美三级| 天堂av在线8| 超碰在线公开| 国产精品区一区二区三| 147欧美人体大胆444| 国产手机在线视频| 97精品97| 亚洲精品美女在线观看播放| 国产精品人人爽人人爽| 久久五月精品中文字幕| 国产视频在线观看一区二区三区 | 人妻少妇无码精品视频区| 欧美男男gaygay1069| 成人激情视频| 在线视频综合导航| 91动漫在线看| 91社区在线观看播放| 国产精品一区2区| 国产精品91久久久| 久久久香蕉视频| 欧美国产小视频| 日韩福利视频在线观看| 手机看片国产精品| 日本精品在线中文字幕| 亚洲国产日韩av| 天天操天天干天天玩| 国产综合在线观看| jizz一区二区| 亚洲已满18点击进入在线看片 | 欧美孕妇性xxxⅹ精品hd| 韩国v欧美v亚洲v日本v| 国产精品福利观看| 国产成人自拍视频在线| 欧美另类专区| 久久久国产一区二区三区| 韩国三级hd中文字幕| 加勒比久久高清| 日韩美女天天操| 亚洲一区二区三区四区精品| 日韩欧美一区二区三区在线观看| 亚洲第一福利一区| 欧美一级爱爱视频| 中国av在线播放| 亚洲视频 欧洲视频| 亚洲欧洲日韩精品| 香蕉视频网站在线观看| 欧美国产日韩在线观看| 日本视频一区在线观看| 少妇激情av一区二区| 成人免费看黄yyy456| 91亚洲精品丁香在线观看| 一级做a爱片久久毛片| 日本免费在线视频不卡一不卡二| 国产99久久久欧美黑人| 天干夜夜爽爽日日日日| 美女久久一区| 日韩av片免费在线观看| 91午夜精品亚洲一区二区三区| 99精品视频网| 欧美专区在线视频| 99精品人妻国产毛片| 男人的天堂成人在线| 日本高清不卡在线| 国产成人自拍偷拍| 奇米一区二区三区av| 成人网在线视频| 国产青青草视频| 国产91丝袜在线播放0| 99久热re在线精品视频| 欧美一区二区三区激情| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 黄色免费在线看| 亚洲免费资源在线播放| a级免费在线观看| 日本在线高清| 欧洲国内综合视频| 特级黄色片视频| xxxx日韩| 国产亚洲欧洲在线| 日韩av手机在线免费观看| 午夜天堂精品久久久久| 国模精品一区二区三区色天香| 欧美三级一区二区三区| 日韩和欧美的一区| 亚洲一区二区三区乱码aⅴ蜜桃女| 超碰在线人人干| 26uuu精品一区二区三区四区在线| 日本一区二区精品| а√中文在线8| 精品久久久久久亚洲国产300| 青青草原av在线播放| 日韩精品第二页| 亚洲成人精品久久| 免费在线观看a视频| 最新欧美人z0oozo0| 日本精品中文字幕| 99国产揄拍国产精品| 99国产精品久久久久久久久久| 亚洲精品成人自拍| a级片在线免费| 欧美午夜影院一区| 精品无码国产一区二区三区51安| 精品久久91| 欧美激情aaaa| 一区二区久久精品66国产精品| 成人国产精品免费| 一区二区国产日产| av资源亚洲| 精品国产一区久久| av最新在线观看| 免费在线观看成人av| 99久久99久久精品国产片| 国产精品免费播放| 天天综合色天天综合色h| 久久久久久久高清| 精品国产中文字幕第一页| 久久久亚洲影院你懂的| 国产精品久久久久久69| 久久久精品天堂| 国产美女在线一区| 成人激情久久| 国产一区二区三区毛片| 91久久国产视频| 国产一区二区看久久| 日韩亚洲视频在线| 成人性教育av免费网址| 亚洲国产精品va在线观看黑人| 91视频青青草| 久久99这里只有精品| 日韩国产伦理| 中文字幕乱码在线播放| 亚洲精品99久久久久| 国产波霸爆乳一区二区| 美女视频黄 久久| 欧美一二三四五区| 亚洲最大网站| 亚洲国产天堂网精品网站| 精品视频久久久久| 成人少妇影院yyyy| av一区二区三区免费观看| 视频精品一区| 九九久久久久99精品| 国产高清视频免费| 亚洲免费成人av| 想看黄色一级片| 色喇叭免费久久综合| 国产美女精品视频| 黄色av网站在线播放| 911国产精品| 91精品国产闺蜜国产在线闺蜜| 美女精品自拍一二三四| 午夜免费电影一区在线观看| 本网站久久精品| 亚洲欧美日韩网| 国产偷人爽久久久久久老妇app| 久久久久久一二三区| 国产精品99久久免费黑人人妻| 天天躁日日躁狠狠躁欧美巨大小说 | 亚洲观看黄色网| 国产精品美女久久久| 欧美极品色图| 亚洲不卡系列| 色av中文字幕一区| av男人天堂av| 亚洲午夜久久久久中文字幕久| 一级黄色片毛片| 亚洲综合欧美| 色噜噜狠狠一区二区三区| 精品女同一区二区三区在线观看| 北条麻妃久久精品| 精品区在线观看| 婷婷开心激情综合| 五月天综合视频| 美女一区二区三区| 欧美国产视频一区| 国产精品一线天粉嫩av| 91精品久久久久久久久久久久久| 9191在线播放| 日韩精品在线观看视频| 97人妻精品视频一区| 亚洲啪啪综合av一区二区三区| 国产精品无码自拍| 男人的天堂亚洲在线| 中国人体摄影一区二区三区| 88久久精品| 日韩av观看网址| av小次郎在线| 亚洲精选一区二区| 国产男男gay体育生网站| 亚洲成人精品一区| 免费一级特黄3大片视频| 国产寡妇亲子伦一区二区| 久久精品国产精品亚洲色婷婷| 日韩精品免费一区二区三区| 国产精品露出视频| 成人国产精品入口免费视频| 久久久久久久久久久国产| 国产免费av高清在线| 日韩精品一区二| 中文字幕免费高清网站| 一区二区三区免费网站| 国产传媒国产传媒| 成人福利在线看| 国产欧美一区二| 午夜在线视频观看日韩17c| 黄色一级片网址| 久久99性xxx老妇胖精品| 99re6在线| 免费污视频在线一区| 国内精品视频一区| 黄色网址在线免费观看| 国产亚洲成精品久久| 天天操天天干天天插| 日韩精品专区在线影院观看| 特级西西444www高清大视频| 午夜亚洲国产au精品一区二区| 国产一二三区精品| 国产精品欧美久久久久一区二区 | 一区二区三区国产好| 国产精选久久久久久| 伊人久久国产| 久久男人av资源网站| 91麻豆免费在线视频| www.午夜精品| 3p在线观看| 中文字幕日韩欧美在线| 日色在线视频| 亚洲国产欧美自拍| 欧美综合视频在线| 日韩精品一区二区三区中文精品| 91精品在线视频观看| 色94色欧美sute亚洲线路二| 亚洲一区欧美在线| 亚洲成精国产精品女| 免费人成年激情视频在线观看| 中文字幕一区二区三区乱码在线| 免费一级做a爰片久久毛片潮| 99综合电影在线视频| 黑森林av导航| 成人综合在线网站| 无码人妻精品一区二区三区99不卡| 狠狠色丁香久久婷婷综| 一级黄色录像在线观看| 免费在线看成人av| 污污动漫在线观看| 蜜桃av一区二区三区| 亚洲欧洲日本精品| 久久精品国内一区二区三区 | 国产一区二区日韩精品| 国产不卡的av| 国产不卡视频在线观看| 99国产精品免费视频| 国产传媒久久文化传媒| 色哟哟网站在线观看| hitomi一区二区三区精品| 中文在线永久免费观看| 久久一区二区视频| 一区二区精品免费| 欧美国产欧美亚州国产日韩mv天天看完整 | youjizz.com亚洲| 在线中文字幕亚洲| 超碰成人免费在线| 麻豆精品网站| 天天影视综合色| 精品一区二区综合| 免费在线观看日韩av| 91麻豆精品在线观看| 老头老太做爰xxx视频| 国产精品盗摄一区二区三区| 免费国产羞羞网站美图| 午夜精品123| av首页在线观看| 91精品国产综合久久香蕉的特点| 国产免费高清av| 亚洲精品狠狠操| av在线之家电影网站| 久久夜色精品国产亚洲aⅴ| 久久不射影院| 国产aⅴ夜夜欢一区二区三区| 欧美videos粗暴| 国产精品一区二区三区不卡| 九九综合久久| 男人的天堂成人| 午夜一级久久| 伦伦影院午夜理论片| 99精品视频中文字幕| 成人免费视频入口| 亚洲va国产天堂va久久en| 中文字幕视频免费观看| 欧美成人官网二区| 国产天堂在线| 色综合老司机第九色激情| 欧美国产大片| 国产精品久久久久av福利动漫| 精品视频免费| 精品成在人线av无码免费看| 日一区二区三区| 中文字幕乱视频| 国产精品天美传媒| www.国产成人| 日韩小视频在线观看专区| 色综合888| 色在人av网站天堂精品| 国产精品66| 免费h精品视频在线播放| 综合天堂av久久久久久久| 日本成人在线免费视频| 成人av网站在线| 日本a级片视频| 欧美亚洲愉拍一区二区| 四虎国产精品永远| 欧美激情欧美狂野欧美精品 | 激情欧美一区| 女人高潮一级片| 亚洲国产精品v| 亚洲GV成人无码久久精品| 精品成人一区二区三区四区| 国精产品一区| 国产精品美女在线| 国产一区二区三区不卡视频网站| 国产精品一色哟哟| 国产精品白丝jk黑袜喷水| 日韩欧美视频免费观看| 色综合久久66| 欧美成熟毛茸茸| 欧美一区第一页| 亚州一区二区| 久久久天堂国产精品| 韩国视频一区二区| 国精品人伦一区二区三区蜜桃| 欧美在线一区二区三区| 美丽的姑娘在线观看免费动漫| 5566日本婷婷色中文字幕97| 北条麻妃一区二区三区在线观看| 伊人网在线免费| 国产在线不卡一卡二卡三卡四卡| 欧美日韩生活片| 欧美日韩在线亚洲一区蜜芽| av网站在线免费观看| 国产精品久久久久久网站| 欧美日韩黑人| 亚洲免费看av| 国产精品美女久久久久久| 中文字幕一区二区三区四区视频| 亚洲无亚洲人成网站77777| 三级成人在线| 亚洲成人a**址| 久久99这里只有精品| 粉嫩av性色av蜜臀av网站| 日韩一区二区高清| 久久国产精品黑丝| 久久精品国产一区二区三区不卡| 国产欧美日韩综合一区在线播放| 中文字字幕码一二三区| 色综合天天综合在线视频| 成人免费高清在线播放| 国产在线精品一区免费香蕉| 亚洲综合专区| www.四虎在线| 欧美日韩国产中文精品字幕自在自线| 视频在线观看你懂的| 国产精品第100页| 97精品一区二区| 日韩久久久久久久久久久| 亚洲图片有声小说| 青青青手机在线视频观看| 国产精品亚洲美女av网站| 亚洲v在线看| 黄色污在线观看| 在线免费观看成人短视频| 日本在线观看www| 99在线影院| 久久激情久久| 久久99久久99精品免费看小说| 日韩一区二区免费视频| 亚洲插插视频| 一本一道久久久a久久久精品91| 国产大陆精品国产| 极品国产91在线网站| 精品国产拍在线观看| 高清日韩欧美| 一区二区三区网址| 一区二区三区四区在线播放| 色资源在线观看| 成人激情视频免费在线| 亚洲精品四区| 人与动物性xxxx| 亚洲国产精品成人一区二区| 成人国产一区| 拔插拔插海外华人免费| 中文字幕不卡三区| 天天摸天天干天天操| 国产欧美日韩综合精品|