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

Java使用easyExcel批量導(dǎo)入數(shù)據(jù)詳解

 更新時(shí)間:2023年08月25日 10:26:31   作者:流蘇打  
這篇文章主要介紹了Java使用easyExcel批量導(dǎo)入數(shù)據(jù)詳解,通常我們會(huì)提供一個(gè)模板,此模塊我們可以使用easyExcel導(dǎo)出數(shù)據(jù)生成的一個(gè)Excel文件當(dāng)作模板,提供下載鏈接,用戶在該文件內(nèi)填入規(guī)定的數(shù)據(jù)格式以后可以批量導(dǎo)入數(shù)據(jù)到數(shù)據(jù)庫中,需要的朋友可以參考下

Java使用easyExcel批量導(dǎo)入數(shù)據(jù)

WMS、ERP等管理系統(tǒng)經(jīng)常涉及庫存、人員信息的管理,通常我們會(huì)提供一個(gè)模板

此模塊我們可以使用easyExcel導(dǎo)出數(shù)據(jù)生成的一個(gè)Excel文件當(dāng)作模板,提供下載鏈接。

用戶在該文件內(nèi)填入規(guī)定的數(shù)據(jù)格式以后可以批量導(dǎo)入數(shù)據(jù)到數(shù)據(jù)庫中。

controller層:

    //excel批量導(dǎo)入用戶數(shù)據(jù)
    @PostMapping("/user/import")
    public Object addUserList(@RequestParam("file")  MultipartFile file) {
        try {
            BufferedInputStream in = new BufferedInputStream(file.getInputStream());
            //調(diào)用寫的一個(gè)工具類傳入 文件流,所要轉(zhuǎn)換存儲(chǔ)的類,以及業(yè)務(wù)邏輯(我這邊直接就是插入語句)
            ExcelUtils.readExcel(in, User.class,userDao);
        }catch (Exception e){
            e.printStackTrace();
        }
        return "ok";
    }

ExcelUtils工具類:

網(wǎng)上的一些工具類包括公司內(nèi)部所使用的對(duì)Excel操作的工具包利用了反射、對(duì)于每個(gè)異常都做了處理有固定的返回格式和狀態(tài)碼,導(dǎo)致那那些工具包太大太亂對(duì)于新手同學(xué)來說不太友好,因此我這邊就單獨(dú)寫了一個(gè)簡(jiǎn)易的版本,讓功能實(shí)現(xiàn)即可。

package com.example.webdemo.utils.excel;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.example.webdemo.Dao.UserDao;
import java.io.*;
import java.util.List;
/**
 * @author zhangqianwei
 * @date 2022/2/16 19:45
 */
public class ExcelUtils {
    /**
     * @param is   導(dǎo)入文件輸入流
     * @param clazz Excel實(shí)體映射類
     * @return
     */
    public static Boolean readExcel(InputStream is, Class clazz, UserDao userDao){
        BufferedInputStream bis = null;
        try {
            bis = new BufferedInputStream(is);
            // 解析每行結(jié)果在listener中處理
            AnalysisEventListener listener = new ExcelListener(userDao);
            ExcelReader excelReader = EasyExcelFactory.getReader(bis, listener);
            excelReader.read(new Sheet(1, 1, clazz));
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            if (bis != null) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return true;
    }
   /**
     *
     * @param response http請(qǐng)求報(bào)文
     * @param clazz Excel實(shí)體映射類
     * @param data 導(dǎo)出數(shù)據(jù)
     * @return
     */
    public static Boolean writeExcel(HttpServletResponse response, Class clazz, List<? extends BaseRowModel> data){
        BufferedOutputStream bos= null;
        try {
            ServletOutputStream out = response.getOutputStream();
            ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, true);
            String fileName = "用戶數(shù)據(jù)";
            //這邊對(duì)應(yīng)的實(shí)體類改為你所導(dǎo)出的實(shí)體類
            Sheet sheet = new Sheet(1, 0, User.class);
            //設(shè)置自適應(yīng)寬度
            sheet.setAutoWidth(Boolean.TRUE);
            // 第一個(gè) sheet 名稱
            sheet.setSheetName("第一個(gè)sheet");
            writer.write(data, sheet);
            //通知瀏覽器以附件的形式下載處理,設(shè)置返回頭要注意文件名有中文
            response.setHeader("Content-disposition", "attachment;filename=" + new String( fileName.getBytes("gb2312"), "ISO8859-1" ) + ".xlsx");
            writer.finish();
            response.setContentType("multipart/form-data");
            response.setCharacterEncoding("utf-8");
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return true;
    }
}

監(jiān)聽類ExcelListener:

Excel批量導(dǎo)入,其實(shí)是監(jiān)聽解析出來的每一行數(shù)據(jù)轉(zhuǎn)換為對(duì)應(yīng)的類,逐個(gè)插入數(shù)據(jù)庫,當(dāng)然也可以監(jiān)聽到每一行數(shù)據(jù)時(shí)候存儲(chǔ)到一個(gè)list中,供后續(xù)業(yè)務(wù)處理。

package com.example.webdemo.utils.excel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.webdemo.Dao.UserDao;
import com.example.webdemo.Entity.User;
import java.util.ArrayList;
import java.util.List;
/**
 * @author zhangqianwei
 * @date 2022/2/16 20:03
 */
/** 解析監(jiān)聽器,
 * 每解析一行會(huì)回調(diào)invoke()方法。
 * 整個(gè)excel解析結(jié)束會(huì)執(zhí)行doAfterAllAnalysed()方法
 */
public class ExcelListener extends AnalysisEventListener {
    private final UserDao userDao;
    //解析出來的每一行數(shù)據(jù)可以存入一個(gè)list中
    private List<Object> datas = new ArrayList<Object>();
    public ExcelListener(UserDao userDao) {
        this.userDao = userDao;
    }
    @Override
    public void invoke(Object object, AnalysisContext context) {
        System.out.println("當(dāng)前行:"+context.getCurrentRowNum());
        System.out.println(object);
        datas.add(object);//數(shù)據(jù)存儲(chǔ)到list,供批量處理,或后續(xù)自己業(yè)務(wù)邏輯處理。
        insert(object);//根據(jù)自己業(yè)務(wù)做處理
    }
    private void insert(Object object) {
        User user = (User) object;
        userDao.addUser(user);
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // datas.clear();//解析結(jié)束銷毀不用的資源
    }
    public List<Object> getDatas() {
        return datas;
    }
    public void setDatas(List<Object> datas) {
        this.datas = datas;
    }
}

User類:

使用easyExcel導(dǎo)出Excel時(shí)候生成的Excel文件作為模板,使用該模板進(jìn)行批量導(dǎo)入:

據(jù)庫生成數(shù)據(jù):

到此這篇關(guān)于Java使用easyExcel批量導(dǎo)入數(shù)據(jù)詳解的文章就介紹到這了,更多相關(guān)easyExcel批量導(dǎo)入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中AutoCloseable接口使用小結(jié)

