前言:本文章教你从零开始,三分钟搞定excel单sheet导出、导入、多sheet导出、导入、excel模板导入单个sheet、多个sheet,废话不多说,直接上代码
1.引入依赖
com.alibaba easyexcel 2.2.10 com.alibaba fastjson 1.2.72
2.工具类-ExcelHandler
package io.renren.handler;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.read.builder.ExcelReaderBuilder;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import io.renren.common.exception.RenException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* @author wy
* @description: Excel处理
* @date 2022/10/27 10:00
*/
@Slf4j
@Component
public class ExcelHandler {
/**
* 导入简单excel数据
* @param file :文件流
* @param clazz:数据对象
* @param sheetName:要读取的sheet [不传:默认读取第一个sheet]
* @throws Exception
*/
public List importExcel(MultipartFile file, Class clazz, String sheetName) throws Exception{
this.checkFile(file);
UploadDataListener uploadDataListener = new UploadDataListener<>();
ExcelReaderBuilder builder = EasyExcelFactory.read(file.getInputStream(), clazz, uploadDataListener);
if (StringUtils.isEmpty(sheetName)) {
builder.sheet().doRead();
} else {
builder.sheet(sheetName).doRead();
}
return uploadDataListener.getList();
}
/**
* 指定sheet页导入通用方法
* @param multipartFile 传入文件
* @param objList 需要导入的sheet页实体类型集合
* @param index sheet页个数
* @param indexList 需要导入sheet页下标集合
* @param
* @return List>
* @throws Exception
*/
public List> importExcelsByIndex(MultipartFile multipartFile, List objList, int index,List indexList) throws Exception {
if (multipartFile == null) {
throw new RenException("文件为空");
}
List> resultList = new LinkedList<>();
//初始化导入sheet页实体类型下标
int objListClass = 0;
for (int i = 0; i < index; i++) {
if(indexList.contains(i)){
UploadDataListener uploadDataListener = new UploadDataListener<>();
List excels;
EasyExcelFactory.read(multipartFile.getInputStream(), objList.get(objListClass).getClass(), uploadDataListener).sheet(i).doRead();
excels = uploadDataListener.getList();
resultList.add(excels);
objListClass++;
}
}
return resultList;
}
/**
* 读取多个sheet
* @param file:文件流
* @param index:需要读取的sheet个数 [默认0开始,如果传入3,则读取0 1 2]
* @param params:每个sheet里面需要封装的对象[如果index为3,则需要传入对应的3个对象]
* @param
* @return
*/
public List> importExcels(MultipartFile file, int index, List
3.工具类-ExcelTemplateEnum
package io.renren.handler;
import lombok.Getter;
/**
* @author wy
* @description: 模板枚举
* @date 2022/10/27 15:40
*/
@Getter
public enum ExcelTemplateEnum {
/**单sheet导出*/
TEMPLATE_1("1","complex"),
/**模板格式*/
TEMPLATE_SUFFIX("xlsx",".xlsx"),
TEMPLATE_SUFFIX_XLS("xls",".xls"),
TEMPLATE_SUFFIX_DOCX("docx",".docx"),
/**模板路径*/
TEMPLATE_PATH("path","excel"),
;
private final String code;
private final String desc;
ExcelTemplateEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
/**
* 通过code获取msg
*
* @param code 枚举值
* @return
*/
public static String getMsgByCode(String code) {
if (code == null) {
return null;
}
ExcelTemplateEnum enumList = getByCode(code);
if (enumList == null) {
return null;
}
return enumList.getDesc();
}
public static String getCode(ExcelTemplateEnum enumList) {
if (enumList == null) {
return null;
}
return enumList.getCode();
}
public static ExcelTemplateEnum getByCode(String code) {
for (ExcelTemplateEnum enumList : values()) {
if (enumList.getCode().equals(code)) {
return enumList;
}
}
return null;
}
}
4.工具类-UploadDataListener
package io.renren.handler; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.exception.ExcelDataConvertException; import io.renren.common.exception.RenException; import java.util.ArrayList; import java.util.List; /** * @author wy * @description:导入模板监听器 * @date 2022/10/27 09:48 */ public class UploadDataListenerextends AnalysisEventListener { /**数据集*/ private final List list = new ArrayList<>(); public List getList(){ return this.list; } /** * 每条数据都会进入 * @param object: * @param analysisContext: */ @Override public void invoke(T object, AnalysisContext analysisContext) { this.list.add(object); } /** * 数据解析完调用 * @param analysisContext: */ @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { } /** * 异常时调用 * @param exception: * @param context: * @throws Exception */ @Override public void onException(Exception exception, AnalysisContext context) throws Exception { // 数据解析异常 if (exception instanceof ExcelDataConvertException) { ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception; throw new RenException("第" + excelDataConvertException.getRowIndex() + "行" + excelDataConvertException.getColumnIndex() + "列" + "数据解析异常"); } // 其他异常... } }
5.实体类-ExcelVO
package io.renren.service.impl;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 导出实体
*/
@Data
@ApiModel(value = "导出实体")
public class ExcelVO {
@ColumnWidth(80)
@ExcelProperty("编号")
@ApiModelProperty(value = "编号")
private Integer id;
@ColumnWidth(80)
@ExcelProperty("年龄")
@ApiModelProperty(value = "年龄")
private Integer age;
@ColumnWidth(80)
@ExcelProperty("姓名")
@ApiModelProperty(value = "姓名")
private String name;
@ColumnWidth(80)
@ExcelProperty("语文")
@ApiModelProperty(value = "语文")
private Integer wen;
@ColumnWidth(80)
@ExcelProperty("数学")
@ApiModelProperty(value = "数学")
private Integer richard;
@ColumnWidth(80)
@ExcelProperty("总分")
@ApiModelProperty(value = "总分")
private Integer sum;
//无需导出字段使用此注解
//@JsonSerialize(using = ToStringSerializer.class)
}
6.业务层-ExcelService
package io.renren.service;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
/**
* 导出业务接口
*/
public interface ExcelService {
/**
* excel导入-单个sheet
*
* @param multipartFile 文件流
*/
void excelImport(MultipartFile multipartFile);
/**
* excel导出-单个sheet
*
* @param response 响应体
*/
void excelExport(HttpServletResponse response);
/**
* excel多入-多个sheet
*
* @param multipartFile 文件流
*/
void excelSheetImport(MultipartFile multipartFile);
/**
* excel导出-多个sheet
*
* @param response 响应体
*/
void excelSheetExport(HttpServletResponse response);
/**
* excel模板导出-单个sheet
*
* @param response 响应流
*/
void excelTemplate(HttpServletResponse response);
/**
* excel模板导出-多个sheet
*
* @param response 响应流
*/
void excelSheetTemplate(HttpServletResponse response) throws Exception;
}
7.实现层-ExcelServiceImpl
package io.renren.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import io.renren.common.exception.RenException;
import io.renren.handler.ExcelHandler;
import io.renren.handler.ExcelTemplateEnum;
import io.renren.service.ExcelService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
/**
* 导出业务实现
*/
@Slf4j
@Service
public class ExcelServiceImpl implements ExcelService {
@Resource
ExcelHandler excelHandler;
/**
* excel导入-单个sheet
*
* @param multipartFile 文件流
*/
@Override
public void excelImport(MultipartFile multipartFile) {
try {
List voList = excelHandler.importExcel(multipartFile, ExcelVO.class, null);
if (CollectionUtils.isNotEmpty(voList)) {
System.out.println("本次成功导出:" + voList.size() + "条,数据如下---------------");
voList.forEach(vo -> {
System.out.println("vo=" + vo.toString());
});
}
} catch (Exception e) {
throw new RenException("导入失败");
}
}
/**
* excel导出-单个sheet
*
* @param response 响应体
*/
@Override
public void excelExport(HttpServletResponse response) {
try {
List excelVOS = structureDate(20);
excelHandler.exportExcel(response, excelVOS, ExcelVO.class, "excel导出-单sheet", "excel导出-单sheet");
} catch (Exception e) {
throw new RenException("导出失败");
}
}
/**
* excel导入-多个sheet
*
* @param multipartFile 文件流
*/
@Override
public void excelSheetImport(MultipartFile multipartFile) {
try {
List indexList = new ArrayList<>();
indexList.add(0);
indexList.add(1);
indexList.add(2);
indexList.add(3);
indexList.add(4);
indexList.add(5);
List
8.控制层-ApiExcelController
package io.renren.controller;
import io.renren.common.utils.Result;
import io.renren.service.ExcelService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
/**
* 注册接口
*
* @author wy
*/
@RestController
@RequestMapping("/api")
@Api(tags = "文件接口")
public class ApiExcelController {
@Resource
private ExcelService excelService;
/**
* excel导入-单个sheet
*
* @param multipartFile 文件流
* @return
* @throws Exception
*/
@PostMapping("/excelImport")
@ApiOperation(value = "excel导入")
public Result
9.模板
