在之前写Excel导入导出功能的时候,使用更多的可能是apache的poi,相信用过poi的应该都会感觉poi使用起来还是有点点麻烦的,所以,如果你是:不太熟悉poi的、不想写太多重复太多的、只是简单的导入导出的。那么相信我,使用easypoi绝对很适合。
easypoi,正如同它的名字一样,主打的功能就是容易,让一个没见接触过poi的人员,就可以很方便的写出Excel导出、Excel导入,通过简单的注解就可以完成以前复杂的写法。
so,今天就用easypoi来做一个导出Excel的完整案例,项目是SpringBoot的项目
cn.afterturn
easypoi-base
3.2.0
cn.afterturn
easypoi-web
3.2.0
cn.afterturn
easypoi-annotation
3.2.0
注意:有的文章或者博客可能说可以不用上边三个依赖这么麻烦,直接用 easypoi-spring-boot-starter 一个依赖就可以了
但是,用easypoi-spring-boot-starter 这个可能会导致你的springboot项目jar包依赖冲突,所以还是推荐使用上边的三个依赖
import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 导出对应的实体类
*
* @author caoju
*/
@ExcelTarget("user")
@Data
public class User implements Serializable {
@Excel(name = "id",width=7)
private Integer id;
@Excel(name = "姓名",width=15)
private String name;
@Excel(name = "性别",replace = { "男_1", "女_2" },width=10)
private Integer sex;
@Excel(name = "创建时间",exportFormat = "yyyy-MM-dd HH:mm:ss",width=25)
private Date createTime;
}
不要看下面的两个类这么长,好像多复杂似的
别担心!就是个工具类而已啦~
你懂的,直接ctrl c、ctrl v(我也懂的,热爱编程的你,最喜欢的就是这个 c v大法,简单粗暴,不多bibi!hia hia hia~~~)
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import com.xiaoleilu.hutool.date.DateUtil;
import com.xiaoleilu.hutool.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Excel导出工具类
*
* @author caoju
*/
@Slf4j
public class ExcelUtils {
/** 允许导出的最大条数 */
private static final Integer EXPORT_EXCEL_MAX_NUM = 10000;
/**
* 导出Excel
*
* @param workbook workbook流
* @param fileName 文件名
* @param response 响应
*/
public static void exportExcel(Workbook workbook, String fileName, HttpServletResponse response) {
//给文件名拼接上日期
fileName = fileName + StrUtil.UNDERLINE + DateUtil.today();
//输出文件
try (OutputStream out = response.getOutputStream()) {
//获取文件名并转码
String name = URLEncoder.encode(fileName, "UTF-8");
//设置编码
response.setCharacterEncoding("UTF-8");
//设置http响应头告诉浏览器,以下载的形式处理响应的数据
response.setContentType("application/force-download");
//设置下载文件的默认名称
response.setHeader("Content-Disposition", "attachment;filename=" + name + ".xlsx");
//输出表格
workbook.write(out);
} catch (IOException e) {
log.error("文件导出异常,详情如下:", e);
} finally {
try {
if (workbook != null) {
//关闭输出流
workbook.close();
}
} catch (IOException e) {
log.error("文件导出异常,详情如下:", e);
}
}
}
/**
* 获取导出的 Workbook对象
*
* @param title 大标题
* @param sheetName 页签名
* @param object 导出实体
* @param list 数据集合
* @return Workbook
*/
public static Workbook getWorkbook(String title, String sheetName, Class object, List list) {
//判断导出数据是否为空
if (list == null) {
list = new ArrayList<>();
}
//判断导出数据数量是否超过限定值
if (list.size() > EXPORT_EXCEL_MAX_NUM) {
title = "导出数据行数超过:" + EXPORT_EXCEL_MAX_NUM + "条,无法导出、请添加查询条件后再进行导出!";
list = new ArrayList<>();
}
//导出参数
ExportParams exportParams = new ExportParams(title, sheetName, ExcelType.XSSF);
//设置导出样式,可以不设置使用默认的样式,这里用的是自定义样式
exportParams.setStyle(ExcelStyle.class);
//输出Workbook流
return ExcelExportUtil.exportExcel(exportParams, object, list);
}
/**
* 获取导出的 Workbook对象
*
* @param path 模板路径
* @param map 导出内容map
* @return Workbook
*/
public static Workbook getWorkbook(String path, Map map) {
//获取导出模板
TemplateExportParams params = new TemplateExportParams(path);
//设置导出样式
params.setStyle(ExcelStyle.class);
//输出Workbook流
return ExcelExportUtil.exportExcel(params, map);
}
}
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.afterturn.easypoi.excel.entity.params.ExcelForEachParams;
import cn.afterturn.easypoi.excel.export.styler.ExcelExportStylerDefaultImpl;
import cn.afterturn.easypoi.excel.export.styler.IExcelExportStyler;
import org.apache.poi.ss.usermodel.*;
/**
* Excel导出自定义样式类
*
* @author caoju
*/
public class ExcelStyle extends ExcelExportStylerDefaultImpl implements IExcelExportStyler {
private static final short STRING_FORMAT = (short) BuiltinFormats.getBuiltinFormat("TEXT");
private static final short FONT_SIZE_TEN = 10;
private static final short FONT_SIZE_ELEVEN = 11;
private static final short FONT_SIZE_TWELVE = 12;
/**
* 大标题样式
*/
private CellStyle headerStyle;
/**
* 每列标题样式
*/
private CellStyle titleStyle;
/**
* 数据行样式
*/
private CellStyle styles;
public ExcelStyle(Workbook workbook) {
super(workbook);
this.init(workbook);
}
/**
* 初始化样式
*
* @param workbook
*/
private void init(Workbook workbook) {
//大标题样式
this.headerStyle = initHeaderStyle(workbook);
//每列标题样式
this.titleStyle = initTitleStyle(workbook);
//数据行样式
this.styles = initStyles(workbook);
}
/**
* 大标题样式
*
* @param color
* @return
*/
@Override
public CellStyle getHeaderStyle(short color) {
return headerStyle;
}
/**
* 每列标题样式
*
* @param color
* @return
*/
@Override
public CellStyle getTitleStyle(short color) {
return titleStyle;
}
/**
* 数据行样式
*
* @param parity 可以用来表示奇偶行
* @param entity 数据内容
* @return 样式
*/
@Override
public CellStyle getStyles(boolean parity, ExcelExportEntity entity) {
return styles;
}
/**
* 获取样式方法
*
* @param dataRow 数据行
* @param obj 对象
* @param data 数据
*/
@Override
public CellStyle getStyles(Cell cell, int dataRow, ExcelExportEntity entity, Object obj, Object data) {
return getStyles(true, entity);
}
/**
* 模板使用的样式设置
*/
@Override
public CellStyle getTemplateStyles(boolean isSingle, ExcelForEachParams excelForEachParams) {
return null;
}
/**
* 初始化--大标题样式
*
* @param workbook
* @return
*/
private CellStyle initHeaderStyle(Workbook workbook) {
CellStyle style = getBaseCellStyle(workbook);
style.setFont(getFont(workbook, FONT_SIZE_TWELVE, true));
return style;
}
/**
* 初始化--每列标题样式
*
* @param workbook
* @return
*/
private CellStyle initTitleStyle(Workbook workbook) {
CellStyle style = getBaseCellStyle(workbook);
style.setFont(getFont(workbook, FONT_SIZE_ELEVEN, false));
//背景色 POI IndexedColors 编码 与 颜色枚举类 对照 : https://blog.csdn.net/ju_362204801/article/details/106079171
style.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
return style;
}
/**
* 初始化--数据行样式
*
* @param workbook
* @return
*/
private CellStyle initStyles(Workbook workbook) {
CellStyle style = getBaseCellStyle(workbook);
style.setFont(getFont(workbook, FONT_SIZE_TEN, false));
style.setDataFormat(STRING_FORMAT);
return style;
}
/**
* 基础样式
*
* @return
*/
private CellStyle getBaseCellStyle(Workbook workbook) {
CellStyle style = workbook.createCellStyle();
//下边框
style.setBorderBottom(BorderStyle.THIN);
//左边框
style.setBorderLeft(BorderStyle.THIN);
//上边框
style.setBorderTop(BorderStyle.THIN);
//右边框
style.setBorderRight(BorderStyle.THIN);
//水平居中
style.setAlignment(HorizontalAlignment.CENTER);
//上下居中
style.setVerticalAlignment(VerticalAlignment.CENTER);
//设置自动换行
style.setWrapText(true);
return style;
}
/**
* 字体样式
*
* @param size 字体大小
* @param isBold 是否加粗
* @return
*/
private Font getFont(Workbook workbook, short size, boolean isBold) {
Font font = workbook.createFont();
//字体样式
font.setFontName("宋体");
//是否加粗
font.setBold(isBold);
//字体大小
font.setFontHeightInPoints(size);
return font;
}
}
再说一下哈,上边面两个类虽然很长,但就是个工具类而已啦~
不多说!你懂的!直接ctrl c、ctrl v
import com.google.common.collect.Lists;
import com.qtyc.utils.ExcelUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List;
/**
* 导出Excel测试Controller
*
* @author caoju
*/
@RestController
public class ExcelExportController {
/**
* 导出Excel测试
*/
@RequestMapping(value = "/exportExcelTest", method = RequestMethod.GET)
public void exportExcelTest(HttpServletResponse response) {
List personList = this.findUser();
ExcelUtils.exportExcel(ExcelUtils.getWorkbook("用户信息列表", "用户信息", User.class, personList), "用户信息列表导出", response);
}
/**
* 模拟数据库查询返回用户信息
*/
private List findUser() {
List list = Lists.newArrayList();
User user = new User();
user.setId(10);
user.setName("张三");
user.setSex(1);
user.setCreateTime(new Date());
list.add(user);
User user1 = new User();
user1.setId(26);
user1.setName("李四");
user1.setSex(1);
user1.setCreateTime(new Date());
list.add(user1);
User user2 = new User();
user2.setId(28);
user2.setName("王丽");
user2.setSex(2);
user2.setCreateTime(new Date());
list.add(user2);
return list;
}
}
浏览器输入:http://localhost:8082/exportExcelTest
可以看到浏览器左下角弹出了下载窗口,自动下载了Excel
打开下载的文件夹可以看到刚才下载的Excel
打开Excel看下里边的内容
可以看到咱们想要导出的内容已经导出了,其中的标题,表头,以及每行每列的背景颜色,字体等等都可以通过代码根据自己的需求来自定义的。它的颜色设置是个枚举类,但是通过枚举类不能够直观的看到对应的颜色,所以我写了一篇博客,上边有颜色枚举类对应的颜色,看起来很直观,需要的话,可以打开看看:easypoi或者POI导出Excel时 IndexedColors 编码枚举值 与 颜色 对照
觉得对你有帮助的话,可以点个关注,点个赞,3Q~