Skip to content
This repository was archived by the owner on Apr 11, 2025. It is now read-only.

Commit 5642187

Browse files
author
vpday
committed
Merge branch 'master' of https://github.com/biezhi/excel-plus
2 parents 8b62433 + c065d13 commit 5642187

File tree

18 files changed

+273
-356
lines changed

18 files changed

+273
-356
lines changed

README.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ Easier to read and generate an excel file, supports 2003 and 2007.
44

55
[![](https://img.shields.io/travis/biezhi/excel-plus.svg)](https://travis-ci.org/biezhi/excel-plus)
66
[![](https://img.shields.io/maven-central/v/io.github.biezhi/excel-plus.svg)](https://mvnrepository.com/artifact/io.github.biezhi/excel-plus)
7-
[![@biezhi on zhihu](https://img.shields.io/badge/zhihu-%40biezhi-red.svg)](https://www.zhihu.com/people/biezhi)
87
[![](https://img.shields.io/badge/license-Apache2-FF0080.svg)](https://github.com/biezhi/excel-plus/blob/master/LICENSE)
9-
[![](https://img.shields.io/github/followers/biezhi.svg?style=social&label=Follow%20Me)](https://github.com/biezhi)
108

119
<a href="https://biezhi.github.io/excel-plus/" target="_blank">中文文档</a>
1210

@@ -27,7 +25,7 @@ As maven dependency
2725
<dependency>
2826
<groupId>io.github.biezhi</groupId>
2927
<artifactId>excel-plus</artifactId>
30-
<version>0.1.2-RELEASE</version>
28+
<version>0.1.6.RELEASE</version>
3129
</dependency>
3230
```
3331

@@ -37,7 +35,7 @@ snapshot version
3735
<dependency>
3836
<groupId>io.github.biezhi</groupId>
3937
<artifactId>excel-plus</artifactId>
40-
<version>0.1.3-SNAPSHOT</version>
38+
<version>0.1.7-SNAPSHOT</version>
4139
</dependency>
4240
```
4341

@@ -81,6 +79,10 @@ See [here](https://github.com/biezhi/excel-plus/tree/master/src/test/java/io/git
8179

8280
**Custom export style**
8381

82+
# Thanks
83+
84+
- [ydq](https://github.com/ydq)
85+
8486
# License
8587

8688
[Apache2](https://github.com/biezhi/excel-plus/blob/master/LICENSE)

docs/README.md

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
<dependency>
4444
<groupId>io.github.biezhi</groupId>
4545
<artifactId>excel-plus</artifactId>
46-
<version>0.1.2-RELEASE</version>
46+
<version>0.1.6.RELEASE</version>
4747
</dependency>
4848
```
4949

@@ -69,6 +69,10 @@ public class CardSecret {
6969

7070
@ExcelField(order = 3, columnName = "过期时间", datePattern = "yyyy年MM月dd日")
7171
private Date expiredDate;
72+
73+
// 可跳过索引为 4 的列
74+
@ExcelField(order = 5, columnName = "使用情况", convertType = UsedTypeConverter.class)
75+
private Boolean used;
7276

7377
// getter setter 省略
7478
}
@@ -98,10 +102,10 @@ public class CardTypeConverter implements Converter<Integer> {
98102
```java
99103
ExcelPlus excelPlus = new ExcelPlus();
100104
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));
105109

106110
excelPlus.export(cardSecrets).writeAsFile(new File("卡密列表.xlsx"));
107111
```
@@ -110,9 +114,8 @@ excelPlus.export(cardSecrets).writeAsFile(new File("卡密列表.xlsx"));
110114
下面这个例子是从Excel 中读取数据到 Java List 容器,如果你想存储在 Set 里我相信你可以做到。
111115

112116
```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();
116119
```
117120

118121
没错,就是这么简单!如果有更加复杂或自定义的需求可以看下面的进阶使用。
@@ -124,9 +127,9 @@ List<CardSecret> cardList = excelPlus.read(
124127
有时候我们需要对读取的行数据做一下过滤,这时候就可以使用 `filter` 函数来筛选出合适的数据项。
125128

126129
```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();
130133
```
131134

132135
## 读取校验
@@ -136,19 +139,18 @@ List<CardSecret> readList = excelPlus.read(new File("卡密列表.xls"), CardSec
136139
实际工作中你可能将它们交由前端处理。
137140

138141
```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+
});
147149

148150
if (!result.isValid()) {
149151
result.errors().forEach(System.out::println);
150152
} else {
151-
System.out.println(result.rows().size());
153+
System.out.println(result.asList().size());
152154
}
153155
```
154156

@@ -161,8 +163,11 @@ if (!result.isValid()) {
161163
如果你对样式的操作不熟悉可以参考 POI 的列设置[文档](https://poi.apache.org/spreadsheet/quick-guide.html#Creating+Date+Cells)
162164

163165
```java
166+
// 构建数据
164167
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 -> {
166171
CellStyle headerStyle = workbook.createCellStyle();
167172
headerStyle.setAlignment(HorizontalAlignment.LEFT);
168173

@@ -174,15 +179,19 @@ excelPlus.export(Exporter.create(cardSecrets).headerStyle(workbook -> {
174179
headerFont.setBold(true);
175180
headerStyle.setFont(headerFont);
176181
return headerStyle;
177-
})).writeAsFile(new File("卡密列表.xls"));
182+
});
183+
184+
excelPlus.export(exporter)
185+
.writeAsFile(new File("卡密列表.xlsx"));
178186
```
179187

180188
## 浏览器下载
181189

182190
为了方便我们将数据库查询的数据直接输出到浏览器弹出下载,`excel-plus` 也做了一点 _手脚_ 让你一行代码就可以搞定。
183191

184192
```java
185-
excelPlus.export(data).writeAsResponse(ResponseWrapper.create(servletResponse, "xxx表格.xls"));
193+
excelPlus.export(exporter)
194+
.writeAsResponse(ResponseWrapper.create(servletResponse, "xxx表格.xls"))
186195
```
187196

188197
只需要将 `HttpServletResponse` 对象传入,并输入导出的文件名称,其他的都见鬼去吧。
@@ -205,22 +214,22 @@ excelPlus.export(Exporter.create(cardSecrets).byTemplate("tpl.xls")).writeAsFile
205214

206215
- `ExcelPlus`: 用于操作读取或导出 Excel 文档的类
207216
- `Converter`: 数据类型转换的顶层接口
208-
- `ExcelResult`: 当校验数据时候用于存储返回的错误消息和 `List` 数据
217+
- `ReaderResult`: 存储读取到的列表,包含校验不通过的消息
209218
- `Exporter`: 用于存储导出 Excel 文档时的配置,如样式、模板位置等
210219

211220
## 注解使用
212221

213222
该项目中有 4 个注解,分别是 `ExcelField``ExcelSheet``ReadField``WriteField`
214-
正常情况下你只会用到第一个注解,下面先来解释一下 `@ExcelField`
223+
正常情况下你只会用到第一个注解,下面解释一下 `@ExcelField`
215224

216225
<b>@ExcelField 注解</b>
217226

218227
| 选项 | 默认值 | 描述 |
219228
|-------------|----------------------|--------------------------------------------------------------------|
220-
| order | -1 | 用于标识 Excel 中的列索引,从0开始,该选项适用于读取或写入Excel |
221-
| columnName | 必选 | 导出Excel时的列名称,如:状态、姓名、手机号 |
222-
| datePattern || 日期格式化的pattern,对 DateLocalDateLocalDateTime 生效 |
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 接口,实现类需有无参构造函数 |
224233

225234
> `@ReadField``@WriteField` 是针对读取和写入的顺序不一致、日期格式不一致时的覆盖型注解,一般用不到。
226235
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<img src="media/logo.svg" alt="excel-plus" title="excel-plus" />
1+
<img src="_media/logo.svg" alt="excel-plus" title="excel-plus" />
22

33
> 提高生产力的 Excel 操作库
44
@@ -9,5 +9,3 @@
99

1010
[GitHub](https://github.com/biezhi/excel-plus)
1111
[快速开始](#快速开始)
12-
13-
![color](linear-gradient(to bottom, #cceaff 0%, #b4e4c0 100%))
File renamed without changes.

docs/index.html

Lines changed: 8 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -6,98 +6,18 @@
66
<meta name="description" content="excel-plus - 提高生产力的 Excel 操作库">
77
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
88
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
9-
<link rel="stylesheet" href="//unpkg.com/docsify/themes/buble.css">
10-
<style>
11-
body {
12-
background-color: #f9f9f9;
13-
}
14-
15-
table {
16-
border-spacing: .5rem;
17-
}
18-
19-
.cover-main img[alt="trilogy logo"] {
20-
margin-top: -3%;
21-
width: 420px;
22-
}
23-
24-
section.cover ul {
25-
text-align: left;
26-
padding-left: 150px;
27-
}
28-
29-
section.cover ul li{
30-
list-style-type: square;
31-
}
32-
.cover-main p > a {
33-
margin-top: 5%;
34-
35-
}
36-
section.cover .cover-main > p:last-child a{
37-
color: #257A2A;
38-
border-color: #257A2A;
39-
}
40-
41-
section.cover .cover-main > p:last-child a:last-child{
42-
background-color: #257A2A;
43-
}
44-
.markdown-section blockquote{
45-
border-left-color: #257A2A;
46-
}
47-
.sidebar-toggle span{
48-
background-color: #257A2A;
49-
}
50-
.markdown-section h3 {
51-
margin: 1.2em 0 1.2em;
52-
}
53-
54-
.markdown-section pre {
55-
border-left: 0;
56-
}
57-
58-
.markdown-section code,
59-
.markdown-section pre > code {
60-
font-family: "Operator Mono", "Fira Code", "Ubuntu Mono",
61-
"Droid Sans Mono", "Liberation Mono", "Source Code Pro",
62-
Menlo, Consolas, Inconsolata, Courier, monospace;
63-
font-size: 14px;
64-
background-color: #e8e8e8;
65-
border-radius: 0;
66-
}
67-
</style>
9+
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/vue.css">
6810
</head>
6911
<body>
7012
<div id="app"></div>
7113
</body>
7214

73-
<script>
74-
window.$docsify = {
75-
coverpage: 'cover.md',
76-
maxLevel: 3,
77-
name: 'Excel Plus',
78-
repo: 'https://github.com/biezhi/excel-plus',
79-
search: {
80-
noData: {
81-
'/': '没有找到'
82-
},
83-
paths: 'auto',
84-
placeholder: {
85-
'/': '搜索...'
86-
}
87-
},
88-
formatUpdated: '{MM}/{DD} {HH}:{mm}',
89-
plugins: [
90-
(hook, vm) => {
91-
hook.beforeEach(html => {
92-
var url = 'https://github.com/biezhi/excel-plus/blob/master/docs/' + vm.route.file
93-
var editHtml = '[📝 编辑文档](' + url + ')\n'
94-
return html + '\n----\n' + editHtml
95-
})
96-
}
97-
]
98-
}
99-
</script>
100-
<script src="//unpkg.com/docsify/lib/docsify.js"></script>
101-
<script src="//unpkg.com/docsify/lib/plugins/search.min.js"></script>
15+
<script
16+
src="//unpkg.com/docsify/lib/docsify.min.js"
17+
data-max-level="3"
18+
data-sidebar-toggle
19+
data-coverpage
20+
data-router></script>
21+
10222
<script src="//unpkg.com/prismjs/components/prism-java.js"></script>
10323
</html>

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>io.github.biezhi</groupId>
88
<artifactId>excel-plus</artifactId>
9-
<version>0.1.3-SNAPSHOT</version>
9+
<version>0.1.7-SNAPSHOT</version>
1010
<name>excel-plus</name>
1111
<url>https://biezhi.github.io/excel-plus</url>
1212
<description>excel read and write framework</description>

src/main/java/io/github/biezhi/excel/plus/ExcelPlus.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package io.github.biezhi.excel.plus;
1717

18+
import io.github.biezhi.excel.plus.enums.ExcelType;
1819
import io.github.biezhi.excel.plus.enums.ParseType;
1920
import io.github.biezhi.excel.plus.exception.ExcelException;
2021
import io.github.biezhi.excel.plus.handler.CSVHandler;
@@ -97,12 +98,10 @@ public void writeAsResponse(ResponseWrapper wrapper) throws ExcelException {
9798
public <T> ReaderResult<T> read(Class<T> type, Reader reader) throws ExcelException {
9899
List<Pair<Integer, T>> result;
99100
this.beforeCheck(reader);
100-
101-
boolean is2007 = reader.getExcelFile().getName().toLowerCase().endsWith(".xlsx");
102-
if (reader.getParseType().equals(ParseType.SAX) && is2007) {
101+
if (reader.getParseType().equals(ParseType.SAX) && reader.getExcelType() == ExcelType.XLSX) {
103102
result = new Excel2007Handler<>(type, reader).parse();
104103
} else {
105-
if (reader.getExcelFile().getName().endsWith(".csv")) {
104+
if (ExcelType.CSV == reader.getExcelType()) {
106105
result = new CSVHandler<>(type, reader).parse();
107106
} else {
108107
result = new DefaultExcelHandler<>(type, reader).parse();
@@ -115,12 +114,15 @@ private void beforeCheck(Reader reader) throws ExcelException {
115114
if (null == reader) {
116115
throw new ExcelException("Reader not is null.");
117116
}
118-
if (null == reader.getExcelFile()) {
117+
if (null == reader.getExcelFile() && null == reader.getInputStream()) {
119118
throw new ExcelException("Excel file not is null.");
120119
}
121120
if (null == reader.getParseType()) {
122121
throw new ExcelException("Excel parse type not is null.");
123122
}
123+
if (null == reader.getExcelType()) {
124+
throw new ExcelException("Excel file type not is null.");
125+
}
124126
if (reader.getSheetIndex() < 0) {
125127
throw new ExcelException("SheetIndex Can't be less than 0.");
126128
}

src/main/java/io/github/biezhi/excel/plus/handler/CSVHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public CSVHandler(Class<T> type, Reader reader) {
4646
@Override
4747
public List<Pair<Integer, T>> parse() throws ExcelException {
4848
List<Pair<Integer, T>> list = new ArrayList<>();
49-
try (InputStream in = new FileInputStream(reader.getExcelFile())) {
49+
try (InputStream in = reader.getExcelFile() != null ? new FileInputStream(reader.getExcelFile()) : reader.getInputStream()) {
5050
CSV csv = new CSV(true, ',', in);
5151
List<String> colNames = null;
5252
if (csv.hasNext()) colNames = new ArrayList<>(csv.next());

0 commit comments

Comments
 (0)