关于easyExcel在SpringBoot项目中的简单入门使用

项目目录结构如下:

 

 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.11</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zf</groupId>
<artifactId>easyExcelDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>easyExcelDemo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.4</version>
</dependency>

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>21.0</version>
</dependency>

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.41</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

ExcelReadController

package com.zf.easyexceldemo.controller;

import com.alibaba.excel.EasyExcel;
import com.zf.easyexceldemo.entity.UserEntity;
import com.zf.easyexceldemo.excellistener.UserListener;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

/**
* @Author zf
* @Description 不积跬步无以至千里
* @Date 2022/3/27 21:36
*/
@RestController
@RequestMapping("/upLoadExcel")
public class ExcelReadController {

/**
* 测试读取Excel文件
*
* @param file
* @return String
*/
@PostMapping("/read")
public String doDownLoad(MultipartFile file) throws IOException {
EasyExcel.read(file.getInputStream(), UserEntity.class, new UserListener()).sheet().doRead();
return "success";
}
}

ExcelWriteController

package com.zf.easyexceldemo.controller;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.google.common.collect.Lists;
import com.zf.easyexceldemo.entity.UserEntity;
import com.zf.easyexceldemo.excellistener.FreezeAndFilter;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
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.io.IOException;
import java.net.URLEncoder;
import java.util.Date;
import java.util.List;

/**
* @Author zf
* @Description 不积跬步无以至千里
* @Date 2022/3/27 21:27
*/
@RestController
@RequestMapping("/downLoadExcel")
public class ExcelWriteController {

/**
* 测试写入Excel文件
*
* @param response
* @throws IOException
*/
@GetMapping("/download") //http://127.0.0.1:8081/downLoadExcel/download
public void doDownLoad(HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("用户数据表单", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
EasyExcel.write(response.getOutputStream(), UserEntity.class).sheet("用户数据").registerWriteHandler(new FreezeAndFilter()).registerWriteHandler(horizontalCellStyleStrategy()).doWrite(getData());
//EasyExcel.write(response.getOutputStream(), UserEntity.class).sheet("模板").doWrite(getData());
}

public HorizontalCellStyleStrategy horizontalCellStyleStrategy() {
//1、头
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
//设置背景颜色
headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
//设置头字体
WriteFont headWriteFont = new WriteFont();
headWriteFont.setFontHeightInPoints((short) 13);
headWriteFont.setBold(true);
headWriteCellStyle.setWriteFont(headWriteFont);
//设置头居中
headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);

//2、内容策略
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
//设置 水平居中
contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
//设置边框样式
contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);//细实线
contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);

return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
}

/*
表格样式的设置
// 背景设置为红色
headWriteCellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());
WriteFont headWriteFont = new WriteFont();
headWriteFont.setFontHeightInPoints((short)20);
headWriteCellStyle.setWriteFont(headWriteFont);
// 内容的策略
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
// 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
// 背景绿色
contentWriteCellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex());
WriteFont contentWriteFont = new WriteFont();
// 字体大小
contentWriteFont.setFontHeightInPoints((short)20);
contentWriteCellStyle.setWriteFont(contentWriteFont);

//设置边框样式
contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);//细实线
contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
// 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
*/

/**
* 构造假数据,实际上应该从数据库查出来
*
* @return List<UserEntity>
*/
private List<UserEntity> getData() {
List<UserEntity> users = Lists.newArrayList();
for (int i = 1; i <= 99; i++) {
UserEntity user = new UserEntity();
user.setBirthday(new Date());
user.setName("user_" + i);
user.setSalary(1.285 * i);
user.setTelphone("1888888888" + i);
users.add(user);
}
return users;
}
}

UserEntity

package com.zf.easyexceldemo.entity;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.format.NumberFormat;
import com.alibaba.excel.annotation.write.style.ColumnWidth;

import java.util.Date;

/**
* @Author zf
* @Description 不积跬步无以至千里
* @Date 2022/3/27 21:16
*/
// 表示列宽
@ColumnWidth(20)
public class UserEntity {

// index--表示属性在第几列,value--表示标题
@ExcelProperty(value = "姓名", index = 0)
private String name;

// @DateTimeFormat--对日期格式的转换
@DateTimeFormat("yyyy-MM-dd")
@ExcelProperty(value = "生日", index = 1)
private Date birthday;

@ExcelProperty(value = "电话", index = 2)
private String telphone;

// @NumberFormat--对数字格式的转换
@NumberFormat("#.##")
@ExcelProperty(value = "工资", index = 3)
private double salary;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Date getBirthday() {
return birthday;
}

public void setBirthday(Date birthday) {
this.birthday = birthday;
}

public String getTelphone() {
return telphone;
}

public void setTelphone(String telphone) {
this.telphone = telphone;
}

public double getSalary() {
return salary;
}

public void setSalary(double salary) {
this.salary = salary;
}

}

FreezeAndFilter

package com.zf.easyexceldemo.excellistener;

import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;

public class FreezeAndFilter implements SheetWriteHandler {

public int colSplit = 0, rowSplit = 1, leftmostColumn = 0, topRow = 1;
//public String autoFilterRange = "1:1";
//设定筛选的表头范围
public String autoFilterRange = "A:D";

@Override
public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
}

@Override
public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
Sheet sheet = writeSheetHolder.getSheet();
//固定表头
sheet.createFreezePane(colSplit, rowSplit, leftmostColumn, topRow);
//设定筛选行
sheet.setAutoFilter(CellRangeAddress.valueOf(autoFilterRange));
}

}

UserListener

package com.zf.easyexceldemo.excellistener;

/**
* @Author zf
* @Description 不积跬步无以至千里
* @Date 2022/3/27 21:34
*/

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.zf.easyexceldemo.entity.UserEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

/**
* 1、注意监听器不能由spring容器管理,每次调用时都需要手动new
* 2、监听器内部需要使用ioc中的bean时,可以通过构造方法传入
*/
public class UserListener extends AnalysisEventListener<UserEntity> {

private List<UserEntity> data = Lists.newArrayList();

private static final Logger LOGGER = LoggerFactory.getLogger(UserListener.class);

/**
* 解析每条数据时都会调用
*/
@Override
public void invoke(UserEntity user, AnalysisContext context) {
data.add(user);
}

/**
* 所有数据解析完之后调用
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 可以在此处执行业务操作
// 本例就打印到控制台即可,表示读取完成
LOGGER.info(JSON.toJSONString(data.get(0)));
}

}

 

posted @ 2022-04-01 14:19  liftsail  阅读(1173)  评论(0编辑  收藏  举报