使用Java和EasyExcel轻松实现文件导入导出

相关标签:1.了解Java中的垃圾回收
2. Java Map的巧妙设计

Java与EasyExcel简介:

项目需要导入和导出Excel文件并下载。手动输入员工信息既繁琐又容易出错,因此本篇博客将教你如何在Java中实现Excel文件的导入和导出。

技术栈
Excel工具:EasyExcel
选用框架:Spring、Spring MVC、MyBatis(SSM)
项目构建管理工具:Maven
需求:

1.使用Excel工具实现员工信息的导入和导出
2.导出要求输出到指定位置并下载
3.导入文件后存储到数据库并在页面上展示
4.导出文件时,点击导出写入指定地址并下载

Java与EasyExcel效果图

项目结构

核心源代码

引入阿里巴巴EasyExcel依赖
< dependency >
< groupId > com.alibaba
< artifactId > easyexcel
< version > 2.1.6

这里使用EasyExcel,为什么不用POI?
因为EasyExcel是POI的升级版,POI相对臃肿,EasyExcel去除了POI中一些繁琐的部分,因此更加轻量,所以本文使用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 ( " Employee Name" )
private String emp_name ;

@ColumnWidth ( 20 ) _
@ExcelProperty ( " Employee Age" )
private Integer emp_age ;

@ExcelIgnore _
private Integer emp_sex ;

// redundant fields
@ColumnWidth ( 20 ) _
@ExcelProperty ( " employee gender" )
private String str_emp_sex ;

@ColumnWidth ( 20 ) _
@ExcelProperty ( "Employee Salary " )
private Double emp_salary ;

@ColumnWidth ( 20 ) _
@ExcelProperty ( " Employee Address" )
private String emp_address ;

@ColumnWidth ( 20 ) _
@ExcelProperty ( "EmployeePosition " )
private String emp_position ;

/ / Paging related, the current page and the number of data per page
@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 > {

// employee collection
private static List employeeList = new ArrayList < >( );

// Each time the read is the same, the invoke method will be called once
@Override
public void invoke ( Employee data, AnalysisContext context) {
employeeList.add (data);
System.out.println ( "Parse to a piece of data: " + data);
}

// After reading all, this method will be called
@Override
public void doAfterAllAnalysed ( AnalysisContext context) {
System.out.println ( "All parsing completed" );
}

/**
* Return the read employee collection
* @return
*/
public static List getStudentList ( ) {
return employeeList ;
}
}

Java+EasyExcel 导入文件



Java+EasyExcel,测试类实现文件导入并存储到数据库

@Test
public void test1 () {
ExcelReaderBuilder workBook = EasyExcel.read
( "C:\Users\wanghuicall\Desktop\employee.xlsx" , Employee . class , new EmployeeReadListener ()) ;

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

//写入数据库
List 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 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 ;
}

Java+EasyExcel 导出文件



测试类导出文件到指定位置

@Test
public void test2 () throws FileNotFoundException {

List employeeList = initData ( );


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

// sheet方法参数:工作表的序号(从0开始)或工作表的名称
workBook.sheet ( "Test Data Sheet" ). doWrite ( employeeList );
System.out.println ( "Write complete!" );
}

/**
* 生成测试数据
* @return
*/
public List initData ( ) {
List 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 ( "Beijing Chaoyang District" + i );
employee.setEmp_position ( "Java Senior Engineer" );
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 kspwStudentSeatList = list();
try {
ExcelWriterBuilder workBook = EasyExcel.write(GlobalSet.download_url, Employee.class);
// sheet方法参数:工作表的序号(从0开始)或工作表的名称
workBook.sheet ( "Employee Information" ). doWrite ( kspwStudentSeatList );
downloadTempalate (response);
System.out.println ( "Write complete!" );
} 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 ( "Employee Information.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 ();
}

相关文章

探索更多特惠

  1. 短信服务(SMS)与邮件推送

    5万封邮件包低至1.99美元,120条短信仅需1.00美元

phone 联系我们
你好,我是AI助理。
可以解答问题、推荐解决方案等。