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

太強了!Spring Boot 3.3 一個接口就能搞定 Excel 導入導出所有表!

開發 前端
如果你正在開發一個后臺系統、BI平臺或需要支持可配置表單數據導入導出功能的系統,這種通用設計無疑能大大提升系統的靈活性和擴展性。

在日常的企業系統或后臺管理系統中,數據的 Excel 導入導出是非常常見的需求。傳統方式通常是:

  • 每張表都寫一個專門的導入導出方法;
  • 每張表都建立一個 Java Bean 類,硬編碼字段;
  • 新增或修改表結構時需要修改大量代碼。

這些方式帶來的問題有:代碼重復多、維護成本高、靈活性差

因此,本文基于 Spring Boot 3.3 + EasyExcel 實現一個 "支持任意表結構、無需綁定實體類、異步處理大文件導入" 的通用 Excel 導入導出功能。

技術選型與優勢

技術

用途

Spring Boot 3.3

構建 RESTful Web 項目

EasyExcel

快速讀取/寫入 Excel 文件

JdbcTemplate

動態操作任意表結構

ThreadPool

支持異步導入,釋放主線程

數據庫準備(支持任意表結構)

-- 用戶表
CREATETABLEuser(
  id BIGINTPRIMARYKEYAUTO_INCREMENT,
  name VARCHAR(100),
  phone VARCHAR(50),
  id_card VARCHAR(50),
  created_at DATETIMEDEFAULTCURRENT_TIMESTAMP
);

-- 商品表
CREATETABLE product (
  id BIGINTPRIMARYKEYAUTO_INCREMENT,
  name VARCHAR(100),
  price DECIMAL(10,2),
  stock INT,
  created_at DATETIMEDEFAULTCURRENT_TIMESTAMP
);

通用導入導出接口設計

@RestController
@RequestMapping("/excel")
@RequiredArgsConstructor
public class ExcelController {


    private final JdbcTemplate jdbcTemplate;
    private final ThreadPoolTaskExecutor taskExecutor;


    /**
     * Excel 導入任意表(異步)
     */
    @PostMapping("/import")
    public ResponseEntity<String> importExcel(@RequestParam("file") MultipartFile file,
                                              @RequestParam("tableName") String tableName) throws IOException {


        List<Map<Integer, String>> rowData = new ArrayList<>();


        EasyExcel.read(file.getInputStream(), new AnalysisEventListener<Map<Integer, String>>() {
            @Override
            public void invoke(Map<Integer, String> data, AnalysisContext context) {
                rowData.add(data);
            }


            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {}
        }).sheet().doRead();


        // 獲取目標表字段名(排除主鍵)
        List<String> columns = jdbcTemplate.queryForList(
                "SHOW COLUMNS FROM " + tableName + " WHERE Field != 'id'", String.class);


        if (columns.size() != rowData.get(0).size()) {
            return ResponseEntity.badRequest().body("Excel列數與表字段不匹配");
        }


        // 異步處理
        taskExecutor.execute(() -> {
            for (Map<Integer, String> row : rowData) {
                String sql = "INSERT INTO " + tableName + " (" + String.join(",", columns) + ") VALUES (" +
                        String.join(",", Collections.nCopies(columns.size(), "?")) + ")";
                Object[] values = columns.stream().map(col -> row.get(columns.indexOf(col))).toArray();
                jdbcTemplate.update(sql, values);
            }
        });


        return ResponseEntity.ok("文件上傳成功,已異步導入中");
    }


