Java操作excel文件一般有两种方式easyExcel和poi,这里使用的是更简单的easyExcel方式。
EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。
EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。EasyExcel基于POI进行封装优化,降低内存使用,再大的excel也不会出现内存溢出,让使用更加简单方便。
EasyExcel操作excel
导入依赖
EasyExcel需引入如下依赖:
<!--easypoi依赖,excel导入导出--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.3.0</version></dependency>
示例中还需引入其他依赖:
<!-- /artifact/org.projectlombok/lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version><scope>provided</scope></dependency>
多sheet工作表excel导入
先来定义一个导入实体类(两个不同的sheet,可以定义两个不同的实体类)。
package com.ypk.swagger.model;import cn.afterturn.easypoi.excel.annotation.Excel;import lombok.Data;import java.io.Serializable;/*** @ClassName 仪器 * @Description TODO* @Author lgn* @Date 17:41 /9/16* @Version 1.0**/@Datapublic class ImportInstrument implements Serializable {private static final long serialVersionUID = 1L;/*** @Excel 作用在一个filed上面,对列的描述* @param name 列名* @param orderNum 下标,从0开始。*/@Excel(name = "设备名称", orderNum = "0",width = 10.0)private String name;@Excel(name = "类型", orderNum = "1",width = 10.0)private Integer type;}
package com.ypk.swagger.model;import cn.afterturn.easypoi.excel.annotation.Excel;import lombok.Data;import java.io.Serializable;/*** @ClassName ImportServer * @Description TODO* @Author lgn* @Date 18:38 /9/16* @Version 1.0**/@Datapublic class ImportServer implements Serializable {private static final long serialVersionUID = 1L;@Excel(name = "计算机名称", orderNum = "0",width = 10.0)private String name;@Excel(name = "服务器IP", orderNum = "1",width = 10.0)private String ip;}
ps:
如果excel里面有日期格式的数据,实体类这样处理:
添加注解:
@DateTimeFormat(fallbackPatterns = “yyyy-MM-dd”)
字段接收类型采用 import java.util.Date;
/** 设备放行时间 */@Excel(name = "设备放行时间", orderNum = "13",width = 10.0)@DateTimeFormat(fallbackPatterns = "yyyy-MM-dd")private Date completionTime;
我这里是两个sheet:
Controller添加excel导入方法
/*** excel多sheet导入*/@ApiOperation(value = "excel多sheet导入", notes = "excel多sheet导入")@PostMapping(value ="ImportAssetsManage", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)public void importForSheetUsers(@RequestPart("file") MultipartFile file) throws IOException {userService.importForSheetUsers(file);}
实现导入方法(核心)
package com.ypk.swagger.utils;import cn.afterturn.easypoi.excel.ExcelImportUtil;import cn.afterturn.easypoi.excel.entity.ImportParams;import java.io.InputStream;import java.util.List;import java.util.NoSuchElementException;/*** @ClassName EasyPoiUtils * @Description TODO* @Author lgn* @Date 17:15 /9/16* @Version 1.0**/public class EasyPoiUtils {/*** 功能描述:根据接收的Excel文件来导入多个sheet,根据索引可返回一个集合** @param inputStream excel输入流* @param sheetIndex 导入sheet索引* @param titleRows 表标题的行数* @param headerRows 表头行数* @param pojoClass Excel实体类*/public static <T> List<T> importExcel(InputStream inputStream, int sheetIndex, Integer titleRows, Integer headerRows, Class<T> pojoClass) {// 根据file得到Workbook,主要是要根据这个对象获取,传过来的excel有几个sheet页ImportParams params = new ImportParams();// 第几个sheet表页params.setStartSheetIndex(sheetIndex);//设置表标题行数params.setTitleRows(titleRows);//设置表头行数params.setHeadRows(headerRows);List<T> list = null;try {//读取的excel数据集合list = ExcelImportUtil.importExcel(inputStream, pojoClass, params);} catch (NoSuchElementException e) {throw new RuntimeException("模板不能为空");} catch (Exception e) {e.printStackTrace();}return list;}}
Service UserServiceImpl
package com.ypk.swagger.service;import org.springframework.web.multipart.MultipartFile;import java.io.IOException;/*** @ClassName UserService * @Description TODO* @Author lgn* @Date 17:12 /9/16* @Version 1.0**/public interface UserService {void importForSheetUsers(MultipartFile file) throws IOException;}
package com.ypk.swagger.service.impl;import com.ypk.swagger.model.ImportInstrument;import com.ypk.swagger.model.ImportServer;import com.ypk.swagger.service.UserService;import com.ypk.swagger.utils.EasyPoiUtils;import org.springframework.stereotype.Service;import org.springframework.web.multipart.MultipartFile;import java.io.IOException;import java.util.List;/*** @ClassName UserServiceImpl * @Description TODO* @Author lgn* @Date 17:13 /9/16* @Version 1.0**/@Servicepublic class UserServiceImpl implements UserService {@Overridepublic void importForSheetUsers(MultipartFile file) throws IOException {//分批进行读取excel的sheet工作表//读取第一个sheet表List<ImportInstrument> sheetOneUsers = EasyPoiUtils.importExcel(file.getInputStream(), 0, 1, 1, ImportInstrument.class);//读取第二个sheet表List<ImportServer> sheetTwoUsers = EasyPoiUtils.importExcel(file.getInputStream(), 1, 1, 1, ImportServer.class);for (ImportInstrument o:sheetOneUsers){System.out.println("------one:"+o);}for (ImportServer o:sheetTwoUsers){System.out.println("------two:"+o);}}}
测试一下:
源码地址:
/nanist/swagger.git