欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java+EasyExcel实现文件的导入导出

程序员文章站 2022-03-07 19:39:37
目录引言效果图项目结构核心源码核心实体类核心监听器类easyexcel导入文件easyexcel导出文件引言项目中需要excel文件的导入与导出excel并下载,例如,导入员工信息,导出员工信息,手动...

引言

项目中需要excel文件的导入与导出excel并下载,例如,导入员工信息,导出员工信息,手动输入比较繁琐,所以本篇博文教大家如何在java中导入excel文件与导出excel文件

技术栈

excel工具:easyexcel

选用框架:spring、spring mvc、mybatis(ssm)

项目构建管理工具:maven

需求:

1.要求利用excel工具实现员工信息的导入与导出

2.导出要求为输出到指定位置并下载

3.导入文件导入后,存入数据库,并显示在页面

4.导出文件,点击导出后写入指定地址,并下载该文件

效果图

Java+EasyExcel实现文件的导入导出

项目结构

Java+EasyExcel实现文件的导入导出

核心源码

导入阿里巴巴easyexcel依赖

<dependency>
    <groupid>com.alibaba</groupid>
    <artifactid>easyexcel</artifactid>
    <version>2.1.6</version>
</dependency>

这里采用easyexcel,为什么不采用poi呢?

因为easyexcel是对poi做的一个升级,poi相对于笨重,easyexcel去除了一些poi比较繁琐的东西,所以easyexcel比较轻量级,所以本文采用easyexcel

easyexcel是阿里巴巴的产品,poi是apache基金会的开源产品,easyexcel对poi做了一个升级

核心实体类

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;

    //分页相关,当前页与每页的数据条数
    @excelignore
    private integer pagenum;
    @excelignore
    private integer pagesize;
}

核心监听器类

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<>();

    // 每读一样,会调用该invoke方法一次
    @override
    public void invoke(employee data, analysiscontext context) {
        employeelist.add(data);
        system.out.println("解析到一条数据:" + data);
    }

    // 全部读完之后,会调用该方法
    @override
    public void doafterallanalysed(analysiscontext context) {
        system.out.println("全部解析完成");
    }

    /**
     * 返回读取到的员工集合
     * @return
     */
    public static list<employee> getstudentlist() {
        return employeelist;
    }
}

easyexcel导入文件

test测试类实现文件导入并存入数据库

@test
public void test1(){
    excelreaderbuilder workbook = easyexcel.read
        ("c:\\users\\王会称\\desktop\\员工.xlsx", employee.class, new employeereadlistener());

    // 封装工作表
    excelreadersheetbuilder sheet1 = workbook.sheet();
    // 读取
    sheet1.doread();

    //写入数据库
    list<employee> studentlist = employeereadlistener.getstudentlist();
    for (employee employee : studentlist) {
        employee.setnoid(pbsecretutils.uuid());
        employeemapper.insert(employee);
    }
}

通过页面点击导入文件并存入数据库

employeecontroller类:

@postmapping("/import_employee_excel")
public string importemployeeexcel(multipartfile emp_excel) {
    employeeservice.importexcel(emp_excel);
    return "redirect:/employee/list";
}

employeeservice类:

/**
     * 获取用户选择的文件并将文件存入指定位置再将数据存入数据库
     * @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导出文件

test测试类导出文件到指定文件

@test
public void test2() throws filenotfoundexception {

    list<employee> employeelist = initdata();


    excelwriterbuilder workbook = easyexcel.write(globalset.download_url, employee.class);

    // sheet方法参数: 工作表的顺序号(从0开始)或者工作表的名字
    workbook.sheet("测试数据表").dowrite(employeelist);
    system.out.println("写入完成!");
}

/**
     * 生成测试数据
     * @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("北京市朝阳区"+i);
        employee.setemp_position("java高级工程师");
        employeelist.add(employee);
    }
    return employeelist;
}

通过页面导出到指定文件后并下载文件

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方法参数: 工作表的顺序号(从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");
        // 下载文件的默认名称
        response.setheader("content-disposition", "attachment;filename=" + urlencoder.encode("员工信息.xlsx", "utf-8"));
        //4. 创建输入、输出流
        fileinputstream input = new fileinputstream(globalset.download_url);
        servletoutputstream sos = response.getoutputstream();

        //io流获取文件的字节流,然后再响应给浏览器
        byte[] arr = new byte[1024];
        int res = 0;
        while((res = input.read(arr)) > 0){
            //将读取的内容输出到输出流中
            sos.write(arr, 0, res);
        }

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

以上就是java+easyexcel实现文件的导入导出的详细内容,更多关于java easyexcel文件的导入导出的资料请关注其它相关文章!