最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot+Vue實(shí)現(xiàn)EasyPOI導(dǎo)入導(dǎo)出的方法詳解

 更新時(shí)間:2022年08月29日 09:02:29   作者:Bug 終結(jié)者  
項(xiàng)目開發(fā)過程中,很大的需求都有 導(dǎo)入導(dǎo)出功能。本文將利用SpringBoot+Vue實(shí)現(xiàn)EasyPOI導(dǎo)入導(dǎo)出功能,感興趣的可以了解一下

前言

Hello~ ,前后端分離系列和大家見面了,秉著能夠?qū)W到知識(shí),學(xué)會(huì)知識(shí),學(xué)懂知識(shí)的理念去學(xué)習(xí),深入理解技術(shù)!

項(xiàng)目開發(fā)過程中,很大的需求都有 導(dǎo)入導(dǎo)出功能,我們依照此功能,來實(shí)現(xiàn)并還原真實(shí)企業(yè)開發(fā)中的實(shí)現(xiàn)思路

一、為什么做導(dǎo)入導(dǎo)出

為什么做導(dǎo)入導(dǎo)出

導(dǎo)入

在項(xiàng)目開發(fā)過程中,總會(huì)有一些統(tǒng)一的操作,例如插入數(shù)據(jù),系統(tǒng)支持單個(gè)插入數(shù)據(jù)效率太慢了,為此,我們可以將數(shù)據(jù)寫入Excel中,系統(tǒng)提供導(dǎo)入功能進(jìn)行批量添加數(shù)據(jù),實(shí)現(xiàn)了數(shù)據(jù)的統(tǒng)一覆蓋,快捷操作!

導(dǎo)出

導(dǎo)出功能,實(shí)現(xiàn)了我們的Excel表數(shù)據(jù)查看,輸出為Excel表格后,我們可以很方便快捷的查看數(shù)據(jù),以及隨時(shí)修改數(shù)據(jù),達(dá)到了可視化的效果!

總之,導(dǎo)入導(dǎo)出是為了方便系統(tǒng)的操作,提升用戶體驗(yàn)而開發(fā)的一個(gè)功能,目前絕大項(xiàng)目中,均會(huì)有導(dǎo)入導(dǎo)出的身影存在,可見導(dǎo)入導(dǎo)出的重要性!

二、什么是 EasyPOI

EasyPoi功能如同名字easy,主打的功能就是容易,讓一個(gè)沒見接觸過poi的人員就可以方便的寫出Excel導(dǎo)出,Excel模板導(dǎo)出,Excel導(dǎo)入,Word模板導(dǎo)出,通過簡單的注解和模板語言(熟悉的表達(dá)式語法),完成以前復(fù)雜的寫法。

EasyPOI 官方最新 文檔:http://easypoi.mydoc.io/

EasyPOI 主要功能

  • 基于注解的導(dǎo)入導(dǎo)出,修改注解就可以修改Excel
  • 支持常用的樣式自定義
  • 基于map可以靈活定義的表頭字段
  • 支持一對(duì)多的導(dǎo)出,導(dǎo)入
  • 支持模板的導(dǎo)出,一些常見的標(biāo)簽,自定義標(biāo)簽
  • 支持HTML/Excel轉(zhuǎn)換,如果模板還不能滿足用戶的變態(tài)需求,請(qǐng)用這個(gè)功能
  • 支持word的導(dǎo)出,支持圖片,Excel

EasyPOI 的特點(diǎn)

  • 設(shè)計(jì)精巧,使用簡單
  • 接口豐富,擴(kuò)展簡
  • 單默認(rèn)值多,write less do more
  • spring mvc支持,web導(dǎo)出可以簡單明了

總而言之:EasyPOI 一個(gè)字 Easy !

三、項(xiàng)目簡介

項(xiàng)目需求

本項(xiàng)目要求使用 Spring Boot + Vue 完成前后端分離開發(fā),具體需求如下:

  • 組件庫采用 ElementUI、持久化層 MyBatis、數(shù)據(jù)庫 采用 MySQL8.0
  • 完成用戶列表的 增加,多條件查詢、分頁
  • 提供用戶列表的導(dǎo)入功能,要求導(dǎo)入成功后 持久化到數(shù)據(jù)庫
  • 提供用戶列表的導(dǎo)出功能,要求前端可下載導(dǎo)出的Excel列表
  • 具體導(dǎo)入導(dǎo)出 使用 EasyPOI實(shí)現(xiàn),完成開發(fā)
  • 整體編碼規(guī)范采用 Alibaba 開發(fā)手冊(cè)規(guī)范

嚴(yán)格根據(jù)需求進(jìn)行功能開發(fā)!

效果圖

開發(fā)環(huán)境

項(xiàng)目結(jié)構(gòu)

目錄介紹:

