Skip to content

Commit 1c7572a

Browse files
committed
完善类型推导
1 parent 015ac78 commit 1c7572a

22 files changed

+640
-472
lines changed

README.md

Lines changed: 46 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
# ExcelReads(简单Excel通用读写器)
2+
3+
![Apache License, Version 2.0, January 2004](https://img.shields.io/github/license/apache/maven.svg?label=License)
4+
![Jenkins Status](https://img.shields.io/jenkins/s/https/builds.apache.org/job/maven-box/job/maven/job/master.svg?style=flat-square)
5+
26
## ExcelReads是什么?
37
* 这是一个通用的简单的Excel读取器
48
* 支持自定义JavaBean实体读取和HashMap自动读取
@@ -12,9 +16,16 @@
1216
## [更新日志详见:UpdateLogs.md](UPDATELOG.MD)
1317
###最近三次更新:
1418

19+
#### 更新2019/4/26 (诈尸更新)
20+
* 更加完善的类型推导,书写更方便(Great!!!)
21+
* 修复增加过滤列无法读取数据bug
22+
* 替换一些接口为Java8内置接口
23+
* 更流畅优雅的调用方法
24+
* 标注一些不建议使用的类/方法/属性
25+
1526
#### 更新2017/01/11
1627
* 增加AnyCol来对应FilterCol方法,只保留AnyCol类列
17-
* 增加SetCellStyle,突破CellStye绑定wk约束,链式设置列单元格风格(非常狗血)
28+
* 增加SetCellStyle,突破CellStyle绑定wk约束,链式设置列单元格风格(非常狗血)
1829

1930
#### 更新2017/01/09
2031
* 增加SetPath方法,随时切换保存路径
@@ -23,14 +34,6 @@
2334
* 增加SetOutputStream方法,可以放入自定义流,用于支持网页Response输出
2435
* 处理一些小bug,完善异常提示信息
2536

26-
#### 更新2017/01/06
27-
* 整合注解,导出和读取使用同一个ExcelAnno注解
28-
* 统一编码为UTF-8
29-
* 修复据库查询的导出(Object)递归越栈问题
30-
* 增加新的xxx.Class定义类型导出,操作更简单
31-
* 导出注解支持(自己使用seven.savewapper.anno.ExcelAnno类型注解)
32-
33-
3437
### 其他
3538
* 自定义读取支持出简单的规范化数据格式,即典型的表头格式
3639
* 可以继承 WapperMap 和 WapperObj进行扩展
@@ -39,138 +42,57 @@
3942
* 实体bean数据要比hashMap慢,7w条数据慢800ms,加入正则减慢速度(测试中加入了正则)
4043

4144
## 使用方法说明
42-
1. 本程序只能读取简单格式的xls文件,文件布局如下(标准的行列结构):<br>
45+
1. 本程序只能读取简单格式的xls/xlsx文件,文件布局如下(标准的行列结构):<br>
4346

4447
| 标题1 | 标题2 | 标题3 |
4548
|:-----:|:-----:|:-----:|
4649
|foo | foo | foo |
4750
|bar | bar | bar |
4851
|baz | baz | baz |
4952

50-
### 设置导出列风格
53+
### 读取Excel
54+
55+
* 喜大若奔(。・・)ノ Filter/Sort等lambda操作不用在声明类型(~~还是要写一个泛型~~)
5156
```java
52-
ExcelFactory.saveExcel(ps.executeQuery())
53-
.SetPath("seven007.xlsx")
54-
.ConvertName("name", "姓名")
55-
.ConvertName("address", "地址")
56-
.ConvertName("sex", "性别")
57-
.AnyCol(() -> new String[]{"name", "address", "sex"})
58-
.SetCellStyle("name", cellStyle ->
59-
cellStyle.setAlignment(HorizontalAlignment.CENTER)
60-
.setFillBackgroundColor(HSSFColor.RED.index))
61-
.SetCellStyle("address", cellStyle -> cellStyle
62-
.setFillPattern(FillPatternType.BRICKS)
63-
.setAlignment(HorizontalAlignment.RIGHT)
64-
.setFillForegroundColor(HSSFColor.WHITE.index)
65-
.setBottomBorderColor(HSSFColor.RED.index)
66-
.setFillBackgroundColor(HSSFColor.GOLD.index)
67-
.setRightBorderColor(HSSFColor.INDIGO.index)
68-
).Flush();
57+
//读取到Map类型
58+
//使用 .CreateMap(key_v) 生成Map<Key,Map>类型数据
59+
List<Map<String, String>> list = ExcelFactory.getBeans(filePath, WrapperFactory
60+
.MakeMap(it -> it.vocSize(1999).title(2).content(3)))
61+
.Filter(it -> !it.get("服务IP").contains("12"))
62+
.Process(it -> it.put("add", "这个是我增加的"))
63+
.FilterCol(df -> df.add("连接类型"))
64+
.CreateMap();
65+
66+
//读取到自定义JavaBean类型
67+
List<A> create = ExcelFactory.getBeans(filePath2, WrapperFactory.<A>MakeObj(it -> it.vocSize(1999)
68+
.title(0).content(1), A.class))
69+
.Filter(it -> it.getA().equals(""))
70+
.FilterCol(it -> it.add("1"))
71+
.Sort(Comparator.comparing(A::getA))
72+
.Create();
6973
```
7074
## 数据库导出自定义Bean类型写法(xxx.Class类型)
7175
```java
72-
ExcelFactory.saveExcel(
73-
UNPOOLED_DATA_SOURCE.getConnection().
74-
prepareStatement("select * FROM users_info limit 1000").executeQuery(),
75-
"\u5317\u4eac__Excel.xlsx",
76-
AS.class)
77-
.FilterCol(() -> new String[]{"updatetime"})
78-
.Filter((AS o) ->o.getA().length() > 3)
79-
.Save();
80-
76+
Result data=UNPOOLED_DATA_SOURCE.getConnection().prepareStatement("select * FROM users_info limit 1000").executeQuery()
77+
ExcelFactory.saveExcel(data,filePath,AS.class)
78+
.Filter(o->o.getA().length() > 3)
79+
.Flush();
8180

8281
//ConvertName 转行列名
83-
ExcelFactory.saveExcel(ps.executeQuery()).SetPath("seven2.xlsx")
84-
.Process((HashMap<String,String> o)->o
85-
.put("address",o.get("address")
86-
.concat("seven")))
82+
ExcelFactory.saveExcel(ps.executeQuery()).SetPath("seven.xlsx")
83+
.Process(it->it.put("address",it.get("address").concat("seven")))
84+
.SetCellStyle("A", cellStyle -> cellStyle
85+
.setFillPattern(FillPatternType.DIAMONDS)
86+
.setAlignment(HorizontalAlignment.RIGHT)
87+
.setFillForegroundColor(HSSFColor.WHITE.index)
88+
.setBottomBorderColor(HSSFColor.RED.index)
89+
.setFillBackgroundColor(HSSFColor.GOLD.index)
90+
.setRightBorderColor(HSSFColor.INDIGO.index))
8791
.ConvertName("address","地址")
8892
.ConvertName("name","姓名")
8993
.Flush();
9094
```
91-
## 数据库导出自定义Bean类型写法(自己实现包装)
92-
```java
93-
ExcelFactory.saveExcel(
94-
UNPOOLED_DATA_SOURCE.getConnection().
95-
prepareStatement("select * FROM users_info limit 1000").executeQuery(),
96-
"\u5317\u4eac__Excel.xlsx",
97-
res -> {
98-
AS a = new AS();
99-
a.setA(res.getString("name"));
100-
return a;
101-
})
102-
.FilterCol(() -> new String[]{"updatetime"})
103-
.Filter((AS o) ->o.getA().length() > 3)
104-
.Save();
105-
```
106-
## 数据库直接导出到Excel例子
107-
```java
108-
ExcelFactory.saveExcel(
109-
UNPOOLED_DATA_SOURCE.getConnection().
110-
prepareStatement("select * FROM users_info limit 10000").
111-
executeQuery(), "知乎导出Excel.xlsx")
112-
//过滤字段
113-
.FilterCol(() -> new String[]{"updatetime"})
114-
//过滤数据条件
115-
.Filter((HashMap<String, String> o) ->
116-
o.get("address").equals("\u5317\u4eac"))
117-
.Save();
11895

119-
```
120-
121-
## 自定义类型导出到Excel例子
122-
```java
123-
List<A> aa = new ArrayList<>();
124-
aa.add(new A("a", "b"));
125-
aa.add(new A("aa", "bb"));
126-
ExcelFactory.saveExcel(aa,
127-
System.getProperty("user.dir").concat("\\Save.xlsx"))
128-
///这里能够处理每一行数据
129-
.Process((A a) -> a.setA("xxxxxxx"))
130-
//过滤列
131-
.FilterCol(() -> new String[]{"B"})
132-
//根据某个字段来处理数据时候丢弃
133-
.Filter((A a) -> a.getA().length() > 1)
134-
//排序
135-
.Sort((A o1,A o2 ) -> o1.getAge()>o2.getAge()?1:o1.getAge()==o2.getAge()?0:-1)
136-
.Save();
137-
```
138-
## 读取Excel到Map例子
139-
```java
140-
List<Map<String,String>> data=ExcelFactory.getBeans(System.getProperty("user.dir").concat("\\测试.xls"),
141-
new ResWrapperMap() {
142-
@Override//配置Excel属性
143-
protected void LoadConfig(Config config) {
144-
config.setContent_row_start(3);
145-
config.setTitle_row(2);
146-
}
147-
}).//这里能够处理每一行数据
148-
Process((HashMap<String, String> o) -> System.out.println(o + "\n")
149-
//这里能够处理时候过滤某一列
150-
).FilterCol(() -> new String[]{}
151-
//这里能根据某一行的某一列的内容来取舍这行数据
152-
).Filter((HashMap<String, String> o) -> o.get("创建人") != null && o.get("创建人").length() > 5
153-
//排序
154-
).Sort((o1, o2) -> o1.hashCode()>o2.hashCode()?1:hashCode()==o2.hashCode()?0:-1).Create();
155-
156-
//使用 .CreateMap(key_v) 生成Map<Key,Map>类型数据
157-
158-
```
159-
## 读取Excel到自定义类型的例子
160-
161-
```java
162-
Map<String,Seven> map=new ResWrapperObj(Seven) {
163-
@Override
164-
protected void LoadConfig(Config config) {
165-
config.setContent_row_start(3);
166-
config.setTitle_row(2);
167-
}
168-
}).
169-
Process((HashMap<String, String> o) -> {}
170-
).FilterCol(() -> new String[]{}
171-
).Filter((HashMap<String, String> o) -> o.get("创建人") !=
172-
null &&o.get("创建人").length() > 4).<Map>CreateMap("创建人"));
173-
```
17496
## 效果
17597
![ExcelReads](效果.png)
17698
## 实体类截图
@@ -185,4 +107,4 @@ Map<String,Seven> map=new ResWrapperObj(Seven) {
185107
* 邮件(hacker.kill07@gmail.com)
186108
* QQ: 985390927
187109
* weibo: [@Alden_情绪控](http://weibo.com/Sweets07)
188-
* Blog: [http://sweets.cf](http://sweets.cf)
110+
* Blog: [http://blog.52python.cn](http://blog.52python.cn)

UPDATELOG.MD

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
## 更新纪录
22

3+
### 更新2017/01/06
4+
* 整合注解,导出和读取使用同一个ExcelAnno注解
5+
* 统一编码为UTF-8
6+
* 修复据库查询的导出(Object)递归越栈问题
7+
* 增加新的xxx.Class定义类型导出,操作更简单
8+
* 导出注解支持(自己使用seven.savewapper.anno.ExcelAnno类型注解)
9+
310
### 更新2017/01/11
411
* 增加AnyCol来对应FilterCol方法,只保留AnyCol类列
512
* 增加SetCellStyle,支持方法链式设置列单元格风格
@@ -26,7 +33,7 @@
2633
* 丢入Result参数后的操作就如同操作Map/Object一样
2734

2835
### 更新2017/01/01
29-
* 增加ResExprotDBMap&ResExprotDBObj用于支持数据库导出
36+
* 增加ResExportDBMap&ResExportDBObj用于支持数据库导出
3037
* 支持基于数据库查询的导出(Map),直接放入Result对象即可
3138
* 支持基于数据库查询的导出(Object),直接放入Result对象即可
3239

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@
2222
<version>4.12</version>
2323
<scope>test</scope>
2424
</dependency>
25+
<dependency>
26+
<groupId>org.slf4j</groupId>
27+
<artifactId>slf4j-api</artifactId>
28+
<version>1.7.25</version>
29+
</dependency>
2530
</dependencies>
2631
<build>
2732
<plugins>

src/main/java/seven/ExcelFactory.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package seven;
22

3+
import org.apache.poi.ss.formula.functions.T;
34
import seven.callBack.PackageDataInterface;
45
import seven.savewapper.SaveExcel;
56
import seven.savewapper.wapperRef.sysWppers.ResExportDBMap;
@@ -46,7 +47,7 @@ private ExcelFactory() {
4647
* @return
4748
* @throws Exception
4849
*/
49-
public static Wrapper getBeans(String FilePath, WrapperObj r) throws Exception {
50+
public static <T> Wrapper<T> getBeans(String FilePath, WrapperObj<T> r) throws Exception {
5051
return r.init(FilePath);
5152
}
5253

@@ -58,14 +59,14 @@ public static Wrapper getBeans(String FilePath, WrapperObj r) throws Exception {
5859
* @return
5960
* @throws Exception
6061
*/
61-
public static SaveExcel saveExcel(List<? extends Object> bean, String FilePath) throws Exception {
62+
public static <T> SaveExcel<T> saveExcel(List<? extends T> bean, String FilePath) throws Exception {
6263
if (bean.size() < 1) {
6364
throw new Exception("请传入数据");
6465
}
6566
if (bean.get(0) instanceof Map) {
66-
return new ResExportMap((List<Map>) bean, FilePath);
67+
return (SaveExcel<T>) new ResExportMap((List<Map>)bean, FilePath);
6768
}
68-
return new ResExportObj((List) bean, FilePath);
69+
return new ResExportObj(bean, FilePath);
6970
}
7071

7172
/**
Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package seven.callBack;
22

3+
import java.util.function.Predicate;
4+
35
/**
46
* [Github]https://github.com/MatrixSeven
57
* [Bolg]https://matrixseven.github.io/
@@ -8,12 +10,7 @@
810
* T为实体Bean类型
911
*/
1012
@FunctionalInterface
11-
public interface DataFilterInterface<T> {
12-
/**
13-
* 对要包装的数据进行过滤,对应实体Bean\n
14-
* 如果返回false将放弃此条数据
15-
* @param t 实体Bean类型
16-
* @return
17-
*/
18-
Boolean filter(T t);
13+
public interface DataFilterInterface<T> extends Predicate<T> {
14+
15+
1916
}
Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package seven.callBack;
22

33

4+
import java.util.function.Consumer;
45

56
/**
67
* [Github]https://github.com/MatrixSeven
@@ -10,11 +11,6 @@
1011
* T为实体Bean类型
1112
*/
1213
@FunctionalInterface
13-
public interface DataFilterProcessInterface<T>{
14-
/***
15-
* 此处传入每一行打包好的数据。对应一个实体,
16-
* 在process方法里可对属性进行处理加工
17-
* @param t 实体类型
18-
*/
19-
void process(T t);
14+
public interface DataFilterProcessInterface<T> extends Consumer<T> {
15+
2016
}

src/main/java/seven/callBack/imp/DefaultDataFilter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
* [Bolg]https://matrixseven.github.io/
88
* Created by seven on 2016/10/18.
99
*/
10-
public class DefaultDataFilter implements DataFilterInterface<Object>{
10+
public class DefaultDataFilter<T> implements DataFilterInterface<T>{
1111
@Override
12-
public Boolean filter(Object o) {
12+
public boolean test(T o) {
1313
return true;
1414
}
1515
}
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package seven.callBack.imp;
22

3+
import org.apache.poi.ss.formula.functions.T;
34
import seven.callBack.DataFilterProcessInterface;
45

56
/**
@@ -8,9 +9,10 @@
89
* Created by seven on 2016/10/18.
910
*/
1011
@SuppressWarnings("unchecked")
11-
public class DefaultDataProFilter implements DataFilterProcessInterface<Object> {
12+
public class DefaultDataProFilter<T> implements DataFilterProcessInterface<T> {
13+
1214
@Override
13-
public void process(Object o) {
15+
public void accept(T o) {
1416

1517
}
1618
}

0 commit comments

Comments
 (0)