43
43
<dependency >
44
44
<groupId >io.github.biezhi</groupId >
45
45
<artifactId >excel-plus</artifactId >
46
- <version >0.1.2- RELEASE</version >
46
+ <version >0.1.6. RELEASE</version >
47
47
</dependency >
48
48
```
49
49
@@ -69,6 +69,10 @@ public class CardSecret {
69
69
70
70
@ExcelField (order = 3 , columnName = " 过期时间" , datePattern = " yyyy年MM月dd日" )
71
71
private Date expiredDate;
72
+
73
+ // 可跳过索引为 4 的列
74
+ @ExcelField (order = 5 , columnName = " 使用情况" , convertType = UsedTypeConverter . class)
75
+ private Boolean used;
72
76
73
77
// getter setter 省略
74
78
}
@@ -98,10 +102,10 @@ public class CardTypeConverter implements Converter<Integer> {
98
102
``` java
99
103
ExcelPlus excelPlus = new ExcelPlus ();
100
104
List<CardSecret > cardSecrets = new ArrayList<> ();
101
- cardSecrets. add(new CardSecret (1 , " vlfdzepjmlz2y43z7er4" , new BigDecimal (" 20" )));
102
- cardSecrets. add(new CardSecret (2 , " rasefq2rzotsmx526z6g" , new BigDecimal (" 10" )));
103
- cardSecrets. add(new CardSecret (2 , " 2ru44qut6neykb2380wt" , new BigDecimal (" 50" )));
104
- cardSecrets. add(new CardSecret (1 , " srcb4c9fdqzuykd6q4zl" , new BigDecimal (" 15" )));
105
+ cardSecrets. add(new CardSecret (1 , " vlfdzepjmlz2y43z7er4" , new BigDecimal (" 20" ), false ));
106
+ cardSecrets. add(new CardSecret (2 , " rasefq2rzotsmx526z6g" , new BigDecimal (" 10" ), false ));
107
+ cardSecrets. add(new CardSecret (2 , " 2ru44qut6neykb2380wt" , new BigDecimal (" 50" ), true ));
108
+ cardSecrets. add(new CardSecret (1 , " srcb4c9fdqzuykd6q4zl" , new BigDecimal (" 15" ), false ));
105
109
106
110
excelPlus. export(cardSecrets). writeAsFile(new File (" 卡密列表.xlsx" ));
107
111
```
@@ -110,9 +114,8 @@ excelPlus.export(cardSecrets).writeAsFile(new File("卡密列表.xlsx"));
110
114
下面这个例子是从Excel 中读取数据到 Java List 容器,如果你想存储在 Set 里我相信你可以做到。
111
115
112
116
``` java
113
- List<CardSecret > cardList = excelPlus. read(
114
- new File (" 卡密列表.xls" ),
115
- CardSecret . class). asList();
117
+ Reader reader = Reader . create(). excelFile(new File (" 卡密列表.xlsx" ));
118
+ List<CardSecret > cardList = excelPlus. read(CardSecret . class, reader). asList();
116
119
```
117
120
118
121
没错,就是这么简单!如果有更加复杂或自定义的需求可以看下面的进阶使用。
@@ -124,9 +127,9 @@ List<CardSecret> cardList = excelPlus.read(
124
127
有时候我们需要对读取的行数据做一下过滤,这时候就可以使用 ` filter ` 函数来筛选出合适的数据项。
125
128
126
129
``` java
127
- List< CardSecret > readList = excelPlus. read(new File ( " 卡密列表.xls " ), CardSecret . class)
128
- .filter(cardSecret - > ! cardSecret. getSecret(). isEmpty())
129
- .asList();
130
+ excelPlus. read(CardSecret . class, reader )
131
+ .filter(cardSecret - > ! cardSecret. getSecret(). isEmpty())
132
+ .asList();
130
133
```
131
134
132
135
## 读取校验
@@ -136,19 +139,18 @@ List<CardSecret> readList = excelPlus.read(new File("卡密列表.xls"), CardSec
136
139
实际工作中你可能将它们交由前端处理。
137
140
138
141
``` java
139
- ExcelResult<CardSecret > result = excelPlus
140
- .read(new File (" 卡密列表.xls" ), CardSecret . class)
141
- .valid(cardSecret - > {
142
- if (cardSecret. getAmount(). doubleValue() < 20 ) {
143
- return ValidRow . fail(" 最小金额为20" );
144
- }
145
- return ValidRow . ok();
146
- }). asResult();
142
+ ReaderResult<CardSecret > result = excelPlus. read(new File (" 卡密列表.xls" ), CardSecret . class)
143
+ .valid((index, cardSecret) - > {
144
+ if (! cardSecret. getUsed()){
145
+ return ValidRow . ok();
146
+ }
147
+ return ValidRow . fail(" 已经被使用" );
148
+ });
147
149
148
150
if (! result. isValid()) {
149
151
result. errors(). forEach(System . out:: println);
150
152
} else {
151
- System . out. println(result. rows (). size());
153
+ System . out. println(result. asList (). size());
152
154
}
153
155
```
154
156
@@ -161,8 +163,11 @@ if (!result.isValid()) {
161
163
如果你对样式的操作不熟悉可以参考 POI 的列设置[ 文档] ( https://poi.apache.org/spreadsheet/quick-guide.html#Creating+Date+Cells ) 。
162
164
163
165
``` java
166
+ // 构建数据
164
167
List<CardSecret > cardSecrets = this . buildCardSecrets();
165
- excelPlus. export(Exporter . create(cardSecrets). headerStyle(workbook - > {
168
+
169
+ Exporter<CardSecret > exporter = Exporter . create(cardSecrets);
170
+ exporter. headerStyle(workbook - > {
166
171
CellStyle headerStyle = workbook. createCellStyle();
167
172
headerStyle. setAlignment(HorizontalAlignment . LEFT );
168
173
@@ -174,15 +179,19 @@ excelPlus.export(Exporter.create(cardSecrets).headerStyle(workbook -> {
174
179
headerFont. setBold(true );
175
180
headerStyle. setFont(headerFont);
176
181
return headerStyle;
177
- })). writeAsFile(new File (" 卡密列表.xls" ));
182
+ });
183
+
184
+ excelPlus. export(exporter)
185
+ .writeAsFile(new File (" 卡密列表.xlsx" ));
178
186
```
179
187
180
188
## 浏览器下载
181
189
182
190
为了方便我们将数据库查询的数据直接输出到浏览器弹出下载,` excel-plus ` 也做了一点 _ 手脚_ 让你一行代码就可以搞定。
183
191
184
192
``` java
185
- excelPlus. export(data). writeAsResponse(ResponseWrapper . create(servletResponse, " xxx表格.xls" ));
193
+ excelPlus. export(exporter)
194
+ .writeAsResponse(ResponseWrapper . create(servletResponse, " xxx表格.xls" ))
186
195
```
187
196
188
197
只需要将 ` HttpServletResponse ` 对象传入,并输入导出的文件名称,其他的都见鬼去吧。
@@ -205,22 +214,22 @@ excelPlus.export(Exporter.create(cardSecrets).byTemplate("tpl.xls")).writeAsFile
205
214
206
215
- ` ExcelPlus ` : 用于操作读取或导出 Excel 文档的类
207
216
- ` Converter ` : 数据类型转换的顶层接口
208
- - ` ExcelResult ` : 当校验数据时候用于存储返回的错误消息和 ` List ` 数据
217
+ - ` ReaderResult ` : 存储读取到的列表,包含校验不通过的消息
209
218
- ` Exporter ` : 用于存储导出 Excel 文档时的配置,如样式、模板位置等
210
219
211
220
## 注解使用
212
221
213
222
该项目中有 4 个注解,分别是 ` ExcelField ` 、` ExcelSheet ` 、` ReadField ` 、` WriteField ` 。
214
- 正常情况下你只会用到第一个注解,下面先来解释一下 ` @ExcelField ` 。
223
+ 正常情况下你只会用到第一个注解,下面解释一下 ` @ExcelField ` 。
215
224
216
225
<b >@ExcelField 注解</b >
217
226
218
227
| 选项 | 默认值 | 描述 |
219
228
| -------------| ----------------------| --------------------------------------------------------------------|
220
- | order | -1 | 用于标识 Excel 中的列索引,从0开始,该选项适用于读取或写入Excel |
221
- | columnName | 必选 | 导出Excel时的列名称,如:状态、姓名、手机号 |
222
- | datePattern | 空 | 日期格式化的pattern ,对 Date、 LocalDate、 LocalDateTime 生效 |
223
- | convertType | EmptyConverter.class | 数据类型转换的类Class,实现自Converter接口 ,实现类需有无参构造函数 |
229
+ | ` order ` | -1 | 用于标识 Excel 中的列索引,从 0 开始,该选项适用于读取或写入 Excel |
230
+ | ` columnName ` | 必选 | 导出Excel时的列名称,如:状态、姓名、手机号 |
231
+ | ` datePattern ` | 空 | 日期格式化的 ` pattern ` ,对 ` Date ` 、 ` LocalDate ` 、 ` LocalDateTime ` 生效 |
232
+ | ` convertType ` | ` EmptyConverter.class ` | 数据类型转换的类 Class,实现自 Converter 接口 ,实现类需有无参构造函数 |
224
233
225
234
> ` @ReadField ` 和 ` @WriteField ` 是针对读取和写入的顺序不一致、日期格式不一致时的覆盖型注解,一般用不到。
226
235
0 commit comments