common: 公共類層,主要放置共有的類,提高開發(fā)效率,減少不必要的重復(fù)性開發(fā)

config:配置中心層,主要放置 全局的配置信息等

dto:前端頁面展示對(duì)象,傳輸對(duì)象層

entity:實(shí)體類層,與數(shù)據(jù)庫一 一對(duì)應(yīng)

其它為MVC三層架構(gòu)層。

核心Pom 依賴

<!--        Easy POI-->
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-base</artifactId>
    <version>3.2.0</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-web</artifactId>
    <version>3.2.0</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-annotation</artifactId>
    <version>3.2.0</version>
</dependency>

重新加載Maven 依賴即可。

四、實(shí)戰(zhàn)開發(fā) 核心源碼

需求分析

項(xiàng)目已經(jīng)搭建完畢,接下來進(jìn)入開發(fā),主要的就是導(dǎo)入導(dǎo)出具體功能的實(shí)現(xiàn)

思路:

導(dǎo)入功能,首先新建Excel對(duì)應(yīng)實(shí)體類,映射具體列,controller層編寫具體映射文件類, 調(diào)用內(nèi)置方法完成讀取 Excel文件并映射為具體類集合,再將該集合轉(zhuǎn)為DTO,批量存入數(shù)據(jù)庫,完成導(dǎo)入操作

導(dǎo)出功能,controller層編寫方法并聲明reponse響應(yīng)類,調(diào)用內(nèi)置方法完成文件的讀取并存入 對(duì)應(yīng)集合,瀏覽器即可得到響應(yīng)消息,完成下載文件。(瀏覽器訪問通過 window.open 或者Nginx轉(zhuǎn)發(fā) 實(shí)現(xiàn)下載功能)

直接上代碼!

前端頁面

導(dǎo)入具體實(shí)現(xiàn)

<template>
	<div class="el-form-item__label">
            <el-upload
              class="upload-demo"
              :action="importUrl"
              :on-success="uploadSuccess"
              accept=".xlsx"
              :show-file-list="false"
              multiple
              :limit="3"
              :on-exceed="handleExceed"
            >
              <el-button type="success" plain icon="el-icon-download" size="small">導(dǎo)入</el-button>
            </el-upload>
        </div>
</template>

data() {
    return {
      importUrl: this.settings.apiUrl+'/sys/user/import_excel',
    };
  },

導(dǎo)出具體實(shí)現(xiàn)

<template>
	<div class="el-form-item__label">
            <el-button type="warning" size="small" plain icon="el-icon-upload2" @click="exportExcel">導(dǎo)出</el-button>
        </div>
</template>

methods: {
    exportExcel() {
		window.open(this.settings.apiUrl + "/sys/user/export_excel")
	}
}

前端代碼完成編寫,全部源碼 請(qǐng)看文末,源碼地址

后端核心實(shí)現(xiàn)

實(shí)體類 SysUserExcel

package com.chen.excel;

import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;

import java.util.Date;

/**
 * Excel 類,主要用于映射excel表
 * @author whc
 */
@Data
public class SysUserExcel {

    @Excel(name = "序號(hào)", orderNum = "0", format = "isAddIndex")
    private Integer index = 1;

    @Excel(name = "用戶賬號(hào)")
    private String username;

    @Excel(name = "真實(shí)姓名")
    private String realName;

    @Excel(name = "性別", replace = {"男_1", "女_2"})
    private Integer gender;

    @Excel(name = "電子郵箱", width = 25)
    private String email;

    @Excel(name = "手機(jī)號(hào)碼")
    private String mobile;

    @Excel(name = "創(chuàng)建時(shí)間", format = "yyyy-MM-dd", width = 15)
    private Date createTime;
}

導(dǎo)入功能具體實(shí)現(xiàn)

導(dǎo)入功能 contorller 層

@PostMapping("import_excel")
    public ResultBean<Integer> import_excel(MultipartFile file) {
        ResultBean<Integer> res = sysUserService.importExcel(file);
        return res;
    }

導(dǎo)入功能 service 層

@Override
public ResultBean<Integer> importExcel(MultipartFile file) {
    ImportParams importParams = new ImportParams();
    //標(biāo)題行設(shè)置為1行,默認(rèn)是0,可以不設(shè)置;依實(shí)際情況設(shè)置。
    importParams.setTitleRows(1);
    // 表頭設(shè)置為1行
    importParams.setHeadRows(1);
    try {
        //讀取excel
        List<SysUserExcel> sysUserExcelList = ExcelImportUtil.importExcel(file.getInputStream(), SysUserExcel.class, importParams);

        batchInsert(sysUserExcelList);
        return ResultBean.create(0, "success");
    } catch (Exception e) {
        log.error("導(dǎo)入 Excel 異常! e ==> {}", e);
        return ResultBean.create(10, "導(dǎo)入excel 異常!"+e.getMessage());
    }
}


