# Excel导出导入工具POI-Excel
**Repository Path**: myzhiqiang/poi-excel
## Basic Information
- **Project Name**: Excel导出导入工具POI-Excel
- **Description**: 屏蔽POI细节,学习成本低,简单快速上手,且满足绝大多数业务场景。导出支持复杂表头和尾部设计,以及单元格样式自定义支持。纯编码实现去除烦人的各种POJO
- **Primary Language**: Java
- **License**: MIT
- **Default Branch**: master
- **Homepage**: https://gitee.com/stupid1t/poi-excel
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 179
- **Created**: 2020-09-22
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
[](https://996.icu)
[](https://github.com/996icu/996.ICU/blob/master/LICENSE)
# Poi-Excel
#### maven使用方式
```java
com.github.stupdit1t
poi-excel
1.5
```
### 优势
> 1. 简单快速上手,且满足绝大多数业务场景
> 2. 屏蔽POI细节,学习成本低。
> 3. 未使用注解方式实现,纯编码代码块,去除烦人的各种POJO
> 4. 功能强大,导入支持严格的单元格校验,导出支持复杂表头和尾部设计,以及单元格样式自定义支持
### 导入细节
1. 支持严格的单元格校验,可以定位到单元格坐标校验
2. 支持数据行的图片导入
3. 支持导入过程中,对数据处理添加回调逻辑,满足其他业务场景
4. xls和xlsx都支持导入
### 导出细节
1. 支持傻瓜式定义动态表头+表尾,如列标题的定义和尾部合计行定义
2. 支持Map/复杂对象(可为Map或者对象嵌套,导出的列则可定义为school.manager.name)/模板/图片导出
3. 支持回调逻辑,处理业务数据化再导出,灵活
4. 支持全局或者局部单元格的样式设置,如颜色大小定位背景色等等
5. xls和xlsx都支持导出
6. 支持多sheet合并导出,多个sheet就可以利用多线程加速导出
7. 支持大数据内存导出,防止OOM,选择SXSSFWorkbook
### 选择xls还是xlsx?
1. xls速度较快,单sheet最大65535行,体积大
2. xlsx速度慢,单sheet最大1048576行,体积小
## 主要功能:
### 导入
1.简单的导入:
```java
// 1.获取源文件
Workbook wb = WorkbookFactory.create(new FileInputStream("src\\test\\java\\excel\\imports\\import.xlsx"));
// 2.获取sheet0导入
Sheet sheet = wb.getSheetAt(0);
// 3.生成VO数据
//参数:1.生成VO的class类型;2.校验规则;3.导入的sheet;3.从第几行导入;4.尾部非数据行数量
ImportRspInfo list = ExcelUtils.parseSheet(ProjectEvaluate.class, EvaluateVerifyBuilder.getInstance(), sheet, 3, 2);
if (list.isSuccess()) {
// 导入没有错误,打印数据
System.out.println(JSON.toJSONString(list.getData()));
} else {
// 导入有错误,打印输出错误
System.out.println(list.getMessage());
}
```
2.复杂导入,带图片导入,带回调处理
```java
// 1.获取源文件
Workbook wb = WorkbookFactory.create(new FileInputStream("src\\test\\java\\excel\\imports\\import.xlsx"));
// 2.获取sheet0导入
Sheet sheet = wb.getSheetAt(0);
// 3.生成VO数据
//参数:1.生成VO的class类型;2.校验规则;3.导入的sheet;3.从第几行导入;4.尾部非数据行数量;5.导入每条数据的回调
ImportRspInfo list = ExcelUtils.parseSheet(ProjectEvaluate.class, ProjectVerifyBuilder.getInstance(), sheet, 3, 2, (row, rowNum) -> {
//1.此处可以完成更多的校验
if(row.getAreaName() == "中青旅"){
throw new POIException("第"+rowNum+"行,区域名字不能为中青旅!");
}
//2.图片导入,再ProjectEvaluate定义类型为byte[]的属性就可以,ProjectVerifyBuilder定义ImgVerfiy校验列.就OK了
});
if (list.isSuccess()) {
// 导入没有错误,打印数据
System.out.println(JSON.toJSONString(list.getData()));
//打印图片byte数组长度
byte[] img = list.getData().get(0).getImg();
System.out.println(img);
} else {
// 导入有错误,打印输出错误
System.out.println(list.getMessage());
}
```
3.自定义校验器,导入需要校验字段,必须继承AbstractVerifyBuidler
```java
public class ProjectVerifyBuilder extends AbstractVerifyBuidler {
private static ProjectVerifyBuilder builder = new ProjectVerifyBuilder();
public static ProjectVerifyBuilder getInstance() {
return builder;
}
/**
* 定义列校验实体:提取的字段、提取列、校验规则
*/
private ProjectVerifyBuilder() {
cellEntitys.add(new CellVerifyEntity("projectName", "B", new StringVerify("项目名称", true)));
cellEntitys.add(new CellVerifyEntity("areaName", "C", new StringVerify("所属区域", true)));
cellEntitys.add(new CellVerifyEntity("province", "D", new StringVerify("省份", true)));
cellEntitys.add(new CellVerifyEntity("city", "E", new StringVerify("市", true)));
cellEntitys.add(new CellVerifyEntity("people", "F", new StringVerify("项目所属人", true)));
cellEntitys.add(new CellVerifyEntity("leader", "G", new StringVerify("项目领导人", true)));
cellEntitys.add(new CellVerifyEntity("scount", "H", new IntegerVerify("总分", true)));
cellEntitys.add(new CellVerifyEntity("avg", "I", new DoubleVerify("历史平均分", true)));
cellEntitys.add(new CellVerifyEntity("createTime", "J", new DateTimeVerify("创建时间", "yyyy-MM-dd HH:mm", true)));
cellEntitys.add(new CellVerifyEntity("img", "K", new ImgVerify("图片", false)));
// 必须调用
super.init();
}
}
```
#### 导入示例图

### 导出
0.基础数据构建
```java
/**
* 单sheet数据
*/
static List sheetData = new ArrayList<>();
/**
* map型数据
*/
static List