推荐配合官网API使用!!!
https://alibaba-easyexcel.github.io/index.html
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.10</version>
</dependency>
package com.kd.opt.entity;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.*;
import java.io.Serializable;
import java.util.Date;
/**
* Xxx实体类(代码规范),EasyExcel实现Excel导入导出功能
*
* @author 小辰哥哥
*/
// 会为类的所有属性自动生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法
@Data
// 如果觉得@Data太过残暴(因为@Data集合了@ToString、@EqualsAndHashCode、@Getter/@Setter、@RequiredArgsConstructor的所有特性)不够精细,
// 可以使用@Getter/@Setter注解,此注解在属性上,可以为相应的属性自动生成Getter/Setter方法
@Setter
@Getter
// 类使用@ToString注解,Lombok会生成一个toString()方法,默认情况下,会输出类名、所有属性(会按照属性定义顺序),用逗号来分割
@ToString
// 自动生成全参构造器
@AllArgsConstructor
// 自动生成无参构造器
@NoArgsConstructor
// 设置表头行高
@HeadRowHeight(30)
// 设置普通行行高
@ContentRowHeight(50)
public class EasyExcelEntity implements Serializable {
// 定义表头名称和位置,0代表第一列(标准编号);设置列宽
@ExcelProperty(value = {"一级标题", "标准编号"}, index = 0)
@ColumnWidth(30)
private Integer standardId;
// 定义表头名称和位置,1代表第二列(标准名称);设置列宽
@ExcelProperty(value = {"一级标题", "标准名称"}, index = 1)
@ColumnWidth(30)
private String standardName;
// 定义表头名称和位置,2代表第三列(标准类型);设置列宽
@ExcelProperty(value = {"一级标题", "标准类型"}, index = 2)
@ColumnWidth(30)
private String standardType;
// 定义表头名称和位置,3代表第四列(标准时间);设置列宽;设置日期时间格式
@ExcelProperty(value = {"一级标题", "标准时间"}, index = 3)
@ColumnWidth(50)
@DateTimeFormat(value = "yyyy-MM-dd HH:mm:ss")
private Date standardDate;
// 生成Excel时忽略该字段,不生成该列(标准描述)
@ExcelIgnore
private String standardDesc;
}
package com.kd.opt.util;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
/**
* EasyExcel实现Excel导出功能(工具类)
*
* @author 小辰哥哥
*/
@Component
public class EasyExcelUtil {
/**
* 导出Excel文件到指定路径下
*
* @param targetPath 目标路径
* @param excelName Excel文件名称
* @param sheetName Sheet页名称
* @param type Excel需要转换的类型(对应实体类.class)
* @param data Excel需要导出的数据
* @author 小辰哥哥
*/
public static void exportExcelPath(String targetPath, String excelName, String sheetName, Class type, List<Object> data) {
// 将指定的字符串连接到该字符串的末尾(设置文件的绝对路径)
String fileName = targetPath.concat(excelName).concat(ExcelTypeEnum.XLSX.getValue());
// 开始导出
EasyExcel.write(fileName, type).sheet(sheetName).doWrite(data);
}
/**
* 导出Excel文件到Web服务器下
*
* @param response 响应消息
* @param excelName Excel文件名称
* @param sheetName Sheet页名称
* @param type Excel需要转换的类型(对应实体类.class)
* @param data Excel需要导出的数据
* @author 小辰哥哥
*/
public static void exportExcelWeb(HttpServletResponse response, String excelName, String sheetName, Class type, List<Object> data) {
// 设置contentType类型
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("UTF-8");
try {
// 这里URLEncoder.encode可以防止中文乱码
excelName = URLEncoder.encode(excelName, "UTF-8");
// 设置请求头
response.setHeader("Content-disposition", "attachment;filename=" + excelName + ExcelTypeEnum.XLSX.getValue());
// 开始导出
EasyExcel.write(response.getOutputStream(), type).sheet(sheetName).doWrite(data);
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.kd.opt.controller;
import com.kd.opt.entity.EasyExcelEntity;
import com.kd.opt.util.EasyExcelUtil;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* EasyExcel实现Excel导入与导出功能
*
* @author 小辰哥哥
*/
@RestController
@CrossOrigin
@RequestMapping("/EasyExcelController")
public class EasyExcelController {
/**
* 导出Excel文件到指定路径下
*
* @author 小辰哥哥
*/
@GetMapping(value = "/exportExcelPath")
public void exportExcelPath() {
// 目标路径
String targetPath = "D:\\Java\\Opticket\\EasyExcel\\";
// Excel文件名称
String excelName = "Excel文件" + System.currentTimeMillis();
// Sheet页名称
String sheetName = "Excel文件Sheet页";
// 导入数据
List<Object> list = new ArrayList<>();
list.add(new EasyExcelEntity(1, "标准数据1", "完美", new Date(), "标准描述1"));
list.add(new EasyExcelEntity(2, "标准数据2", "糟糕", new Date(), "标准描述2"));
list.add(new EasyExcelEntity(3, "标准数据3", "凑合", new Date(), "标准描述3"));
list.add(new EasyExcelEntity(4, "标准数据4", "一般", new Date(), "标准描述4"));
list.add(new EasyExcelEntity(5, "标准数据5", "超帅", new Date(), "标准描述5"));
// 开始导出
EasyExcelUtil.exportExcelPath(targetPath, excelName, sheetName, EasyExcelEntity.class, list);
}
/**
* 导出Excel文件到Web服务器下
*
* @author 小辰哥哥
*/
@GetMapping(value = "/exportExcelWeb")
public void exportExcelWeb(HttpServletResponse response) {
// Excel文件名称
String excelName = "Excel文件" + System.currentTimeMillis();
// Sheet页名称
String sheetName = "Excel文件Sheet页";
// 导入数据
List<Object> list = new ArrayList<>();
list.add(new EasyExcelEntity(6, "标准数据6", "完美", new Date(), "标准描述6"));
list.add(new EasyExcelEntity(7, "标准数据7", "糟糕", new Date(), "标准描述7"));
list.add(new EasyExcelEntity(8, "标准数据8", "凑合", new Date(), "标准描述8"));
list.add(new EasyExcelEntity(9, "标准数据9", "一般", new Date(), "标准描述9"));
list.add(new EasyExcelEntity(10, "标准数据10", "超帅", new Date(), "标准描述10"));
// 开始导出
EasyExcelUtil.exportExcelWeb(response, excelName, sheetName, EasyExcelEntity.class, list);
}
}
测试1:导出Excel文件到指定路径下
http://localhost:9090/OperateTicket/EasyExcelController/exportExcelPath
http://localhost:9090/OperateTicket/EasyExcelController/exportExcelWeb
package com.kd.opt.listener;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.kd.opt.entity.EasyExcelEntity;
import com.kd.opt.service.StandardService;
import com.kd.opt.util.OptDataUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
/**
* EasyExcel实现Excel导入功能(需要配置监听器,传入相关实体类)
*
* @author 小辰哥哥
*/
public class EasyExcelListener extends AnalysisEventListener<EasyExcelEntity> {
// 日志打印
private static final Logger LOGGER = LoggerFactory.getLogger(EasyExcelListener.class);
// 每隔2条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
private static final int BATCH_COUNT = 2;
List list = new ArrayList<EasyExcelEntity>();
// 有个很重要的点EasyExcelListener不能被spring管理,要每次读取Excel都要new,然后里面用到spring构造方法可以传进去!!!
private StandardService standardService;
// 有参构造
public EasyExcelListener(StandardService standardService) {
this.standardService = standardService;
}
/**
* 每一条数据解析都会来调用
*
* @param easyExcelEntity
* @param analysisContext
* @author 小辰哥哥
*/
@Override
public void invoke(EasyExcelEntity easyExcelEntity, AnalysisContext analysisContext) {
LOGGER.debug("解析到一条数据:" + JSON.toJSONString(easyExcelEntity));
// 放入List集合中
list.add(easyExcelEntity);
if (list.size() >= BATCH_COUNT) {
LOGGER.debug("进行存库操作(省略)");
// 并清理List集合
list.clear();
}
}
/**
* 所有数据解析完成了,都会来调用(最后一次调用)
*
* @param analysisContext
* @author 小辰哥哥
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
LOGGER.debug("Excel文件所有数据解析完成!!!");
// 模拟与数据库交互
OptDataUtil optDataUtil = standardService.selectAll();
LOGGER.debug("模拟与数据库交互:" + optDataUtil.getData());
}
}
package com.kd.opt.controller;
import com.alibaba.excel.EasyExcel;
import com.kd.opt.entity.EasyExcelEntity;
import com.kd.opt.listener.EasyExcelListener;
import com.kd.opt.service.StandardService;
import com.kd.opt.util.EasyExcelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* EasyExcel实现Excel导入与导出功能
*
* @author 小辰哥哥
*/
@RestController
@CrossOrigin
@RequestMapping("/EasyExcelController")
public class EasyExcelController {
// 依赖注入,模拟与数据库进行交互
@Autowired
private StandardService standardService;
/**
* 导入指定路径下的Excel文件
*
* @author 小辰哥哥
*/
@GetMapping(value = "/readExcel")
public void readExcel() {
// Excel文件名称
String excelName = "D:\\Java\\Opticket\\EasyExcel\\Excel导入文件.xlsx";
// 开始导入
EasyExcel.read(excelName, EasyExcelEntity.class, new EasyExcelListener(standardService)).sheet().doRead();
}
/**
* 导入上传的Excel文件
*
* @author 小辰哥哥
*/
@PostMapping(value = "/readUploadExcel")
public void readUploadExcel(@RequestParam("file") MultipartFile fileName) {
try {
// 开始导入
EasyExcel.read(fileName.getInputStream(), EasyExcelEntity.class, new EasyExcelListener(standardService)).sheet().doRead();
} catch (IOException e) {
e.printStackTrace();
}
}
}
前端Vue代码(Element UI框架复用):
<el-upload
class="upload-demo"
:action="uploadUrl"
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"
multiple
:limit="3"
:on-exceed="handleExceed">
<el-button size="small" type="primary">点击上传</el-button>
</el-upload>
data() {
return {
// 请求后端服务器的接口地址
uploadUrl: this.$axios.defaults.baseURL + "/EasyExcelController/readUploadExcel"
}
methods: {
// 框架中的案例(可以忽略)
handleRemove(file, fileList) {
console.log(file, fileList);
},
handlePreview(file) {
console.log(file);
},
handleExceed(files, fileList) {
this.$message.warning(`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
},
beforeRemove(file, fileList) {
return this.$confirm(`确定移除 ${ file.name }?`);
}
}
测试1:导入指定路径下的Excel文件
http://localhost:9090/OperateTicket/EasyExcelController/readExcel
每天一个提升小技巧!!!