public void batchInsert(List<SysUserExcel> param) throws Exception{
    //轉(zhuǎn)換為dto集合
    List<SysUserDTO> sysUserDTOList = BeanUtil.copyToList(param, SysUserDTO.class);

    //轉(zhuǎn)換集合
    List<SysUserDTO> userDTOList = new ArrayList<>();
    for (SysUserDTO sysUserDTO : sysUserDTOList) {
        if (!StringUtils.isEmpty(sysUserDTO.getUsername())) {
            sysUserDTO.setPassword("123");
            userDTOList.add(sysUserDTO);
        }
    }
    //批量插入數(shù)據(jù)庫
    sysUserMapper.batchInsert(userDTOList);

}

導(dǎo)入功能 mapper層

Integer batchInsert(@Param("list") List<SysUserDTO> param);

導(dǎo)入功能 mapper 對(duì)應(yīng) xml,批量插入操作,采用forEach 循環(huán)完成

<insert id="batchInsert">
    insert sys_user (username, password, real_name, gender, email, mobile, create_time)
    values
    <foreach collection="list" index="index" item="item" separator=",">
        (#{item.username}, #{item.password}, #{item.realName}, #{item.gender}, #{item.email}, #{item.mobile}, now())
    </foreach>
</insert>

導(dǎo)出功能實(shí)現(xiàn)

導(dǎo)出 controller層

@GetMapping("export_excel")
public void export_excel(Map<String, Object> param, HttpServletResponse response) {
    sysUserService.exportExcel(param, response);
}

導(dǎo)出 service 層

@Override
public void exportExcel(Map<String, Object> param, HttpServletResponse response) {
    try {
        List<SysUserDTO> res = sysUserMapper.list(null);
        List<SysUserExcel> sysUserExcelList = BeanUtil.copyToList(res, SysUserExcel.class);
        //設(shè)置信息頭,告訴瀏覽器內(nèi)容為excel類型
        response.setHeader("content-Type", "application/vnd.ms-excel");
        //設(shè)置下載名稱
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("用戶列表.xls", StandardCharsets.UTF_8.name()));

        //字節(jié)流輸出
        ServletOutputStream out = response.getOutputStream();
        //設(shè)置excel參數(shù)
        ExportParams params = new ExportParams();
        //設(shè)置sheet名名稱
        params.setSheetName("用戶列表");
        //設(shè)置標(biāo)題
        params.setTitle("用戶信息表");

        Workbook workbook = ExcelExportUtil.exportExcel(params, SysUserExcel.class, sysUserExcelList);
        workbook.write(out);
    } catch (Exception e) {
        log.error("導(dǎo)出失?。?e ==> {}", e);
    }
}

五、項(xiàng)目源碼

GitHub: GitHub 開源地址

GitCode: GitCode 開源地址

小結(jié)

以上就是【Bug 終結(jié)者】對(duì) 【前后端分離系列】 Spring Boot + Vue 實(shí)現(xiàn) EasyPOI 導(dǎo)入導(dǎo)出 的簡單介紹,導(dǎo)入導(dǎo)出是我們?cè)陧?xiàng)目中比較常用的功能,同時(shí),前后端分離項(xiàng)目的開發(fā)提高了我們對(duì)技術(shù)的更深入的理解,懂得了前端和后端是如何完成的交互,以及數(shù)據(jù)的渲染等,總之,導(dǎo)入導(dǎo)出很重要,該項(xiàng)目也涉及到了批量刪除等實(shí)戰(zhàn)開發(fā)中比較常用的功能