    Java中AutoCloseable接口使用小結(jié)

    Java7引入的AutoCloseable接口,用于自動(dòng)管理資源的關(guān)閉,避免資源泄露,下面就來介紹一下Java中AutoCloseable接口使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-01-01
  • Java for循環(huán)和foreach循環(huán)的性能對(duì)比分析

    Java for循環(huán)和foreach循環(huán)的性能對(duì)比分析

    這篇文章主要介紹了Java for循環(huán)和foreach循環(huán)的性能對(duì)比分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 深入分析JAVA Vector和Stack的具體用法

    深入分析JAVA Vector和Stack的具體用法

    這篇文章主要介紹了深入分析JAVA Vector和Stack的具體用法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • java加密枝術(shù)深入理解

    java加密枝術(shù)深入理解

    java.security包中的MessageDigest類提供了計(jì)算消息摘要的方法,本文將詳細(xì)介紹,需要了解的朋友可以參考下
    2012-11-11
  • idea 設(shè)置支持ES6語法的操作

    idea 設(shè)置支持ES6語法的操作

    這篇文章主要介紹了idea設(shè)置支持ES6語法的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Mybatis中的@Param及動(dòng)態(tài)SQL詳解

    Mybatis中的@Param及動(dòng)態(tài)SQL詳解

    這篇文章主要介紹了Mybatis中的@Param及動(dòng)態(tài)SQL詳解,@Param是MyBatis所提供的作為Dao層的注解,作用是用于傳遞參數(shù),從而可以與SQL中的的字段名相對(duì)應(yīng),需要的朋友可以參考下
    2023-10-10
  • 解決SpringMVC項(xiàng)目連接RabbitMQ出錯(cuò)的問題

    解決SpringMVC項(xiàng)目連接RabbitMQ出錯(cuò)的問題

    這篇文章主要介紹了解決SpringMVC項(xiàng)目連接RabbitMQ出錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 解析Idea為什么不推薦使用@Autowired進(jìn)行Field注入

    解析Idea為什么不推薦使用@Autowired進(jìn)行Field注入

    這篇文章主要介紹了Idea不推薦使用@Autowired進(jìn)行Field注入的原因,網(wǎng)上文章大部分都是介紹兩者的區(qū)別,沒有提到為什么,當(dāng)時(shí)想了好久想出了可能的原因,今天來總結(jié)一下
    2022-05-05
  • springboot 集成redis哨兵主從的實(shí)現(xiàn)

    springboot 集成redis哨兵主從的實(shí)現(xiàn)

    本文主要介紹了springboot 集成redis哨兵主從的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • POI讀取excel簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    POI讀取excel簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了POI讀取excel簡(jiǎn)介,詳細(xì)的介紹了什么是Apache POI和組件,有興趣的可以了解了解一下
    2017-08-08

最新評(píng)論

金坛市| 灵宝市| 合肥市| 诸暨市| 朝阳县| 永城市| 武宁县| 海晏县| 台前县| 贵阳市| 共和县| 绥宁县| 茂名市| 呈贡县| 定边县| 务川| 抚远县| 莲花县| 景东| 正镶白旗| 南安市| 昭苏县| 廉江市| 凌云县| 濮阳市| 祁阳县| 修武县| 九龙城区| 建始县| 望江县| 右玉县| 西宁市| 延寿县| 威宁| 霞浦县| 无极县| 宾川县| 鄂托克前旗| 新和县| 株洲市| 甘孜县|