    /**
     * Excel 導出任意表
     */
    @GetMapping("/export")
    public void exportExcel(@RequestParam("tableName") String tableName, HttpServletResponse response) throws IOException {
        List<String> columnNames = jdbcTemplate.queryForList("SHOW COLUMNS FROM " + tableName, String.class);
        List<Map<String, Object>> rows = jdbcTemplate.queryForList("SELECT * FROM " + tableName);


        List<List<String>> excelData = new ArrayList<>();
        excelData.add(columnNames);


        for (Map<String, Object> row : rows) {
            List<String> rowList = columnNames.stream().map(col -> {
                Object value = row.get(col);
                return value == null ? "" : value.toString();
            }).collect(Collectors.toList());
            excelData.add(rowList);
        }


        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        String fileName = URLEncoder.encode(tableName + "_export.xlsx", "UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);


        EasyExcel.write(response.getOutputStream())
                .sheet("數據")
                .doWrite(excelData);
    }
}

線程池配置支持異步導入

@Configuration
public class ThreadConfig {
    @Bean
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
        pool.setCorePoolSize(4);
        pool.setMaxPoolSize(8);
        pool.setQueueCapacity(100);
        pool.setKeepAliveSeconds(30);
        pool.setThreadNamePrefix("excel-import-");
        pool.initialize();
        return pool;
    }
}
spring:
  task:
    execution:
      pool:
        core-size: 4
        max-size: 8
        queue-capacity: 100

前端 Thymeleaf 示例

<form method="post" enctype="multipart/form-data" action="/excel/import">
    <input type="file" name="file">
    <input type="text" name="tableName" placeholder="輸入表名">
    <button type="submit">導入 Excel</button>
</form>

<a href="/excel/export?tableName=user">導出用戶表</a>

總結:如何提升系統通用能力

通過本文的設計與實戰,我們實現了一個通用 Excel 導入導出框架,具備如下優勢:

  • 高通用性:支持任意數據庫表結構導入導出
  • 低維護成本:無需重復寫實體類和 mapper
  • 異步處理能力:導入可處理大文件不阻塞主線程
  • 適配前后端分離/低代碼平臺使用場景

如果你正在開發一個后臺系統、BI平臺或需要支持可配置表單數據導入導出功能的系統,這種通用設計無疑能大大提升系統的靈活性和擴展性。

責任編輯:武曉燕 來源: 路條編程
相關推薦

2025-07-02 08:00:00

防抖SpringBoot開發

2025-03-26 00:35:00

Javaweb開發

2025-01-13 13:47:13

2022-06-06 08:42:04

spring-boo開發接口防盜刷

2025-02-17 07:48:45

2025-08-07 09:30:57

2025-04-10 00:25:00

Spring@JsonView注解

2021-10-19 18:22:50

Map 注冊表源碼

2020-06-22 07:55:28

接口爬蟲

2025-05-14 01:00:00

Spring工具工廠類

2025-03-26 08:28:36

2022-06-23 08:42:08

配置加密解密

2025-01-22 14:02:35

2025-10-31 07:42:31

SpringExcel工具

2025-09-01 02:00:00

2025-11-03 06:25:26

SpringJSONJackson

2025-06-09 01:22:00

2025-02-08 08:00:00

JavaDeepSeekIDEA

2022-05-30 16:31:08

CSS

2024-02-19 00:21:45

開源圖片
點贊
收藏

51CTO技術棧公眾號