到此這篇關(guān)于SpringBoot+Vue實(shí)現(xiàn)EasyPOI導(dǎo)入導(dǎo)出的方法詳解的文章就介紹到這了,更多相關(guān)SpringBoot EasyPOI導(dǎo)入導(dǎo)出內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合JdbcTemplate的示例代碼

    SpringBoot整合JdbcTemplate的示例代碼

    JdbcTemplate是Spring框架自帶的對(duì)JDBC操作的封裝,目的是提供統(tǒng)一的模板方法使對(duì)數(shù)據(jù)庫的操作更加方便、友好,效率也不錯(cuò),這篇文章主要介紹了SpringBoot整合JdbcTemplate,需要的朋友可以參考下
    2022-08-08
  • 學(xué)會(huì)在Java中使用Optional功能

    學(xué)會(huì)在Java中使用Optional功能

    這篇文章主要介紹了學(xué)會(huì)在Java中使用Optional功能,在本文中,我們將了解如何、何時(shí)以及在哪里最好地應(yīng)用Optional,具體相關(guān)內(nèi)容需要的朋友可以參考下面文章內(nèi)容
    2022-09-09
  • MyBatis-Plus標(biāo)簽@TableField之fill自動(dòng)填充方式

    MyBatis-Plus標(biāo)簽@TableField之fill自動(dòng)填充方式

    這篇文章主要介紹了MyBatis-Plus標(biāo)簽@TableField之fill自動(dòng)填充方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Trie樹(字典樹)的介紹及Java實(shí)現(xiàn)

    Trie樹(字典樹)的介紹及Java實(shí)現(xiàn)

    Trie樹,又稱字典樹或前綴樹,關(guān)于它的結(jié)構(gòu)就不詳細(xì)介紹了。Trie樹在單詞統(tǒng)計(jì)、前綴匹配等很多方面有很大用處。下面這篇文章主要介紹了Trie樹,以及Java實(shí)現(xiàn)如何Trie樹,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • MyBatis-Plus如何使用枚舉自動(dòng)關(guān)聯(lián)注入詳解

    MyBatis-Plus如何使用枚舉自動(dòng)關(guān)聯(lián)注入詳解

    這篇文章主要給大家介紹了關(guān)于MyBatis-Plus如何使用枚舉自動(dòng)關(guān)聯(lián)注入的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MyBatis-Plus具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-03-03
  • SpringBoot詳解如何實(shí)現(xiàn)讀寫分離

    SpringBoot詳解如何實(shí)現(xiàn)讀寫分離

    當(dāng)響應(yīng)的瓶頸在數(shù)據(jù)庫的時(shí)候,就要考慮數(shù)據(jù)庫的讀寫分離,當(dāng)然還可以分庫分表,那是單表數(shù)據(jù)量特別大,當(dāng)單表數(shù)據(jù)量不是特別大,但是請(qǐng)求量比較大的時(shí)候,就要考慮讀寫分離了.具體的話,還是要看自己的業(yè)務(wù)...如果還是很慢,那就要分庫分表了...我們這篇就簡單講一下讀寫分離
    2022-05-05
  • Java8中的LocalDateTime你會(huì)使用了嗎

    Java8中的LocalDateTime你會(huì)使用了嗎

    LocalDateTime?是?Java?8?中日期時(shí)間?API?提供的一個(gè)類,在日期和時(shí)間的表示上提供了更加豐富和靈活的支持,本文就來講講LocalDateTime的一些具體使用方法吧
    2023-05-05
  • SpringBoot @ExceptionHandler與@ControllerAdvice異常處理詳解

    SpringBoot @ExceptionHandler與@ControllerAdvice異常處理詳解

    在Spring Boot應(yīng)用的開發(fā)中,不管是對(duì)底層數(shù)據(jù)庫操作,對(duì)業(yè)務(wù)層操作,還是對(duì)控制層操作,都會(huì)不可避免的遇到各種可預(yù)知的,不可預(yù)知的異常需要處理,如果每個(gè)處理過程都單獨(dú)處理異常,那么系統(tǒng)的代碼耦合度會(huì)很高,工作量大且不好統(tǒng)一,以后維護(hù)的工作量也很大
    2022-10-10
  • Java中的集合ArrayList類常用方法和遍歷

    Java中的集合ArrayList類常用方法和遍歷

    這篇文章主要介紹了Java中的集合ArrayList類常用方法和遍歷,ArrayList 是大小可變的數(shù)組的實(shí)現(xiàn),存儲(chǔ)在內(nèi)的數(shù)據(jù)稱為元素,此類提供一些方法來操作內(nèi)部存儲(chǔ)的元素, ArrayList中可不斷添加元素,其大小也自動(dòng)增長,需要的朋友可以參考下
    2024-01-01
  • Java實(shí)現(xiàn)手寫一個(gè)線程池的示例代碼

    Java實(shí)現(xiàn)手寫一個(gè)線程池的示例代碼

    線程池技術(shù)想必大家都不陌生把,相信在平時(shí)的工作中沒有少用,而且這也是面試頻率非常高的一個(gè)知識(shí)點(diǎn),那么大家知道它的實(shí)現(xiàn)原理和細(xì)節(jié)嗎?本文就來通過手寫一個(gè)簡單的線程池框架,去掌握線程池的基本原理,感興趣的可以學(xué)習(xí)一下
    2022-10-10

最新評(píng)論

六枝特区| 尼玛县| 交口县| 文安县| 新营市| 阿拉善右旗| 美姑县| 彩票| 秭归县| 吴川市| 友谊县| 镇康县| 沂水县| 桐庐县| 安乡县| 柏乡县| 巨鹿县| 博野县| 巴林右旗| 巴南区| 措勤县| 景洪市| 拉萨市| 海城市| 蓝山县| 永泰县| 新丰县| 登封市| 平舆县| 浠水县| 环江| 元朗区| 杭州市| 嘉义县| 安塞县| 东阿县| 三穗县| 新余市| 贵定县| 延安市| 英吉沙县|