依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.0</version>
</dependency>
工具类
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 org.apache.poi.ss.usermodel.*;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;
/**
* Excel 导出工具类
*/
public class EsayExcelUtil {
/**
* Excel 导出
* @param list:导出数据集合
* @param clazz:导出类型的class对象
* @param response:响应对象
* @param fileName:文件名称
* @param sheetName:sheet页对象
*/
public static Boolean writeExcel(List list, Class clazz, HttpServletResponse response, String fileName, String sheetName) throws IOException {
String file = URLEncoder.encode(fileName + ".xlsx", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + file);
response.setCharacterEncoding("utf-8");
ServletOutputStream outputStream = response.getOutputStream();
// 获取自定义单元格样式综合策略(表头 + 内容)对象
HorizontalCellStyleStrategy cellStyleStrategy = createStyle();
try {
EasyExcel.write(outputStream, clazz) // 参数1:输出流对象 参数2:实体类的class对象
.registerWriteHandler(cellStyleStrategy) // 设置单元格样式
.sheet(sheetName) // sheet页名称
.doWrite(list); // 导出的数据集合
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
outputStream.flush();
outputStream.close();
}
}
/**
* Excel 导出 -- 忽略sheet页名称
* @param list 导出数据集合
* @param clazz 类型
* @param response HttpServletResponse
* @param fileName 文件名称
*/
public static Boolean writeExcel(List list, Class clazz, HttpServletResponse response, String fileName) throws Exception {
String file = URLEncoder.encode(fileName + ".xlsx", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + file);
response.setCharacterEncoding("utf-8");
ServletOutputStream outputStream = response.getOutputStream();
try {
EasyExcel.write(outputStream, clazz).sheet().doWrite(list);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
outputStream.flush();
outputStream.close();
}
}
/**
* Excel 导出 -- 自动生成文件名称
* @param list:导出数据集合
* @param clazz:导出类型的class对象
* @param response:响应对象
*/
public static Boolean writeExcel(List list, Class clazz, HttpServletResponse response) throws Exception {
String fileName = System.currentTimeMillis() + "";
return writeExcel(list, clazz, response, fileName);
}
/**
* Excel 导出 -- 动态表头
* @param list:导出数据集合
* @param head:动态表头集合
* @param response:响应对象
* @param fileName:导出的文件名称
*/
public static Boolean writeExcel(List list, List<List<String>> head, HttpServletResponse response, String fileName) throws IOException {
String file = URLEncoder.encode(fileName + ".xlsx", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + file);
response.setCharacterEncoding("utf-8");
ServletOutputStream outputStream = response.getOutputStream();
try {
EasyExcel.write(outputStream)
.head(head) // 动态表头
.sheet()
.doWrite(list);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
outputStream.flush();
outputStream.close();
}
}
/**
* 自定义单元格样式
* @return :单元格样式策略对象
*/
private static HorizontalCellStyleStrategy createStyle(){
WriteCellStyle titleStyle = new WriteCellStyle(); // 表头格式对象
WriteCellStyle dataStyle = new WriteCellStyle(); // 表格格式对象
// 以下只针对表头格式,表格格式同理
titleStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); // 水平居中对齐
titleStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中
titleStyle.setWrapped(false); // 自动换行
titleStyle.setFillForegroundColor(IndexedColors.WHITE.index); // 单元格背景颜色
// 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色
// dataStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND); (表头默认了 FillPatternType所以可以不指定。)
// 字体样式设置
WriteFont font = new WriteFont();
font.setFontName("楷体"); // 字体
font.setFontHeightInPoints((short) 15); // 大小
font.setColor(IndexedColors.RED.index); // 颜色
font.setBold(true); // 加粗
font.setItalic(false); // 斜体
font.setStrikeout(false); // 过期横线
titleStyle.setWriteFont(font);
// 设置单元格边框样式
// setBorderStyle(titleStyle);
// 单元格格式策略对象(表头 + 内容)
return new HorizontalCellStyleStrategy(titleStyle, dataStyle);
}
/**
* 设置边框样式
*/
private static void setBorderStyle(WriteCellStyle style){
style.setBorderTop(BorderStyle.THIN); // 上边框样式
style.setBorderBottom(BorderStyle.THIN); // 下边框样式
style.setBorderLeft(BorderStyle.THIN); // 左边框样式
style.setBorderRight(BorderStyle.THIN); // 右边框样式
style.setTopBorderColor(IndexedColors.BLUE.index); // 上边框颜色
style.setBottomBorderColor(IndexedColors.BLUE.index); // 下边框颜色
style.setLeftBorderColor(IndexedColors.BLUE.index); // 左边框颜色
style.setRightBorderColor(IndexedColors.BLUE.index); // 右边框颜色
}
}
测试一下
第一步:创建导出的对象
import com.alibaba.excel.annotation.ExcelProperty;
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.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 注解 @HeadRowHeight(15): 表头的行高 -- 15
* 注解 @ContentRowHeight(20): 内容的行高 -- 20
* 注解 @ColumnWidth(10): 单元格列宽 -- 10 (可以放在属性名上面,会覆盖掉类上的注解)
* 注解 @ExcelProperty(value = "姓名", index = 0):
* value:表头 -- 姓名
* index:第几列 -- 0
* 注解 @ExcelProperty(value = {"主标题","子标题1"})
* 注解 @ExcelProperty(value = {"主标题","子标题2"})
* 合并单元格
*/
@Data // lombok注解:getter/setter方法
@NoArgsConstructor // 无参构造
@AllArgsConstructor // 全参构造
@HeadRowHeight(15) // 表头的行高
@ContentRowHeight(20) // 内容的行高
@ColumnWidth(10) // 列宽 -- (可以放在属性名上面,会覆盖掉类上的注解)
public class Student {
@ExcelProperty(value = "姓名", index = 0)
private String name;
@ExcelProperty(value = "年龄", index = 2)
private Integer age;
@ExcelProperty(value = "地址", index = 4)
private String address;
}
第二步:写测试接口
import org.springframework.stereotype.Controller;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@RequestMapping("/excel")
@Controller
public class ExcelController {
@GetMapping("/test")
public void test(HttpServletResponse response) throws Exception {
List<Student> data = getData();
EsayExcelUtil.writeExcel(data, Student.class, response);
}
/**
* 测试用的假数据
*/
private List<Student> getData(){
List<Student> list = new ArrayList<>();
list.add(new Student("张三", 23, "北京"));
list.add(new Student("李四", 24, "上海"));
list.add(new Student("王五", 25, "杭州"));
return list;
}
第三步:启动项目,访问接口
如图:
测试动态表头
import org.springframework.stereotype.Controller;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@RequestMapping("/excel")
@Controller
public class ExcelController {
@GetMapping("/test")
public void test(HttpServletResponse response) throws Exception {
String fileName = "测试Excel导出";
List<Student> data = getData();
List<List<String>> head = getHead();
EsayExcelUtil.writeExcel(data, head, response, fileName);
}
/**
* 动态表头假数据
*/
public static List<List<String>> getHead(){
List<List<String>> list = new ArrayList<>();
List<String> head1 = new ArrayList<>();
head1.add("我是姓名");
List<String> head2 = new ArrayList<>();
head2.add("我是年龄");
List<String> head3 = new ArrayList<>();
head3.add("我是地址");
list.add(head1);
list.add(head2);
list.add(head3);
return list;
}
/**
* 测试用的假数据
*/
private List<Student> getData(){
List<Student> list = new ArrayList<>();
list.add(new Student("张三", 23, "北京"));
list.add(new Student("李四", 24, "上海"));
list.add(new Student("王五", 25, "杭州"));
return list;
}
结果如图
就这样,再会!