是的av在线| 美女网站视频色| 黑森林国产精品av| 久久久一区二区三区捆绑**| 国产精品网红直播| 日本爱爱小视频| 国产一区二区三区视频在线| 亚洲成人免费在线观看| 国产精品美女久久久久av福利| 亚洲天堂av片| 天天综合久久| 日韩国产中文字幕| 男人的天堂最新网址| 乱插在线www| 欧美国产在线观看| 91人人爽人人爽人人精88v| 日本三级一区二区| 一个色综合网| 亚洲日本欧美中文幕| 熟妇女人妻丰满少妇中文字幕| 亚洲欧美se| 亚洲精品免费看| 日韩黄色影视| 国内精品国产成人国产三级| 国产精品视频| 色综合老司机第九色激情| 蜜桃精品成人影片| 奇米一区二区| 精品久久久精品| 国产成人一二三区| 黄色片免费在线| 99久久99久久精品免费观看| 成人欧美在线视频| 天堂网视频在线| 亚洲午夜黄色| 欧美巨大黑人极品精男| 战狼4完整免费观看在线播放版| 欧美在线导航| 日韩免费视频一区| 国产亚洲天堂网| 成人在线高清免费| 亚洲欧美日韩国产成人精品影院| 欧美一区二区三区四区五区六区| 人妻一区二区三区四区| 狠狠色综合色综合网络| 国产成人高清激情视频在线观看| 国产又粗又硬又长又爽| 日韩欧美一区二区三区在线视频| 亚洲欧美精品在线| 懂色av粉嫩av蜜乳av| eeuss国产一区二区三区四区| 欧美一区二区三区在线视频| 污污网站在线观看视频| 午夜伦理福利在线| 精品久久久久久久久久久久久| 男人添女荫道口女人有什么感觉| 97超碰资源站在线观看| 亚洲欧美日韩久久| 亚洲高清不卡一区| 在线免费观看的av网站| 中文字幕av一区二区三区| 久久综合九色99| 天堂中文在线资源| 丰满少妇久久久久久久| 成人av.网址在线网站| 亚洲怡红院av| 丝袜诱惑制服诱惑色一区在线观看| 欧美一级大片在线免费观看| 天天做天天爱夜夜爽| av不卡在线| 91sa在线看| 中文在线第一页| 久久亚洲精品伦理| 国产精品狠色婷| 中文字幕av在线免费观看| 99伊人成综合| 欧美激情a∨在线视频播放| 欧美精品成人久久| 日韩视频久久| 国产精品黄色av| 国产免费一区二区三区最新不卡 | www亚洲国产| 自拍视频在线网| 亚洲精品一卡二卡| 日韩欧美国产免费| 91在线成人| 欧美一级久久久| 9.1成人看片| 成人网18免费网站| 日韩有码在线观看| 久久久99精品| 日韩经典中文字幕一区| 国产精品网红直播| 秋霞网一区二区| 91啦中文在线观看| 一道精品一区二区三区| 久久免费电影| 色诱视频网站一区| 成人在线短视频| 香蕉视频一区| 久久成人精品视频| 少妇太紧太爽又黄又硬又爽| 国产一区中文字幕| 欧美日韩国产不卡在线看| 免费黄网在线观看| 欧美日韩国产一区二区三区| 亚洲免费一级视频| 老汉色老汉首页av亚洲| www.日韩欧美| 欧美黄色一级大片| 久久精品国产精品亚洲精品| 成人av资源| av中文字幕在线| 天天操天天综合网| 黄色三级视频在线播放| 午夜久久av| 日韩激情在线视频| 国产精品三区在线观看| 日韩成人精品在线观看| 国产欧美一区二区在线播放| 成年人黄视频在线观看| 色婷婷一区二区| 娇妻高潮浓精白浆xxⅹ| 婷婷综合伊人| 国产精品xxxxx| 国产夫妻在线观看| 国产精品久99| 看av免费毛片手机播放| 岛国成人av| 久久久国产一区二区| 无码人妻av免费一区二区三区 | 女人18毛片一区二区三区| 国产精品国产自产拍高清av | 国产精品影院在线| 亚洲免费成人av| 99久久国产宗和精品1上映| 精品成人自拍视频| 日韩在线你懂的| 欧美日韩大片免费观看| 亚洲伦理久久| 五月天国产在线| 天堂√中文最新版在线| 99久久亚洲国产日韩美女| 亚洲男女网站| 性欧美video另类hd尤物| 美女视频网站黄色亚洲| 欧美精品欧美精品| 91在线超碰| 91国内精品野花午夜精品| 五月婷婷综合在线观看| 亚洲电影av| 成人黄色免费在线观看| 日韩大片在线永久免费观看网站| 欧洲色大大久久| 在线视频 日韩| 99riav1国产精品视频| 亚洲电影一区二区三区| 久久久视频在线| 国产精品无码免费播放| 自拍偷拍亚洲欧美日韩| 天天操天天干天天做| 国产精品久久久久无码av| 亚洲欧美日韩精品| 日本一区二区三区精品视频| 国产网红女主播精品视频| 精品国产伦一区二区三区观看方式| 国产精品99久久久久久成人| 蜜臀av国产精品久久久久| 9.1国产丝袜在线观看| 91精品国产777在线观看| 久久人人爽人人爽人人片亚洲| 欧美成人一区二区三区电影| 网爆门在线观看| 美女视频一区二区| 黑人巨大国产9丨视频| 精品一区二区三区在线观看视频 | 天堂网成人在线| 欧美激情亚洲| 久久99久久精品国产| 午夜av成人| 久久久精品国产| 高清毛片aaaaaaaaa片| 欧美性色视频在线| 自拍偷拍你懂的| 国产精品一二三四五| 夜夜添无码一区二区三区| 视频国产一区| 亚洲一区二区在线| 亚洲美女炮图| 久久久国产精品免费| 欧美性猛交 xxxx| 欧美系列日韩一区| 欧美日韩亚洲国产另类| 久久久精品中文字幕麻豆发布| 蜜臀一区二区三区精品免费视频 | 国产亚洲欧美日韩在线一区| 欧美婷婷精品激情| 韩日欧美一区| 欧美一级二级三级| 日韩三级av高清片| 国产精品久久久精品| 成年人视频免费在线观看| 欧美v日韩v国产v| 中文有码在线播放| 五月天一区二区三区| 色撸撸在线视频| 成人午夜视频在线观看| 日韩a在线播放| 一区二区影院| 欧美精品123| 国产日韩在线观看视频| 日本久久91av| 国产丝袜在线播放| 久久久精品免费| 懂色一区二区三区| 亚洲精品久久久一区二区三区| 亚洲一区二区免费在线| 欧美系列一区| 色欲无码人妻久久精品| 日操夜操天天操| 希岛爱理av免费一区二区| 国产欧美婷婷中文| heyzo在线欧美播放| 久久久91精品国产| www.黄在线观看| 日韩高清欧美高清| 韩国av永久免费| 欧美日韩视频在线一区二区| 日本va欧美va国产激情| 亚洲在线视频网站| 成人一级黄色大片| 久久亚洲一级片| 欧美日韩一区二区区别是什么 | 中文字幕观看视频| 黑人欧美xxxx| 日韩 欧美 精品| 一区二区三区91| 战狼4完整免费观看在线播放版| 久久久www成人免费毛片麻豆 | 九九久久九九久久| 国产三级精品在线观看| av不卡一区| 欧美日韩福利电影| 超碰最新在线| 久久视频在线免费观看| 欧美精品一区二区三区视频| 精品久久人妻av中文字幕| 欧美色视频一区| 中文在线观看av| 欧美亚洲国产一卡| 国产99免费视频| 日本高清不卡视频| 亚洲精品1区2区3区| 五月婷婷综合网| 性一交一乱一伧国产女士spa| 91精品啪在线观看国产| 久蕉在线视频| 欧美一级欧美一级在线播放| 97caocao| 欧美理论片在线| 伊人成年综合网| 欧美午夜激情在线| 久久久精品毛片| 日本精品一区二区三区高清| 无码人妻丰满熟妇精品| 林ゆな中文字幕一区二区| 欧美亚洲激情在线| av毛片在线免费看| 日韩在线观看网址| 国产51人人成人人人人爽色哟哟| 一区二区三区动漫| 91caoporn在线| 久久中文久久字幕| 久久青青色综合| 亲爱的老师9免费观看全集电视剧| 日本久久免费| 国产免费成人av| 日韩精品成人| 久久精品magnetxturnbtih| 精品一区二区男人吃奶| 久久综合九色99| 99国产**精品****| 欧美一区二区激情| 国产精品日韩久久久| 伊人色在线观看| 粉嫩av一区二区三区在线播放| 亚洲一区二区偷拍| 91在线播放网址| 中文字幕免费在线看线人动作大片| 国产精品日日摸夜夜摸av| 妺妺窝人体色www婷婷| 日韩欧美在线中文字幕| 一本一道人人妻人人妻αv| 精品国产露脸精彩对白| yourporn在线观看中文站| xxxxxxxxx欧美| 丁香花在线影院| 国产精品九九九| av日韩久久| 精品日本一区二区三区| 国产精品99久久久久久动医院| 欧美日韩不卡在线视频| 麻豆专区一区二区三区四区五区| 91亚洲一区二区| 91偷拍与自偷拍精品| 国产探花在线免费观看| 色综合久久六月婷婷中文字幕| 国产精品国产一区二区三区四区| 日韩高清人体午夜| av激情在线| 国产精品精品视频| 欧美性生活一级片| 天堂av在线中文| 老鸭窝亚洲一区二区三区| 佐佐木明希电影| 国产精品看片你懂得| 婷婷伊人五月天| 精品久久久久久亚洲精品| a毛片在线免费观看| 日韩中文字幕不卡视频| 综合日韩av| 国产精品sss| 午夜激情久久| 一级黄色香蕉视频| 99国产精品久久久久久久久久久| h色网站在线观看| 欧美在线观看一区| 亚洲精品国产精品乱码不卡| 色婷婷成人综合| 91欧美精品| 婷婷五月色综合| 爽好久久久欧美精品| 亚洲精品女人久久久| 亚洲高清免费观看高清完整版在线观看 | 青草伊人久久| youjizz.com亚洲| 久久精品久久99精品久久| 在线观看免费小视频| 欧美日韩中文字幕| 香港三日本三级少妇66| 久久人人爽人人| 精品伊人久久久| 凹凸国产熟女精品视频| 91小视频在线免费看| 久久狠狠高潮亚洲精品| 8x8x8国产精品| 日p在线观看| 91久久嫩草影院一区二区| 久久综合av| 天天碰免费视频 | 登山的目的在线| 3d动漫精品啪啪1区2区免费| 色三级在线观看| 国产人妖伪娘一区91| 青青草97国产精品麻豆| 亚洲综合色在线观看| 自拍偷拍欧美激情| 国产欧美久久久精品免费| 美女av一区二区| 7777精品| 色综合久久久久无码专区| 99精品久久免费看蜜臀剧情介绍| 91午夜视频在线观看| 亚洲欧美日本精品| 香蕉视频亚洲一级| 欧美日韩另类综合| 蜜桃久久久久久久| 欧美特级一级片| 精品福利一二区| 亚洲精品永久免费视频| 伊人久久99| 免费观看成人鲁鲁鲁鲁鲁视频| 伊人久久久久久久久久久久久久| 欧美一区二区日韩一区二区| 女人天堂av在线播放| 精品一区二区三区免费毛片| 久久精品网址| av电影网站在线观看| 欧美久久久久久久久中文字幕| 日本电影在线观看| 久久精品日产第一区二区三区乱码| 日韩经典中文字幕一区| 精品99久久久久成人网站免费| 日韩av一区在线| 国产福利亚洲| 人妻av无码专区| 国产欧美在线观看一区| 91影院在线播放| 久久综合久中文字幕青草| 国产精品videossex| 人妻丰满熟妇av无码区app| 国产亚洲欧美日韩在线一区| 国产aⅴ爽av久久久久成人| 91精品国产高清久久久久久91 | 尤物九九久久国产精品的特点| 粉嫩av国产一区二区三区| 欧美变态另类刺激| 中文字幕在线观看一区二区| 污污网站免费在线观看| 国产在线日韩在线|