国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

開發(fā) 前端
如果你正在開發(fā)一個后臺系統(tǒng)、BI平臺或需要支持可配置表單數(shù)據(jù)導(dǎo)入導(dǎo)出功能的系統(tǒng),這種通用設(shè)計無疑能大大提升系統(tǒng)的靈活性和擴展性。

在日常的企業(yè)系統(tǒng)或后臺管理系統(tǒng)中,數(shù)據(jù)的 Excel 導(dǎo)入導(dǎo)出是非常常見的需求。傳統(tǒng)方式通常是:

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

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

因此,本文基于 Spring Boot 3.3 + EasyExcel 實現(xiàn)一個 "支持任意表結(jié)構(gòu)、無需綁定實體類、異步處理大文件導(dǎo)入" 的通用 Excel 導(dǎo)入導(dǎo)出功能。

技術(shù)選型與優(yōu)勢

技術(shù)

用途

Spring Boot 3.3

構(gòu)建 RESTful Web 項目

EasyExcel

快速讀取/寫入 Excel 文件

JdbcTemplate

動態(tài)操作任意表結(jié)構(gòu)

ThreadPool

支持異步導(dǎo)入,釋放主線程

數(shù)據(jù)庫準(zhǔn)備(支持任意表結(jié)構(gòu))

-- 用戶表
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
);

通用導(dǎo)入導(dǎo)出接口設(shè)計

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


    private final JdbcTemplate jdbcTemplate;
    private final ThreadPoolTaskExecutor taskExecutor;


    /**
     * Excel 導(dǎo)入任意表(異步)
     */
    @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();


        // 獲取目標(biāo)表字段名(排除主鍵)
        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列數(shù)與表字段不匹配");
        }


        // 異步處理
        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("文件上傳成功,已異步導(dǎo)入中");
    }


    /**
     * Excel 導(dǎo)出任意表
     */
    @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("數(shù)據(jù)")
                .doWrite(excelData);
    }
}

線程池配置支持異步導(dǎo)入

@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">導(dǎo)入 Excel</button>
</form>

<a href="/excel/export?tableName=user">導(dǎo)出用戶表</a>

總結(jié):如何提升系統(tǒng)通用能力

通過本文的設(shè)計與實戰(zhàn),我們實現(xiàn)了一個通用 Excel 導(dǎo)入導(dǎo)出框架,具備如下優(yōu)勢:

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

如果你正在開發(fā)一個后臺系統(tǒng)、BI平臺或需要支持可配置表單數(shù)據(jù)導(dǎo)入導(dǎo)出功能的系統(tǒng),這種通用設(shè)計無疑能大大提升系統(tǒng)的靈活性和擴展性。

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

2025-03-26 00:35:00

Javaweb開發(fā)

2025-07-02 08:00:00

防抖SpringBoot開發(fā)

2025-01-13 13:47:13

2022-06-06 08:42:04

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

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

2025-01-22 14:02:35

2022-06-23 08:42:08

配置加密解密

2025-10-31 07:42:31

SpringExcel工具

2025-11-03 06:25:26

SpringJSONJackson

2025-09-01 02:00:00

2025-06-09 01:22:00

2021-09-15 08:45:55

Python文本文件代碼

2024-02-19 00:21:45

開源圖片

2021-11-23 23:01:40

Windows微軟系統(tǒng)
點贊
收藏

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

