# easyexcel-basic-demo
**Repository Path**: zhang_banglong/easyexcel-basic-demo
## Basic Information
- **Project Name**: easyexcel-basic-demo
- **Description**: 使用easyExcel导出文件 参考
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 2
- **Created**: 2020-08-13
- **Last Updated**: 2024-08-26
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# easyexcel-basic-demo
#### ExcelUtil对easyexcel2.X进行封装,实现一个方法完成简单的excel导入和导出。
#### 使用介绍:https://evanwang.blog.csdn.net/article/details/105267953
# 一. 背景
主流office文档操作组件性能比较
| 组件 | 功能简介 | 使用场景 | 测试环境 | 内存消耗 | 读取时间 | 写入时间 | 文件大小 |
| ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ |
| poi |1. 对Microsoft Office格式档案读和写的功能
2. HSSF提供读写Excel XLS
3. HPSF提供读写OLE2 Property Sets
4. POIFS提供读写OLE2 Filesystem |1. 操作Excel XLS
2. HSSFWorkbook只能解析2003之前版本xls格式
3. 使用HSSF时sheet最大行数65536,最大列数256| Win64 4核8g jdk1.8 5万行2列excel xls | R:206.88MB W:138.34MB | 1049ms | 2005ms | 4.15MB |
| poi-ooxml |1. poi升级扩展版本
2. XSSF提供读写XLSX
3. XSLF提供读写PPTX
4. XWPF提供读写DOCX
5. CommonSS读写XLS、XLSX |1. 操作pptx、docx、xlsx等
2. XSSF基于内存写入方式,一个sheet最大行数1048576,最大列数16384
3. SXSSF是在XSSF基础上基于内存+磁盘写入方式,用于大数据量的导出 | Win64 4核8g jdk1.8 5万行2列excel xlsx/5万行word docx | XSSF-R:185.04MB XSSF-W:405.58MB SXSSF-R:140.34MB SXSSF-W:41.83MB XWPF-R:23.14MB XWPF-W:158.21MB |XSSF:2502ms SXSSF:1354ms XWPF:634ms | XSSF:4644ms SXSSF:1417ms XWPF:21555ms |XSSF:1.36MB SXSSF:1.33MB XWPF:999KB |
| poi-scratchpad |1. HWPF提供读写Word DOC
2. HSLF提供读写PPT
3. HDGF提供读Visio VSD
4. HPBF提供读Publisher PUB
5. HSMF提供读Outlook MSG
|1. 操作PPT、DOC、VSD、PUB、MSG等格式
2. HWPFDocument写doc文件必须要先有doc文件
3. 不建议使用HWPF等低版本office |Win64 4核8g jdk1.8 5万行word doc |R:81.80MB W:90.39MB |221ms |538ms |3.74MB |
| easyexcel |阿里开源,重写了poi对Excel2007版的解析,不会出现OOM,2003版依赖POI的sax模式 | xls、xlsx操作 |Win64 4核8g jdk1.8 5万行2列xlsx |R:80.10MB W:60.56MB |1053ms | 1149ms | 1.33MB |
# 二. 依赖
目前easyexcel的版本是最新的正式版为 2.1.6
```
com.alibaba
easyexcel
2.1.6
```
# 三. 需要的类
## 1. ExcelUtil
工具类,可以直接调用该工具类的方法完成 Excel 的读写
## 2. ExcelListener
监听类,可以根据需要,自定义处理获取到的数据
## 3. BeanConvert
Object与实体类转换工具类
## 4. lombok(非必须)
一款提高开发效率的插件,可以不用再去写getter,setter方法等。
# 四. 读取 Excel
读取 Excel 时只需要调用 ```ExcelUtil.readExcel()``` 方法
```
@PostMapping(value = "/import")
public List read(MultipartFile excel){
return ExcelUtil.readExcel(excel, ImportModel.class,0);
}
```
其中 excel 是 MultipartFile 类型的文件对象,而 ImportModel 是该 Excel 所映射的实体对象,如:
```
@Data
public class ImportModel {
@ExcelProperty(index = 0)
private String date;
@ExcelProperty(index = 1)
private String author;
@ExcelProperty(index = 2)
private String book;
}
```
作为映射实体类,通过 @ExcelProperty 注解与 index 变量可以标注成员变量所映射的列,同时不可缺少 setter 方法
# 五. 导出 Excel
### 1. 简单导出Excel
只需要调用 ```ExcelUtil.writeExcel()``` 方法:
```
@GetMapping(value = "/export")
public void writeExcel(HttpServletResponse response) {
List list = getList();
String fileName = "Excel导出测试";
String sheetName = "sheet1";
ExcelUtil.writeDynamicHeadExcel(response, list, fileName, sheetName, ExportModel.class, head());
}
private List getList() {
List modelList = new ArrayList<>();
ExportModel firstModel = new ExportModel();
firstModel.setName("李明");
firstModel.setSex("男");
firstModel.setAge(20);
modelList.add(firstModel);
ExportModel secondModel = new ExportModel();
secondModel.setName("珍妮");
secondModel.setSex("女");
secondModel.setAge(19);
modelList.add(secondModel);
return modelList;
}
private List> head() {
List> headList = new ArrayList<>();
List nameHead = new ArrayList<>();
nameHead.add("姓名");
List genderHead = new ArrayList<>();
genderHead.add("性别");
List ageHead = new ArrayList<>();
ageHead.add("年龄");
headList.add(nameHead);
headList.add(genderHead);
headList.add(ageHead);
return headList;
}
```
fileName,sheetName 分别是导出文件的文件名和 sheet 名,ExportModel 为导出数据的映射实体对象,list 为导出数据。
对于映射实体类,可以根据可以通过 @ExcelProperty 注解自定义表头,通过@ContentRowHeight注解设置内容行高,@HeadRowHeight设置表头行高,@ColumnWidth设置列宽等,如:
```
@ContentRowHeight(20)
@HeadRowHeight(25)
@ColumnWidth(25)
@Data
public class ExportModel {
@ExcelProperty(value = "姓名" ,index = 0)
private String name;
@ExcelProperty(value = "性别" ,index = 1)
private String sex;
@ExcelProperty(value = "年龄" ,index = 2)
private Integer age;
}
```
value 为列名;index 为列的序号,可为null
### 2. 设置动态表头
调用 ```ExcelUtil.writeDynamicHeadExcel()``` 方法:
```
public void writeDynamicHeadExcel(HttpServletResponse response) throws IOException {
List list = new ArrayList<>();
ExportModel model1 = new ExportModel();
model1.setName("孙悟空");
model1.setSex("男");
model1.setAge(500);
list.add(model1);
ExportModel model2 = new ExportModel();
model2.setName("哪吒");
model2.setSex("女");
model2.setAge(499);
list.add(model2);
List> headList = new ArrayList>();
List head0 = new ArrayList();
head0.add("姓甚名啥");
List head1 = new ArrayList();
head1.add("是男是女");
List head2 = new ArrayList();
head2.add("贵庚几何");
headList.add(head0);
headList.add(head1);
headList.add(head2);
ExcelUtil.writeDynamicHeadExcel(response, list, fileName, sheetName, ExportModel.class,headList);
}
```
write时不传入class,table时传入并设置needHead为false
### 3. 导出表格带样式
调用 ```ExcelUtil.writeStyleExcel()``` 方法:可根据实际需要自行定制。
```
public static void writeStyleExcel(HttpServletResponse response,List list, String fileName, String sheetName, Class clazz) {
//表头策略
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
//背景浅灰
headWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.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.LIGHT_GREEN.getIndex());
WriteFont contentWriteFont = new WriteFont();
//字体大小
contentWriteFont.setFontHeightInPoints((short)15);
contentWriteCellStyle.setWriteFont(contentWriteFont);
HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
OutputStream outputStream = getOutputStream(response, fileName);
EasyExcel.write(outputStream, clazz).registerWriteHandler(horizontalCellStyleStrategy).sheet(sheetName).doWrite(list);
}
```