精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

免费看特级毛片| 亚洲久久中文字幕| 国产视频三级在线观看播放| 日韩国产欧美在线播放| 色哟哟网站入口亚洲精品| 国产传媒免费观看| 九色porny丨首页入口在线| 国产欧美精品一区二区色综合| 91精品视频一区| 日韩精品一区二区不卡| 日本不卡二三区| 精品久久久久av影院| 亚洲精品中文字幕无码蜜桃| 69xxx在线| 久久这里只有精品首页| 亚洲自拍中文字幕| 久久国产乱子伦精品| 99精品综合| 日韩电影免费在线观看中文字幕| 国产无色aaa| 超碰aⅴ人人做人人爽欧美| 日韩理论片在线| 欧美日韩国产三区| 亚洲精品97久久中文字幕| 日本午夜精品视频在线观看 | 国产一区二区无遮挡| 又污又黄的网站| 国产一区二区三区久久久久久久久| www.国产一区| 欧美黄色一级生活片| 久久中文资源| 日韩女优av电影| 国产原创精品在线| 超碰一区二区| 欧美日韩国产综合新一区| 天堂а√在线中文在线| 日韩精品黄色| 日本一区二区视频在线观看| 久久青青草原一区二区| 秋霞网一区二区| 国产激情偷乱视频一区二区三区| 国产精品爽爽爽爽爽爽在线观看| 天堂中文在线网| 99香蕉国产精品偷在线观看 | 免费看av不卡| 天天影视网天天综合色在线播放| 成年人深夜视频| 一二三四区在线观看| 亚洲欧洲国产日本综合| 亚洲一区二区三区四区中文| av国产在线观看| 国产欧美日产一区| 天天综合色天天综合色hd| 酒色婷婷桃色成人免费av网| 91麻豆精品秘密| 久久青青草综合| 欧美777四色影视在线| www国产精品av| 欧美高清视频一区二区三区在线观看| 日韩a在线看| 91麻豆精品在线观看| 欧美久久久久久久| 国产一二三在线观看| 国产亚洲一本大道中文在线| 欧美一区免费视频| 999在线视频| 亚洲欧洲精品成人久久奇米网| 强开小嫩苞一区二区三区网站 | 成人在线免费视频观看| 日韩在线视频免费观看| 欧美激情精品久久久久久免费| 999国产精品999久久久久久| 久久精品国产久精国产思思| 青青草原国产视频| 99热精品在线| 国产精品久久网| av中文字幕在线免费观看| 国产成人一级电影| 国产在线精品一区| 福利在线午夜| 亚洲欧美另类久久久精品| av片在线免费| 亚洲精品mv| 欧美日韩成人一区二区| 亚洲女人在线观看| 欧美交a欧美精品喷水| 一区二区三区国产视频| 免费在线黄色网| 国产精品人人爽人人做我的可爱| 国产精品久久久久久久app| 国产三级第一页| 91麻豆蜜桃一区二区三区| 亚洲乱码一区二区三区三上悠亚| h视频在线免费观看| 欧美日韩另类视频| 在线免费视频一区| 欧美日韩直播| 精品国偷自产在线视频99| 欧美一级视频免费观看| 麻豆精品在线观看| 国产免费一区| 日本综合在线| 欧美性色视频在线| 亚洲视频在线不卡| jiujiure精品视频播放| 久久久久久久999| 亚洲天堂中文网| 99在线视频精品| 日本xxx免费| 久久人体大尺度| 精品国产乱码久久久久久浪潮| 91资源在线播放| 99视频精品免费观看| 亚洲综合色激情五月| 国产午夜在线观看| 午夜a成v人精品| 国产资源中文字幕| 青青草国产成人a∨下载安卓| 91精品国产91久久久久久不卡| 一二三四区视频| 久久久久久久免费视频了| 久久www视频| 色噜噜成人av在线| 国产亚洲一级高清| 国产成人无码一区二区在线播放| 高清久久久久久| 色呦呦网站入口| 久久免费资源| 国产一区二区精品丝袜| www.久久精品视频| 久久综合久久久久88| 色欲色香天天天综合网www| 麻豆国产一区二区三区四区| 最近中文字幕日韩精品| 探花国产精品一区二区| 国产视频一区在线观看| 国产精品后入内射日本在线观看| 97久久精品| 欧美大片免费观看| 国产v在线观看| 亚洲乱码国产乱码精品精98午夜| 羞羞的视频在线| 欧美视频一区在线| 青青草久久伊人| 精品日本12videosex| 欧美在线不卡区| 亚洲三级黄色片| 精品国产户外野外| 五月婷婷综合在线观看| 国产精品一区亚洲| 欧美日韩亚洲在线| 奇米777日韩| 亚洲色图狂野欧美| 日韩国产成人在线| 国产精品久久久久一区| 五月天av在线播放| 91精品秘密在线观看| 亚洲一区二区少妇| 色a资源在线| 亚洲国产欧美一区二区三区久久| 日韩精品久久久久久久| 99麻豆久久久国产精品免费优播| 1024av视频| 国产精品亚洲二区| 国产主播喷水一区二区| 五月天激情在线| 日韩av一区二区在线观看| 免费看毛片网站| 国产精品网曝门| 青青草精品在线| 亚洲经典视频在线观看| 欧美久久在线| 亚洲毛片在线免费| 久久久久国产精品一区| 日韩大胆视频| 欧美精品久久一区| 九九九国产视频| 久久久青草青青国产亚洲免观| 日本成人中文字幕在线| 2023国产精品久久久精品双 | 亚洲精品一区二区三区在线| 午夜免费在线观看精品视频| 噜噜噜在线观看播放视频| 欧美日韩一区视频| 久久久99精品| 国产喂奶挤奶一区二区三区| 免费观看黄网站| 久久国产高清| 小说区视频区图片区| 国产精品一区二区中文字幕| 国产精品久久久久aaaa九色| 影音先锋男人资源在线| 国产亚洲视频在线| 亚洲精品无amm毛片| 日本韩国欧美一区二区三区| 久久国产精品国语对白| 久久综合九色综合97婷婷| 最新av免费在线观看| 国产欧美在线| 精品无码av无码免费专区| 国产一区二区观看| 国产成人女人毛片视频在线| 成人黄色图片网站| 4p变态网欧美系列| 色呦呦在线资源| 丝袜一区二区三区| 青青久在线视频免费观看| 日韩一区二区在线观看| 亚洲大片免费观看| 亚洲成人资源网| 日韩av手机在线免费观看| 久久久久久**毛片大全| 97中文字幕在线观看| 久久精品国产网站| 亚洲一二三区av| 亚洲人www| 欧美国产综合在线| 国产韩日影视精品| 日韩资源av在线| 国产日韩三级| 成人性生交xxxxx网站| 欧美成人ⅴideosxxxxx| 97在线日本国产| 欧美hdxxxx| 蜜月aⅴ免费一区二区三区| 国产精品一区在线看| 日韩精品亚洲元码| 欧美视频一二区| 欧美大片一区二区三区| 国产农村妇女毛片精品久久| 欧美性色欧美a在线播放| 久久国产视频一区| 午夜伦欧美伦电影理论片| 久久久久久国产精品免费播放| 国产精品久久二区二区| 国产精品美女高潮无套| 久久久精品综合| 欧美特级黄色录像| www.在线成人| 少妇被狂c下部羞羞漫画| 国产91色综合久久免费分享| 国产又粗又猛大又黄又爽| 国内久久精品视频| 99精品999| 国内精品久久久久影院色| www,av在线| 国产一区二区精品久久99| 手机看片国产精品| 国产经典欧美精品| 久久久久亚洲AV成人网人人小说| 成人网在线免费视频| 稀缺小u女呦精品呦| 波多野结衣视频一区| 中文成人无字幕乱码精品区| jizz一区二区| 欧美性xxxx图片| 欧美激情资源网| 久久av红桃一区二区禁漫| 亚洲欧美电影一区二区| 国产亚洲自拍av| 五月激情六月综合| 国产伦精品一区二区三区视频网站| 好吊成人免视频| 波多野结衣一二区| 欧美精品 日韩| 精品人妻一区二区三区三区四区 | 国产黄大片在线观看画质优化| 久久亚洲国产成人| 麻豆福利在线观看| 欧美一级大胆视频| 成人高清一区| 99精品国产一区二区| 日韩有码一区| 丝袜足脚交91精品| 先锋资源久久| 日本中文字幕网址| 日本伊人色综合网| 国产人妻精品午夜福利免费| 972aa.com艺术欧美| 中文字幕黄色网址| 一区二区三区四区在线免费观看| 国产 欧美 日韩 在线| 欧美三级三级三级| 动漫av一区二区三区| 亚洲色图偷窥自拍| 青青草原av在线| 国产va免费精品高清在线观看| 99国内精品久久久久| 国产伦精品一区二区三区四区视频 | 欧美xxx黑人xxx水蜜桃| 26uuu久久噜噜噜噜| 国产精品日韩精品在线播放| 精品一区二区久久久久久久网站| 奇米影视亚洲| 日本中文字幕网址| 国产呦萝稀缺另类资源| 免费成人深夜夜行p站| 中文字幕日韩一区| 免费看毛片网站| 欧美成人r级一区二区三区| eeuss影院www在线播放| 久久久久在线观看| 亚洲综合资源| 欧美精品中文字幕一区二区| 黄色成人在线网站| 亚洲激情在线看| 久久久久国产成人精品亚洲午夜| 激情综合网五月天| 欧美日韩国产美| 免费人成在线观看网站| 欧美大秀在线观看| 成人乱码手机视频| 亚洲不卡一卡2卡三卡4卡5卡精品| 综合久久亚洲| 在线观看免费污视频| 91丨porny丨首页| 久久精品视频日本| 日韩午夜电影av| 色开心亚洲综合| 国产精品99久久久久久人| 女同另类激情重口| 妞干网视频在线观看| 经典一区二区三区| 欧美性生给视频| 欧美性生活影院| 成人av毛片| 国产成人精品久久二区二区| 日韩理论电影中文字幕| 野外做受又硬又粗又大视频√| 激情小说亚洲一区| 天堂网中文在线观看| 欧美色窝79yyyycom| 久草在线青青草| 欧美一级片久久久久久久| 久久超级碰碰| 精品国产一区三区| 99久久精品国产毛片| 国产无遮挡免费视频| 精品国产欧美一区二区| 日韩伦理电影网站| 成人欧美一区二区三区视频xxx| 欧美在线91| 亚洲国产日韩在线一区| 亚洲天堂精品在线观看| 97精品人妻一区二区三区在线 | 国产亚洲欧美一区二区| 欧美日本国产| 国产精久久久久| 亚洲一区中文在线| 欧美一区二区三区黄片| 97国产精品免费视频| 亚洲福利网站| 天堂社区在线视频| 国产精品久久久久久一区二区三区| 最近中文字幕在线免费观看| 中文字幕亚洲专区| 91成人在线网站| 黄色a级片免费看| 99久久国产综合精品女不卡| 国产毛片aaa| 伊人久久久久久久久久久久久| 亚洲综合av一区二区三区| 自拍偷拍亚洲色图欧美| 国产麻豆精品久久一二三| 免费视频一二三区| 亚洲成人黄色网| 日本综合久久| 黄色一级片网址| 成人网在线播放| 香蕉污视频在线观看| 日韩色av导航| 91精品久久久久久综合五月天| 国产黄色一级网站| 国产精品久线在线观看| 性欧美videos另类hd| 日韩美女中文字幕| 91精品国产91久久久久久密臀 | 午夜精品久久久内射近拍高清| 国产欧美日韩三级| www.看毛片| 国产精彩精品视频| 亚洲国产精品久久久天堂| 亚洲av成人片色在线观看高潮 | 欧美综合另类| 伊人影院在线观看视频| 一本一本大道香蕉久在线精品| 日韩黄色影院| 精品一区在线播放| 国产在线国偷精品产拍免费yy| 全部毛片永久免费看| 久久精品一区中文字幕| 欧美调教网站| 成年人网站av| 色综合久久中文综合久久97 | 色综合蜜月久久综合网| 亚洲最大视频网| 欧美色视频在线| 交100部在线观看| 一区二区三区国产福利| 26uuu国产日韩综合|