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

Java+EasyExcel實(shí)現(xiàn)文件的導(dǎo)入導(dǎo)出

 更新時(shí)間:2021年12月21日 09:58:38   作者:Bug終結(jié)者.  
在項(xiàng)目中我們常常需要Excel文件的導(dǎo)入與導(dǎo)出,手動(dòng)輸入相對(duì)有些繁瑣,所以本文教大家如何在Java中輕松導(dǎo)入與導(dǎo)出Excel文件,感興趣的可以學(xué)習(xí)一下

引言

項(xiàng)目中需要Excel文件的導(dǎo)入與導(dǎo)出Excel并下載,例如,導(dǎo)入員工信息,導(dǎo)出員工信息,手動(dòng)輸入比較繁瑣,所以本篇博文教大家如何在Java中導(dǎo)入Excel文件與導(dǎo)出Excel文件

技術(shù)棧

Excel工具:EasyExcel

選用框架:Spring、Spring MVC、MyBatis(SSM)

項(xiàng)目構(gòu)建管理工具:Maven

需求:

1.要求利用excel工具實(shí)現(xiàn)員工信息的導(dǎo)入與導(dǎo)出

2.導(dǎo)出要求為輸出到指定位置并下載

3.導(dǎo)入文件導(dǎo)入后,存入數(shù)據(jù)庫(kù),并顯示在頁(yè)面

4.導(dǎo)出文件,點(diǎn)擊導(dǎo)出后寫入指定地址,并下載該文件

效果圖

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

核心源碼

導(dǎo)入阿里巴巴EasyExcel依賴

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.1.6</version>
</dependency>

這里采用EasyExcel,為什么不采用POI呢?

因?yàn)镋asyExcel是對(duì)POI做的一個(gè)升級(jí),POI相對(duì)于笨重,EasyExcel去除了一些POI比較繁瑣的東西,所以EasyExcel比較輕量級(jí),所以本文采用EasyExcel

EasyExcel是阿里巴巴的產(chǎn)品,POI是Apache基金會(huì)的開源產(chǎn)品,EasyExcel對(duì)POI做了一個(gè)升級(jí)

核心實(shí)體類

package com.wanshi.spring.entity;

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {

    @ExcelIgnore
    private String noid;

    @ColumnWidth(20)
    @ExcelProperty("員工姓名")
    private String emp_name;

    @ColumnWidth(20)
    @ExcelProperty("員工年齡")
    private Integer emp_age;

    @ExcelIgnore
    private Integer emp_sex;

    //冗余字段
    @ColumnWidth(20)
    @ExcelProperty("員工性別")
    private String str_emp_sex;

    @ColumnWidth(20)
    @ExcelProperty("員工工資")
    private Double emp_salary;

    @ColumnWidth(20)
    @ExcelProperty("員工住址")
    private String emp_address;

    @ColumnWidth(20)
    @ExcelProperty("員工崗位")
    private String emp_position;

    //分頁(yè)相關(guān),當(dāng)前頁(yè)與每頁(yè)的數(shù)據(jù)條數(shù)
    @ExcelIgnore
    private Integer pageNum;
    @ExcelIgnore
    private Integer pageSize;
}

核心監(jiān)聽器類

EmployeeListener類:

package com.wanshi.spring.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.wanshi.spring.entity.Employee;

import java.util.ArrayList;
import java.util.List;

public class EmployeeReadListener extends AnalysisEventListener<Employee> {

    //員工集合
    private static List<Employee> employeeList = new ArrayList<>();

    // 每讀一樣,會(huì)調(diào)用該invoke方法一次
    @Override
    public void invoke(Employee data, AnalysisContext context) {
        employeeList.add(data);
        System.out.println("解析到一條數(shù)據(jù):" + data);
    }

    // 全部讀完之后,會(huì)調(diào)用該方法
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println("全部解析完成");
    }

    /**
     * 返回讀取到的員工集合
     * @return
     */
    public static List<Employee> getStudentList() {
        return employeeList;
    }
}

EasyExcel導(dǎo)入文件

Test測(cè)試類實(shí)現(xiàn)文件導(dǎo)入并存入數(shù)據(jù)庫(kù)

