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.导出文件,点击导出后写入指定地址,并下载该文件
效果图
项目结构
核心源码
导入阿里巴巴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文件的导入导出的资料请关注其它相关文章!