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自动读取
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方法,随时切换保存路径
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进行扩展
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- " \u 5317\u 4eac__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- " \u 5317\u 4eac__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(" \u 5317\u 4eac" ))
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 )
0 commit comments