@Test
public void test1(){
    ExcelReaderBuilder workBook = EasyExcel.read
        ("C:\\Users\\王會(huì)稱\\Desktop\\員工.xlsx", Employee.class, new EmployeeReadListener());

    // 封裝工作表
    ExcelReaderSheetBuilder sheet1 = workBook.sheet();
    // 讀取
    sheet1.doRead();

    //寫入數(shù)據(jù)庫(kù)
    List<Employee> studentList = EmployeeReadListener.getStudentList();
    for (Employee employee : studentList) {
        employee.setNoid(PbSecretUtils.uuid());
        employeeMapper.insert(employee);
    }
}

通過頁(yè)面點(diǎn)擊導(dǎo)入文件并存入數(shù)據(jù)庫(kù)

EmployeeController類:

@PostMapping("/import_employee_excel")
public String importEmployeeExcel(MultipartFile emp_excel) {
    employeeService.importExcel(emp_excel);
    return "redirect:/employee/list";
}

EmployeeService類:

/**
     * 獲取用戶選擇的文件并將文件存入指定位置再將數(shù)據(jù)存入數(shù)據(jù)庫(kù)
     * @param emp_excel
     * @return
     */
public Integer importExcel(MultipartFile emp_excel) {
    try {
        String fileName = FileUploadUtil.upload(emp_excel, "");
        ExcelReaderBuilder workBook = EasyExcel.read
            (GlobalSet.upload_url+fileName, Employee.class, new EmployeeReadListener());

        // 封裝工作表
        ExcelReaderSheetBuilder sheet1 = workBook.sheet();
        // 讀取
        sheet1.doRead();

        List<Employee> studentList = EmployeeReadListener.getStudentList();
        for (Employee employee : studentList) {
            employee.setNoid(PbSecretUtils.uuid());
            if ("男".equals(employee.getStr_emp_sex())) {
                employee.setEmp_sex(1);
            } else {
                employee.setEmp_sex(2);
            }
            employeeMapper.insert(employee);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return 0;
}

EasyExcel導(dǎo)出文件

Test測(cè)試類導(dǎo)出文件到指定文件

@Test
public void test2() throws FileNotFoundException {

    List<Employee> employeeList = initData();


    ExcelWriterBuilder workBook = EasyExcel.write(GlobalSet.download_url, Employee.class);

    // sheet方法參數(shù): 工作表的順序號(hào)(從0開始)或者工作表的名字
    workBook.sheet("測(cè)試數(shù)據(jù)表").doWrite(employeeList);
    System.out.println("寫入完成!");
}

/**
     * 生成測(cè)試數(shù)據(jù)
     * @return
     */
public List<Employee> initData() {
    List<Employee> employeeList = new ArrayList<>();
    for (int i = 1; i < 100; i++) {
        Employee employee = new Employee();
        employee.setEmp_name("小王說:"+i);
        employee.setEmp_age(19);
        if (i % 10 == 0) {
            employee.setEmp_sex(1);
        } else {
            employee.setEmp_sex(2);
        }
        employee.setEmp_salary(19999.00+i);
        employee.setEmp_address("北京市朝陽(yáng)區(qū)"+i);
        employee.setEmp_position("Java高級(jí)工程師");
        employeeList.add(employee);
    }
    return employeeList;
}

通過頁(yè)面導(dǎo)出到指定文件后并下載文件

EmployeeController類

@GetMapping("/export_employee_excel")
    public void exportEmployeeExcel(HttpServletResponse response) {
        try {
            employeeService.exportEmployeeExcel(response);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

EmployeeService類:

public void exportEmployeeExcel(HttpServletResponse response) throws IOException {
        List<Employee> kspwStudentSeatList = list();
        try {
            ExcelWriterBuilder workBook = EasyExcel.write(GlobalSet.download_url, Employee.class);
            // sheet方法參數(shù): 工作表的順序號(hào)(從0開始)或者工作表的名字
            workBook.sheet("員工信息").doWrite(kspwStudentSeatList);
            downloadTempalate(response);
            System.out.println("寫入完成!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 下載文件
     * @param response
     * @throws IOException
     */
    public static void downloadTempalate(HttpServletResponse response) throws IOException {
        // 告訴瀏覽器用什么軟件可以打開此文件
        response.setHeader("content-Type", "application/vnd.ms-excel");
        // 下載文件的默認(rèn)名稱
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("員工信息.xlsx", "utf-8"));
        //4. 創(chuàng)建輸入、輸出流
        FileInputStream input = new FileInputStream(GlobalSet.download_url);
        ServletOutputStream sos = response.getOutputStream();

        //IO流獲取文件的字節(jié)流,然后再響應(yīng)給瀏覽器
        byte[] arr = new byte[1024];
        int res = 0;
        while((res = input.read(arr)) > 0){
            //將讀取的內(nèi)容輸出到輸出流中
            sos.write(arr, 0, res);
        }

        input.close();
        sos.close();
    } 

以上就是Java+EasyExcel實(shí)現(xiàn)文件的導(dǎo)入導(dǎo)出的詳細(xì)內(nèi)容,更多關(guān)于Java EasyExcel文件的導(dǎo)入導(dǎo)出的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 從零開始SSM搭建步驟(圖文)

    從零開始SSM搭建步驟(圖文)

    這篇文章主要介紹了從零開始SSM搭建步驟(圖文),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java自定義長(zhǎng)度可變數(shù)組的操作

    Java自定義長(zhǎng)度可變數(shù)組的操作

    這篇文章主要介紹了Java自定義長(zhǎng)度可變數(shù)組的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • SpringBoot初始教程之統(tǒng)一異常處理詳解

    SpringBoot初始教程之統(tǒng)一異常處理詳解

    本篇文章主要介紹了SpringBoot初始教程之統(tǒng)一異常處理詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • Spring中常用注解的用法

    Spring中常用注解的用法

    這篇文章主要介紹了Spring中常用注解的用法,Spring注解方式減少了配置文件內(nèi)容,更加便于管理,并且使用注解可以大大提高了開發(fā)效率,注解本身是沒有功能的,和xml一樣,注解和xml都是一種元數(shù)據(jù),元數(shù)據(jù)即解釋數(shù)據(jù)的數(shù)據(jù),也就是所謂的配置,需要的朋友可以參考下
    2023-08-08
  • Spring?Boot?2.x升3.x的那些事

    Spring?Boot?2.x升3.x的那些事

    最近項(xiàng)目需求,準(zhǔn)備從Spring Boot 2.x升級(jí)到3.x,升級(jí)后發(fā)現(xiàn)編譯器報(bào)了一堆錯(cuò)誤,本文主要介紹了Spring?Boot?2.x升3.x的那些事,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • JAVA中AES加密方法實(shí)例分析

    JAVA中AES加密方法實(shí)例分析

    這篇文章主要介紹了JAVA中AES加密方法,實(shí)例分析了java中AES加密與解密的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • java使用Base64編碼實(shí)例

    java使用Base64編碼實(shí)例

    這篇文章主要介紹了java使用Base64編碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 談?wù)凧ava中Volatile關(guān)鍵字的理解

    談?wù)凧ava中Volatile關(guān)鍵字的理解

    volatile這個(gè)關(guān)鍵字可能很多朋友都聽說過,或許也都用過。在Java 5之前,它是一個(gè)備受爭(zhēng)議的關(guān)鍵字,因?yàn)樵诔绦蛑惺褂盟鶗?huì)導(dǎo)致出人意料的結(jié)果,本文給大家介紹java中volatile關(guān)鍵字,需要的朋友參考下
    2016-03-03
  • AQS加鎖機(jī)制Synchronized相似點(diǎn)詳解

    AQS加鎖機(jī)制Synchronized相似點(diǎn)詳解

    這篇文章主要為大家介紹了AQS加鎖機(jī)制Synchronized相似點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 關(guān)于kafka發(fā)送消息的三種方式總結(jié)

    關(guān)于kafka發(fā)送消息的三種方式總結(jié)

    這篇文章主要介紹了關(guān)于kafka發(fā)送消息的三種方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評(píng)論

新昌县| 嘉义县| 贡觉县| 玉山县| 永善县| 和龙市| 保康县| 莱州市| 嘉祥县| 项城市| 邛崃市| 定安县| 德保县| 雷州市| 崇左市| 隆昌县| 株洲市| 沂水县| 义乌市| 安康市| 罗定市| 临沭县| 彭阳县| 扶风县| 旬阳县| 盐城市| 根河市| 高唐县| 巴楚县| 隆回县| 西宁市| 兰考县| 武安市| 鹤壁市| 宝鸡市| 外汇| 边坝县| 漠河县| 会东县| 河东区| 南陵县|