95在线视频| 在线视频成人| 久久久五月婷婷| 久久99九九| 国产91精品入| 日韩毛片在线观看| av网站在线免费看推荐| 亚洲国产sm捆绑调教视频 | 精品中文字幕一区二区三区四区| 日韩欧美亚洲国产另类| 一本大道香蕉8中文在线视频| 国产精品另类一区| 啊啊啊国产视频| 91在线视频在线| 国产不卡一区二区视频| 精品一区二区在线免费观看| 色一情一区二区三区四区| 亚洲黄色影院| 久久精品日产第一区二区三区 | www.久草| 久久精品男人天堂av| 蜜臀av无码一区二区三区| 粉嫩av一区二区三区| av动漫免费观看| 久久99精品久久久久久动态图| 欧美日韩精品免费在线观看视频| 亚洲综合三区| 涩涩涩999| 国产乱子轮精品视频| 中文字幕av导航| 成人综合在线观看| 欧美 日本 亚洲| 亚洲欧美一区二区视频| 原千岁中文字幕| 色噜噜久久综合| 超碰在线caoporen| 亚洲激情国产精品| 国产综合av| 欧美精品videossex性护士| 久草在线综合| 国产综合久久久久久| 欧美精品国产一区| 先锋影音亚洲资源| av福利精品导航| 自拍偷拍精选| 欧美丝袜自拍制服另类| 1区2区3区在线| 欧美激情视频网站| 欧美韩日高清| 潘金莲一级淫片aaaaaa播放1| 91热门视频在线观看| 国产一级黄色片免费| 精品视频免费看| 久久er热在这里只有精品66| 97不卡在线视频| 国产日韩一区| av高清在线免费观看| 一色桃子久久精品亚洲| 中文字幕大看焦在线看| 欧美日韩在线三级| 欧美韩国亚洲| 国产精品成久久久久三级| 欧美午夜电影在线观看 | 免费成人黄色网址| 欧美日韩一区二区三区视频| av中文在线资源库| 欧美日韩xxxxx| 清纯唯美亚洲色图| 亚洲国产天堂久久综合| 一区二区免费| 国产精品区免费视频| 91在线一区二区| 亚洲做受高潮| 国产一区二区三区18| 亚洲素人在线| 午夜精品一区二区三区在线观看| 99re亚洲国产精品| 色哟哟免费在线观看| 久久精品视频一| 国产精品第十页| 国产a级片免费观看| 狠狠躁夜夜躁久久躁别揉| 麻豆视频在线观看免费网站黄| 国产成人精品在线观看| 国产又黄又大久久| 日韩电影网址| 欧美交受高潮1| 奇米一区二区三区| 玖草视频在线| 日韩精品中文字幕在线观看| 欧美美女视频| 99在线免费视频观看| 欧美三级日韩在线| 欧美五码在线| 六月婷婷激情网| 欧美日韩dvd在线观看| 久久中文字幕导航| 亚洲一区二区在线观| 一本在线高清不卡dvd| 午夜久久av| 黄黄视频在线观看| 欧美日韩国产影片| 亚洲va久久| 精品一卡二卡三卡| 日韩成人久久久| 欧美日韩国产色综合一二三四| 久久久久久久久久久久久久国产| 日韩精品在线一区| 亚洲精彩视频| 黄色仓库视频网站| 久久6免费高清热精品| 精品一区二区免费视频| 黄色免费在线观看网站| 91精品免费视频| 中文字幕在线观看不卡视频| 天天综合91| 国产专区在线视频| 亚洲变态欧美另类捆绑| 午夜在线视频观看日韩17c| 飘雪影视在线观看免费观看 | 青青青国产精品| 色阁综合av| 欧美视频一区二区在线观看| 久久福利影院| 意大利激情丛林无删减版dvd| 久久免费观看视频| 中文字幕国产一区| 精品国产一区二| 欧美 日韩 亚洲 一区| 亚洲欧美日韩精品久久亚洲区| 小嫩嫩精品导航| 欧美成人hd| 久久亚洲高清| 欧美一级黄色大片| 久久国产精品毛片| 久久综合网导航| 亚洲欧美日韩不卡一区二区三区| 日韩午夜激情av| 韩国三级电影一区二区| 91久久国产综合久久91猫猫| 日本道在线视频| 日韩在线观看精品| 92国产精品观看| 精品精品国产毛片在线看| www.99av.com| 国产精品入口免费视频一| 一区二区欧美视频| 成人精品电影| 91官网在线| 色综合久久久久久久久五月| 欧美大片在线观看| 国产专区综合网| 成人午夜视屏| 青青草精品视频在线观看| 欧美富婆性猛交| 国产精品国产三级国产专播品爱网| 自拍偷拍精品| 偷拍自拍在线| 久久精品国产美女| 国产亚洲欧美另类中文| 91在线观看视频| 伊人色综合久久| 欧美婷婷久久| 亚洲性无码av在线| 国产午夜精品一区二区三区四区| 日韩激情啪啪| 人成免费电影一二三区在线观看| 欧洲精品久久| 日韩一区二区欧美| 亚洲欧美激情视频在线观看一区二区三区 | 久热精品在线| 国产一区一一区高清不卡| 欧美 日韩精品| 国产精品久久久av久久久| 在线影视一区二区三区| 热久久久久久久| 亚洲第一二区| 亚洲成人天堂| 日韩久久不卡| 91精品国产99| 欧美四级电影在线观看| 成人免费精品视频| 日韩aaaa| 中文字幕21页在线看| www成人免费视频| 精品综合久久| 精品国产欧美一区二区三区成人| 精品成人在线视频| 国内精品久久久久影院色| 91亚洲无吗| 国产剧情在线| 日本熟妇人妻xxxxx| 黄色99视频| 欧美xxxx做受欧美.88| 色综合天天综合在线视频| 国产传媒久久文化传媒| 亚洲三级性片| 在线视频超级| 男同在线观看| 丁香婷婷激情网|