Browse Source

Merge pull request #2472 from alibaba/developing

Developing
pull/2473/head v3.1.0
Jiaju Zhuang 3 years ago committed by GitHub
parent
commit
03659b3072
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 21
      .github/workflows/ci.yml
  2. 2
      .gitignore
  3. 1
      .mvn/jvm.config
  4. BIN
      .mvn/wrapper/maven-wrapper.jar
  5. 20
      .mvn/wrapper/maven-wrapper.properties
  6. 36
      README.md
  7. 156
      README_EN.md
  8. 43
      easyexcel-core/pom.xml
  9. 0
      easyexcel-core/src/main/java/com/alibaba/excel/EasyExcel.java
  10. 0
      easyexcel-core/src/main/java/com/alibaba/excel/EasyExcelFactory.java
  11. 25
      easyexcel-core/src/main/java/com/alibaba/excel/ExcelReader.java
  12. 26
      easyexcel-core/src/main/java/com/alibaba/excel/ExcelWriter.java
  13. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/ExcelAnalyser.java
  14. 13
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java
  15. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/ExcelReadExecutor.java
  16. 28
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/csv/CsvExcelReadExecutor.java
  17. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/IgnorableXlsRecordHandler.java
  18. 2
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/XlsListSheetListener.java
  19. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/XlsRecordHandler.java
  20. 3
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/XlsSaxAnalyser.java
  21. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/AbstractXlsRecordHandler.java
  22. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/BlankRecordHandler.java
  23. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/BofRecordHandler.java
  24. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/BoolErrRecordHandler.java
  25. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/BoundSheetRecordHandler.java
  26. 5
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/DummyRecordHandler.java
  27. 1
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/EofRecordHandler.java
  28. 1
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/FormulaRecordHandler.java
  29. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/HyperlinkRecordHandler.java
  30. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/IndexRecordHandler.java
  31. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/LabelRecordHandler.java
  32. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/LabelSstRecordHandler.java
  33. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/MergeCellsRecordHandler.java
  34. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/NoteRecordHandler.java
  35. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/NumberRecordHandler.java
  36. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/ObjRecordHandler.java
  37. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/RkRecordHandler.java
  38. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/SstRecordHandler.java
  39. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/StringRecordHandler.java
  40. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/TextObjectRecordHandler.java
  41. 14
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java
  42. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/AbstractCellValueTagHandler.java
  43. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/AbstractXlsxTagHandler.java
  44. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/CellFormulaTagHandler.java
  45. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/CellInlineStringValueTagHandler.java
  46. 2
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/CellTagHandler.java
  47. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/CellValueTagHandler.java
  48. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/CountTagHandler.java
  49. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/HyperlinkTagHandler.java
  50. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/MergeCellTagHandler.java
  51. 20
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/RowTagHandler.java
  52. 0
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/XlsxTagHandler.java
  53. 2
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/sax/SharedStringsTableHandler.java
  54. 2
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/sax/XlsxRowHandler.java
  55. 0
      easyexcel-core/src/main/java/com/alibaba/excel/annotation/ExcelIgnore.java
  56. 0
      easyexcel-core/src/main/java/com/alibaba/excel/annotation/ExcelIgnoreUnannotated.java
  57. 0
      easyexcel-core/src/main/java/com/alibaba/excel/annotation/ExcelProperty.java
  58. 0
      easyexcel-core/src/main/java/com/alibaba/excel/annotation/format/DateTimeFormat.java
  59. 0
      easyexcel-core/src/main/java/com/alibaba/excel/annotation/format/NumberFormat.java
  60. 0
      easyexcel-core/src/main/java/com/alibaba/excel/annotation/write/style/ColumnWidth.java
  61. 0
      easyexcel-core/src/main/java/com/alibaba/excel/annotation/write/style/ContentFontStyle.java
  62. 0
      easyexcel-core/src/main/java/com/alibaba/excel/annotation/write/style/ContentLoopMerge.java
  63. 0
      easyexcel-core/src/main/java/com/alibaba/excel/annotation/write/style/ContentRowHeight.java
  64. 0
      easyexcel-core/src/main/java/com/alibaba/excel/annotation/write/style/ContentStyle.java
  65. 0
      easyexcel-core/src/main/java/com/alibaba/excel/annotation/write/style/HeadFontStyle.java
  66. 0
      easyexcel-core/src/main/java/com/alibaba/excel/annotation/write/style/HeadRowHeight.java
  67. 0
      easyexcel-core/src/main/java/com/alibaba/excel/annotation/write/style/HeadStyle.java
  68. 0
      easyexcel-core/src/main/java/com/alibaba/excel/annotation/write/style/OnceAbsoluteMerge.java
  69. 0
      easyexcel-core/src/main/java/com/alibaba/excel/cache/Ehcache.java
  70. 2
      easyexcel-core/src/main/java/com/alibaba/excel/cache/MapCache.java
  71. 0
      easyexcel-core/src/main/java/com/alibaba/excel/cache/ReadCache.java
  72. 2
      easyexcel-core/src/main/java/com/alibaba/excel/cache/XlsCache.java
  73. 0
      easyexcel-core/src/main/java/com/alibaba/excel/cache/selector/EternalReadCacheSelector.java
  74. 0
      easyexcel-core/src/main/java/com/alibaba/excel/cache/selector/ReadCacheSelector.java
  75. 4
      easyexcel-core/src/main/java/com/alibaba/excel/cache/selector/SimpleReadCacheSelector.java
  76. 0
      easyexcel-core/src/main/java/com/alibaba/excel/constant/BuiltinFormats.java
  77. 0
      easyexcel-core/src/main/java/com/alibaba/excel/constant/ExcelXmlConstants.java
  78. 0
      easyexcel-core/src/main/java/com/alibaba/excel/constant/OrderConstant.java
  79. 0
      easyexcel-core/src/main/java/com/alibaba/excel/context/AnalysisContext.java
  80. 2
      easyexcel-core/src/main/java/com/alibaba/excel/context/AnalysisContextImpl.java
  81. 0
      easyexcel-core/src/main/java/com/alibaba/excel/context/WriteContext.java
  82. 0
      easyexcel-core/src/main/java/com/alibaba/excel/context/WriteContextImpl.java
  83. 0
      easyexcel-core/src/main/java/com/alibaba/excel/context/csv/CsvReadContext.java
  84. 0
      easyexcel-core/src/main/java/com/alibaba/excel/context/csv/DefaultCsvReadContext.java
  85. 0
      easyexcel-core/src/main/java/com/alibaba/excel/context/xls/DefaultXlsReadContext.java
  86. 0
      easyexcel-core/src/main/java/com/alibaba/excel/context/xls/XlsReadContext.java
  87. 0
      easyexcel-core/src/main/java/com/alibaba/excel/context/xlsx/DefaultXlsxReadContext.java
  88. 0
      easyexcel-core/src/main/java/com/alibaba/excel/context/xlsx/XlsxReadContext.java
  89. 0
      easyexcel-core/src/main/java/com/alibaba/excel/converters/AutoConverter.java
  90. 0
      easyexcel-core/src/main/java/com/alibaba/excel/converters/Converter.java
  91. 0
      easyexcel-core/src/main/java/com/alibaba/excel/converters/ConverterKeyBuild.java
  92. 0
      easyexcel-core/src/main/java/com/alibaba/excel/converters/DefaultConverterLoader.java
  93. 0
      easyexcel-core/src/main/java/com/alibaba/excel/converters/NullableObjectConverter.java
  94. 0
      easyexcel-core/src/main/java/com/alibaba/excel/converters/ReadConverterContext.java
  95. 0
      easyexcel-core/src/main/java/com/alibaba/excel/converters/WriteConverterContext.java
  96. 0
      easyexcel-core/src/main/java/com/alibaba/excel/converters/bigdecimal/BigDecimalBooleanConverter.java
  97. 0
      easyexcel-core/src/main/java/com/alibaba/excel/converters/bigdecimal/BigDecimalNumberConverter.java
  98. 0
      easyexcel-core/src/main/java/com/alibaba/excel/converters/bigdecimal/BigDecimalStringConverter.java
  99. 0
      easyexcel-core/src/main/java/com/alibaba/excel/converters/biginteger/BigIntegerBooleanConverter.java
  100. 0
      easyexcel-core/src/main/java/com/alibaba/excel/converters/biginteger/BigIntegerNumberConverter.java
  101. Some files were not shown because too many files have changed in this diff Show More

21
.github/workflows/ci.yml

@ -19,25 +19,34 @@ name: Java CI
on: [push, pull_request] on: [push, pull_request]
jobs: jobs:
build: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy:
matrix:
java: [ 8, 11, 17]
distribution: [ 'adopt' ]
fail-fast: false
max-parallel: 4
name: Test JDK ${{ matrix.java }}
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Set up JDK 8 - name: Set up JDK
uses: actions/setup-java@v2 uses: actions/setup-java@v2
with: with:
java-version: '8' java-version: ${{ matrix.java }}
distribution: 'adopt' distribution: ${{ matrix.distribution }}
- name: Cache Maven - name: Cache Maven
uses: actions/cache@v2.1.6 uses: actions/cache@v2
with: with:
path: ~/.m2 path: ~/.m2
key: m2 key: m2
restore-keys: m2 restore-keys: m2
- name: Chmod - name: Chmod
run: chmod +x mvnw run: chmod +x mvnw
- name: Test with Maven
run: ./mvnw test -B -Dmaven.test.skip=false
- name: Maven Build - name: Maven Build
run: ./mvnw install -B -V -Dmaven.test.skip=true run: ./mvnw install -B -V
- name: Java Doc - name: Java Doc
run: ./mvnw javadoc:javadoc run: ./mvnw javadoc:javadoc

2
.gitignore vendored

@ -13,3 +13,5 @@ target/
*.iws *.iws
antx.properties antx.properties
output/ output/
.flattened-pom.xml
dependency-reduced-pom.xml

1
.mvn/jvm.config

@ -1 +0,0 @@
-Xmx1536m

BIN
.mvn/wrapper/maven-wrapper.jar vendored

Binary file not shown.

20
.mvn/wrapper/maven-wrapper.properties vendored

@ -1,2 +1,18 @@
distributionUrl=https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.zip # Licensed to the Apache Software Foundation (ASF) under one
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.3/maven-wrapper-0.5.3.jar # or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar

36
README.md

@ -27,9 +27,31 @@ Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都
当然还有极速模式能更快,但是内存占用会在100M多一点 当然还有极速模式能更快,但是内存占用会在100M多一点
![img](img/readme/large.png) ![img](img/readme/large.png)
## 版本支持 ## 关于版本选择
* 2+ 版本支持 Java7和Java6 如果项目中没有使用过poi,且jdk版本在8-17之间,直接使用最新版本,别犹豫。以下表格适用于不满足以上2个情况的。
* 3+ 版本至少 Java8
| 版本 | poi依赖版本 (支持范围) | jdk版本支持范围 | 备注 |
|--------------------|-----------------------|--------------|---------------------------------------------|
| 3.1.0+ | 4.1.2 (4.1.2 - 5.2.2) | jkd8 - jdk17 | 推荐使用,会更新的版本 |
| 3.0.0-beta1 - 3.0.5 | 4.1.2 (4.1.2 - 5.2.2) | jkd8 - jdk11 | 不推荐项目新引入此版本,除非超级严重bug,否则不再更新 |
| 2.0.0-beta1-2.2.11 | 3.17 (3.17 - 4.1.2) | jdk6 - jdk11 | 不推荐项目新引入此版本,除非是jdk6否则不推荐使用,除非超级严重bug,否则不再更新 |
| 1+版本 | 3.17 (3.17 - 4.1.2) | jdk6 - jdk11 | 不推荐项目新引入此版本,超级严重bug,也不再更新 |
注意: 3+版本的的easyexcel,使用poi 5+版本时,需要手动排除:poi-ooxml-schemas,例如:
```xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.0</version>
<exclusions>
<exclusion>
<artifactId>poi-ooxml-schemas</artifactId>
<groupId>org.apache.poi</groupId>
</exclusion>
</exclusions>
</dependency>
```
### 关于版本升级 ### 关于版本升级
* 不建议跨大版本升级 尤其跨2个大版本 * 不建议跨大版本升级 尤其跨2个大版本
* 2+ 升级到 3+ 一些不兼容的地方 * 2+ 升级到 3+ 一些不兼容的地方
@ -43,7 +65,7 @@ Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都
<dependency> <dependency>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId> <artifactId>easyexcel</artifactId>
<version>3.0.5</version> <version>3.1.0</version>
</dependency> </dependency>
``` ```
@ -67,7 +89,7 @@ Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都
姬朋飞(玉霄)、庄家钜、怀宇 姬朋飞(玉霄)、庄家钜、怀宇
## 快速开始 ## 快速开始
### 读Excel ### 读Excel
DEMO代码地址:[https://github.com/alibaba/easyexcel/blob/master/src/test/java/com/alibaba/easyexcel/demo/read/ReadTest.java](/src/test/java/com/alibaba/easyexcel/test/demo/read/ReadTest.java) DEMO代码地址:[https://github.com/alibaba/easyexcel/blob/master/src/test/java/com/alibaba/easyexcel/demo/read/ReadTest.java](/easyexcel-core/src/test/java/com/alibaba/easyexcel/test/demo/read/ReadTest.java)
```java ```java
/** /**
@ -85,7 +107,7 @@ DEMO代码地址:[https://github.com/alibaba/easyexcel/blob/master/src/test/ja
``` ```
### 写Excel ### 写Excel
DEMO代码地址:[https://github.com/alibaba/easyexcel/blob/master/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java](/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java) DEMO代码地址:[https://github.com/alibaba/easyexcel/blob/master/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java](/easyexcel-core/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java)
```java ```java
/** /**
* 最简单的写 * 最简单的写
@ -102,7 +124,7 @@ DEMO代码地址:[https://github.com/alibaba/easyexcel/blob/master/src/test/ja
``` ```
### web上传、下载 ### web上传、下载
DEMO代码地址:[https://github.com/alibaba/easyexcel/blob/master/src/test/java/com/alibaba/easyexcel/test/demo/web/WebTest.java](/src/test/java/com/alibaba/easyexcel/test/demo/web/WebTest.java) DEMO代码地址:[https://github.com/alibaba/easyexcel/blob/master/src/test/java/com/alibaba/easyexcel/test/demo/web/WebTest.java](/easyexcel-core/src/test/java/com/alibaba/easyexcel/test/demo/web/WebTest.java)
```java ```java
/** /**
* 文件下载(失败了会返回一个有部分数据的Excel) * 文件下载(失败了会返回一个有部分数据的Excel)

156
README_EN.md

@ -0,0 +1,156 @@
EasyExcel
======================
[![Build Status](https://github.com/alibaba/easyexcel/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/alibaba/easyexcel/actions/workflows/ci.yml?query=branch%3Amaster)
[![Maven central](https://maven-badges.herokuapp.com/maven-central/com.alibaba/easyexcel/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.alibaba/easyexcel)
[![License](http://img.shields.io/:license-apache-brightgreen.svg)](http://www.apache.org/licenses/LICENSE-2.0.html)
[Communication Group 1 in QQ(Full): 662022184](https://jq.qq.com/?_wv=1027&k=1T21jJxh)
[Communication Group 2 in QQ(Full): 1097936804](https://jq.qq.com/?_wv=1027&k=j5zEy6Xl)
[Communication Group 3 in QQ(Full): 453928496](https://qm.qq.com/cgi-bin/qm/qr?k=e2ULsA5A0GldhV2CXJ8sIbAyu9I6qqs7&jump_from=webapi)
[Communication Group 4 in QQ: 496594404](https://qm.qq.com/cgi-bin/qm/qr?k=e_aVG1Q7gi0PJUBkbrUGAgbeO3kUEInK&jump_from=webapi)
[Communication Group 1 in DingTalk(Full): 21960511](https://qr.dingtalk.com/action/joingroup?code=v1,k1,cchz6k12ci9B08NNqhNRFGXocNVHrZtW0kaOtTKg/Rk=&_dt_no_comment=1&origin=11)
[Communication Group 2 in DingTalk(Full): 32796397](https://qr.dingtalk.com/action/joingroup?code=v1,k1,jyU9GtEuNU5S0QTyklqYcYJ8qDZtUuTPMM7uPZTS8Hs=&_dt_no_comment=1&origin=11)
[Communication Group 3 in DingTalk(Full): 33797247](https://qr.dingtalk.com/action/joingroup?code=v1,k1,3UGlEScTGQaHpW2cIRo+gkxJ9EVZ5fz26M6nW3uFP30=&_dt_no_comment=1&origin=11)
[Communication Group 4 in DingTalk(Full): 33491624](https://qr.dingtalk.com/action/joingroup?code=v1,k1,V14Pb65Too70rQkEaJ9ohb6lZBZbtp6jIL/q9EWh9vA=&_dt_no_comment=1&origin=11)
[Communication Group 5 in DingTalk: 32134498](https://h5.dingtalk.com/circle/healthCheckin.html?dtaction=os&corpId=dingb9fa1325d9dccc3ecac589edd02f1650&5233a=71a83&cbdbhh=qwertyuiop)
[Official Website: https://yuque.com/easyexcel](https://www.yuque.com/easyexcel/doc/easyexcel)
[FAQ](https://www.yuque.com/easyexcel/faq)
#### It is recommended to join a DingTalk group
# EasyExcel, a java toolkit for parsing Excel easily
There are several java frameworks or toolkit which can parse and generate Excel, such as Apache POI or jxl. But they all have some difficulties to handle problems like excessive memory usage. Apache POI framework has a set of SAX mode API can fix some memory overflow problems at some extent, but it still has some flaws. For example, the unzipping and the storage of the unzipping of Excel file in version 07 are done in memory, so the memory consumption is still very high. The EasyExcel toolkit rewrites the logic of POI for parsing Excel version 07. One 3 megabytes Excel file parsed with POI still requires about 100M memory, which can be reduced to a few megabyte by using EasyExcel instead. And yes, there is no memory overflow for even larger excel with EasyExcel. EasyExcel version 03 depends on POI SAX model and does model transformation/encapsulation in the upper layer to make it simpler and more convenient for users.
## Using EasyExcel version 3.0.2+, a machine with 64M RAM can read a 75 megabyte Excel file containing 460,000 rows and 25 columns in 20 seconds
Of course, there is also a very fast mode can be faster, but the memory consumption will be a little more than 100M
![img](img/readme/large.png)
## Version support
* EasyExcel version 2+ works on Java7 or Java6
* EasyExcel version 3+ works on Java8 or java8+
### About version upgrade
* It is not recommended upgrading across major versions, especially across 2 major versions.
* There are some incompatibilities in upgrading from version 2+ to version 3+.
* Using a custom interceptor to modify the style can cause problems, even if it does not compile with errors.
* When reading the Excel file, the `invoke` function will throw an exception, there will not be an additional layer of `ExcelAnalysisException` wrapped here, and it will not compile with errors.
* Style and other annotations involving `boolean` or some enumeration values have been changed, adding the default value. The compiler will report an error, just change the annotation.
* It is recommended to re-test the relevant functions after upgrading across major versions.
### Latest Version
```xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.2</version>
</dependency>
```
## Advertising space
### Alibaba New Retail Business Department Recruitment
Alibaba New Retail Business Department sincerely recruit JAVA senior development, technical experts. If you are interested, you can contact us by WeChat, or send your Resume to my email jipengfei.jpf@alibaba-inc.com.
### EasyExcel personnel recruitment
Anyone who wants to participate in this project can apply, mainly responsible for answering questions in the communication group and dealing with the issues. Of course, you can also do some PR.
Since there is no material reward for participating in the open source project, and the current maintainers are also maintaining the project in their spare time. So people who want to join this project need to be persistent, not just on a whim.
The requirements are as follows:
* There are certain java coding skills & good coding habits
* Understand the read&write principles of EasyExcel
* Has passion for open source projects
* Be able to do things consistently for a long time
* Your job is not so busy
## Related Documents
* [Quick Start](https://www.yuque.com/easyexcel/doc/easyexcel)
* [About Us](/abouteasyexcel.md)
* [Update Notes](/update.md)
* [Code Contribution](https://www.yuque.com/easyexcel/doc/contribute)
## Maintainers
姬朋飞(玉霄)、庄家钜、怀宇
## Quick Start
### Read Excel File
DEMO:[https://github.com/alibaba/easyexcel/blob/master/src/test/java/com/alibaba/easyexcel/demo/read/ReadTest.java](/src/test/java/com/alibaba/easyexcel/test/demo/read/ReadTest.java)
```java
/**
* The easiest way to read Excel file using EasyExcel toolkit
*
* <p>
* 1. Create an entity object, such as {@link DemoData}, each property of the entity object corresponds to a specific field in any row of Excel.
* 2. When reading each row of an Excel file, create a callback listener for the corresponding row. Refer to{@link DemoDataListener}
* 3. Invoke the read function
* </p>
*/
@Test
public void simpleRead() {
String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
// Specify which entity object class to use to read the Excel content. The file stream will close automatically after reading the first sheet of Excel.
EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
}
```
### Write Excel File
DEMO:[https://github.com/alibaba/easyexcel/blob/master/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java](/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java)
```java
/**
* The easiest way to write Excel file using EasyExcel toolkit
*
* <p>
* 1. Create an entity object, refer to{@link com.alibaba.easyexcel.test.demo.write.DemoData}.
* Each property of the entity object corresponds to a specific field of Excel
* 2. Invoke write function
* </p>
*/
@Test
public void simpleWrite() {
String fileName = TestFileUtil.getPath() + "write" + System.currentTimeMillis() + ".xlsx";
// Specify which entity object class to use to write Excel, it will write to the first sheet of Excel with the name template. Then the file stream will be closed automatically.
// With version 03, just pass in the excelType parameter
EasyExcel.write(fileName, DemoData.class).sheet("template").doWrite(data());
}
```
### File Uploading&Downloading
DEMO:[https://github.com/alibaba/easyexcel/blob/master/src/test/java/com/alibaba/easyexcel/test/demo/web/WebTest.java](/src/test/java/com/alibaba/easyexcel/test/demo/web/WebTest.java)
```java
/**
* File downloading
*
* Note: returns an Excel with partial data if it fails
*
* <p>
* 1. Create an entity object, refer to{@link DownloadData}.
* Each property of the entity object corresponds to a specific field of Excel
* 2. Specify the returned properties
* 3. Invoke wirte function, then the OutputStream is automatically closed when it ends.
* </p>
*/
@GetMapping("download")
public void download(HttpServletResponse response) throws IOException {
// Using swagger may cause some problems, please use your browser directly or use postman to invoke this
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// URLEncoder.encode function can prevent Chinese garbled code
String fileName = URLEncoder.encode("test", "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet("template").doWrite(data());
}
/**
* File uploading
*
* <p>
* 1. Create an entity object, refer to{@link UploadData}
* Each property of the entity object corresponds to a specific field of Excel
* 2. When reading each row of an Excel file, create a callback listener for the corresponding row. Refer to{@link UploadDataListener}
* 3. Invoke read function
* </p>
*/
@PostMapping("upload")
@ResponseBody
public String upload(MultipartFile file) throws IOException {
EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();
return "success";
}
```
### Contact Us
If you have any questions, Alibaba colleagues can find me in DingTalk, and others can leave messages here. All related questions are well welcomed.

43
easyexcel-core/pom.xml

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel-parent</artifactId>
<version>${revision}</version>
<relativePath>../pom.xml</relativePath>
</parent>
<packaging>jar</packaging>
<artifactId>easyexcel-core</artifactId>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel-support</artifactId>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
</dependency>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
</dependencies>
</project>

0
src/main/java/com/alibaba/excel/EasyExcel.java → easyexcel-core/src/main/java/com/alibaba/excel/EasyExcel.java

0
src/main/java/com/alibaba/excel/EasyExcelFactory.java → easyexcel-core/src/main/java/com/alibaba/excel/EasyExcelFactory.java

25
src/main/java/com/alibaba/excel/ExcelReader.java → easyexcel-core/src/main/java/com/alibaba/excel/ExcelReader.java

@ -1,5 +1,6 @@
package com.alibaba.excel; package com.alibaba.excel;
import java.io.Closeable;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@ -10,21 +11,17 @@ import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.metadata.ReadSheet; import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.excel.read.metadata.ReadWorkbook; import com.alibaba.excel.read.metadata.ReadWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** /**
* Excel readers are all read in event mode. * Excel readers are all read in event mode.
* *
* @author jipengfei * @author jipengfei
*/ */
public class ExcelReader { public class ExcelReader implements Closeable {
private static final Logger LOGGER = LoggerFactory.getLogger(ExcelReader.class);
/** /**
* Analyser * Analyser
*/ */
private ExcelAnalyser excelAnalyser; private final ExcelAnalyser excelAnalyser;
public ExcelReader(ReadWorkbook readWorkbook) { public ExcelReader(ReadWorkbook readWorkbook) {
excelAnalyser = new ExcelAnalyserImpl(readWorkbook); excelAnalyser = new ExcelAnalyserImpl(readWorkbook);
@ -50,8 +47,7 @@ public class ExcelReader {
/** /**
* Parse the specified sheetSheetNo start from 0 * Parse the specified sheetSheetNo start from 0
* *
* @param readSheet * @param readSheet Read sheet
* Read sheet
*/ */
public ExcelReader read(ReadSheet... readSheet) { public ExcelReader read(ReadSheet... readSheet) {
return read(Arrays.asList(readSheet)); return read(Arrays.asList(readSheet));
@ -68,7 +64,6 @@ public class ExcelReader {
return this; return this;
} }
/** /**
* Context for the entire execution process * Context for the entire execution process
* *
@ -88,7 +83,6 @@ public class ExcelReader {
} }
/** /**
*
* @return * @return
* @deprecated please use {@link #analysisContext()} * @deprecated please use {@link #analysisContext()}
*/ */
@ -106,17 +100,8 @@ public class ExcelReader {
} }
} }
/**
* Prevents calls to {@link #finish} from freeing the cache
*
*/
@Override @Override
protected void finalize() { public void close() {
try {
finish(); finish();
} catch (Throwable e) {
LOGGER.warn("Destroy object failed", e);
} }
}
} }

26
src/main/java/com/alibaba/excel/ExcelWriter.java → easyexcel-core/src/main/java/com/alibaba/excel/ExcelWriter.java

@ -1,5 +1,6 @@
package com.alibaba.excel; package com.alibaba.excel;
import java.io.Closeable;
import java.util.Collection; import java.util.Collection;
import java.util.function.Supplier; import java.util.function.Supplier;
@ -11,9 +12,6 @@ import com.alibaba.excel.write.metadata.WriteTable;
import com.alibaba.excel.write.metadata.WriteWorkbook; import com.alibaba.excel.write.metadata.WriteWorkbook;
import com.alibaba.excel.write.metadata.fill.FillConfig; import com.alibaba.excel.write.metadata.fill.FillConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** /**
* Excel Writer This tool is used to write value out to Excel via POI. This object can perform the following two * Excel Writer This tool is used to write value out to Excel via POI. This object can perform the following two
* functions. * functions.
@ -25,10 +23,9 @@ import org.slf4j.LoggerFactory;
* *
* @author jipengfei * @author jipengfei
*/ */
public class ExcelWriter { public class ExcelWriter implements Closeable {
private static final Logger LOGGER = LoggerFactory.getLogger(ExcelWriter.class);
private ExcelBuilder excelBuilder; private final ExcelBuilder excelBuilder;
/** /**
* Create new writer * Create new writer
@ -144,18 +141,6 @@ public class ExcelWriter {
} }
} }
/**
* Prevents calls to {@link #finish} from freeing the cache
*/
@Override
protected void finalize() {
try {
finish();
} catch (Throwable e) {
LOGGER.warn("Destroy object failed", e);
}
}
/** /**
* The context of the entire writing process * The context of the entire writing process
* *
@ -164,4 +149,9 @@ public class ExcelWriter {
public WriteContext writeContext() { public WriteContext writeContext() {
return excelBuilder.writeContext(); return excelBuilder.writeContext();
} }
@Override
public void close() {
finish();
}
} }

0
src/main/java/com/alibaba/excel/analysis/ExcelAnalyser.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/ExcelAnalyser.java

13
src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java

@ -18,6 +18,7 @@ import com.alibaba.excel.exception.ExcelAnalysisStopException;
import com.alibaba.excel.read.metadata.ReadSheet; import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.excel.read.metadata.ReadWorkbook; import com.alibaba.excel.read.metadata.ReadWorkbook;
import com.alibaba.excel.read.metadata.holder.ReadWorkbookHolder; import com.alibaba.excel.read.metadata.holder.ReadWorkbookHolder;
import com.alibaba.excel.read.metadata.holder.csv.CsvReadWorkbookHolder;
import com.alibaba.excel.read.metadata.holder.xls.XlsReadWorkbookHolder; import com.alibaba.excel.read.metadata.holder.xls.XlsReadWorkbookHolder;
import com.alibaba.excel.read.metadata.holder.xlsx.XlsxReadWorkbookHolder; import com.alibaba.excel.read.metadata.holder.xlsx.XlsxReadWorkbookHolder;
import com.alibaba.excel.support.ExcelTypeEnum; import com.alibaba.excel.support.ExcelTypeEnum;
@ -171,6 +172,18 @@ public class ExcelAnalyserImpl implements ExcelAnalyser {
} catch (Throwable t) { } catch (Throwable t) {
throwable = t; throwable = t;
} }
// close csv.
// https://github.com/alibaba/easyexcel/issues/2309
try {
if ((readWorkbookHolder instanceof CsvReadWorkbookHolder)
&& ((CsvReadWorkbookHolder)readWorkbookHolder).getCsvParser() != null) {
((CsvReadWorkbookHolder)readWorkbookHolder).getCsvParser().close();
}
} catch (Throwable t) {
throwable = t;
}
try { try {
if (analysisContext.readWorkbookHolder().getAutoCloseStream() if (analysisContext.readWorkbookHolder().getAutoCloseStream()
&& readWorkbookHolder.getInputStream() != null) { && readWorkbookHolder.getInputStream() != null) {

0
src/main/java/com/alibaba/excel/analysis/ExcelReadExecutor.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/ExcelReadExecutor.java

28
src/main/java/com/alibaba/excel/analysis/csv/CsvExcelReadExecutor.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/csv/CsvExcelReadExecutor.java

@ -1,8 +1,8 @@
package com.alibaba.excel.analysis.csv; package com.alibaba.excel.analysis.csv;
import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.nio.file.Files;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@ -25,6 +25,7 @@ import com.alibaba.excel.util.StringUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.MapUtils; import org.apache.commons.collections4.MapUtils;
import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord; import org.apache.commons.csv.CSVRecord;
/** /**
@ -35,8 +36,8 @@ import org.apache.commons.csv.CSVRecord;
@Slf4j @Slf4j
public class CsvExcelReadExecutor implements ExcelReadExecutor { public class CsvExcelReadExecutor implements ExcelReadExecutor {
private List<ReadSheet> sheetList; private final List<ReadSheet> sheetList;
private CsvReadContext csvReadContext; private final CsvReadContext csvReadContext;
public CsvExcelReadExecutor(CsvReadContext csvReadContext) { public CsvExcelReadExecutor(CsvReadContext csvReadContext) {
this.csvReadContext = csvReadContext; this.csvReadContext = csvReadContext;
@ -53,9 +54,10 @@ public class CsvExcelReadExecutor implements ExcelReadExecutor {
@Override @Override
public void execute() { public void execute() {
Iterable<CSVRecord> parseRecords; CSVParser csvParser;
try { try {
parseRecords = parseRecords(); csvParser = csvParser();
csvReadContext.csvReadWorkbookHolder().setCsvParser(csvParser);
} catch (IOException e) { } catch (IOException e) {
throw new ExcelAnalysisException(e); throw new ExcelAnalysisException(e);
} }
@ -68,7 +70,7 @@ public class CsvExcelReadExecutor implements ExcelReadExecutor {
int rowIndex = 0; int rowIndex = 0;
for (CSVRecord record : parseRecords) { for (CSVRecord record : csvParser) {
dealRecord(record, rowIndex++); dealRecord(record, rowIndex++);
} }
@ -77,23 +79,27 @@ public class CsvExcelReadExecutor implements ExcelReadExecutor {
} }
} }
private Iterable<CSVRecord> parseRecords() throws IOException { private CSVParser csvParser() throws IOException {
CsvReadWorkbookHolder csvReadWorkbookHolder = csvReadContext.csvReadWorkbookHolder(); CsvReadWorkbookHolder csvReadWorkbookHolder = csvReadContext.csvReadWorkbookHolder();
CSVFormat csvFormat = csvReadWorkbookHolder.getCsvFormat(); CSVFormat csvFormat = csvReadWorkbookHolder.getCsvFormat();
if (csvReadWorkbookHolder.getMandatoryUseInputStream()) { if (csvReadWorkbookHolder.getMandatoryUseInputStream()) {
return csvFormat.parse(new InputStreamReader(csvReadWorkbookHolder.getInputStream())); return csvFormat.parse(
new InputStreamReader(csvReadWorkbookHolder.getInputStream(), csvReadWorkbookHolder.getCharset()));
} }
if (csvReadWorkbookHolder.getFile() != null) { if (csvReadWorkbookHolder.getFile() != null) {
return csvFormat.parse(new FileReader(csvReadWorkbookHolder.getFile())); return csvFormat.parse(new InputStreamReader(Files.newInputStream(csvReadWorkbookHolder.getFile().toPath()),
csvReadWorkbookHolder.getCharset()));
} }
return csvFormat.parse(new InputStreamReader(csvReadWorkbookHolder.getInputStream())); return csvFormat.parse(
new InputStreamReader(csvReadWorkbookHolder.getInputStream(), csvReadWorkbookHolder.getCharset()));
} }
private void dealRecord(CSVRecord record, int rowIndex) { private void dealRecord(CSVRecord record, int rowIndex) {
Map<Integer, Cell> cellMap = new LinkedHashMap<>(); Map<Integer, Cell> cellMap = new LinkedHashMap<>();
Iterator<String> cellIterator = record.iterator(); Iterator<String> cellIterator = record.iterator();
int columnIndex = 0; int columnIndex = 0;
Boolean autoTrim = csvReadContext.currentReadHolder().globalConfiguration().getAutoTrim();
while (cellIterator.hasNext()) { while (cellIterator.hasNext()) {
String cellString = cellIterator.next(); String cellString = cellIterator.next();
ReadCellData<String> readCellData = new ReadCellData<>(); ReadCellData<String> readCellData = new ReadCellData<>();
@ -103,7 +109,7 @@ public class CsvExcelReadExecutor implements ExcelReadExecutor {
// csv is an empty string of whether <code>,,</code> is read or <code>,"",</code> // csv is an empty string of whether <code>,,</code> is read or <code>,"",</code>
if (StringUtils.isNotBlank(cellString)) { if (StringUtils.isNotBlank(cellString)) {
readCellData.setType(CellDataTypeEnum.STRING); readCellData.setType(CellDataTypeEnum.STRING);
readCellData.setStringValue(cellString); readCellData.setStringValue(autoTrim ? cellString.trim() : cellString);
} else { } else {
readCellData.setType(CellDataTypeEnum.EMPTY); readCellData.setType(CellDataTypeEnum.EMPTY);
} }

0
src/main/java/com/alibaba/excel/analysis/v03/IgnorableXlsRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/IgnorableXlsRecordHandler.java

2
src/main/java/com/alibaba/excel/analysis/v03/XlsListSheetListener.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/XlsListSheetListener.java

@ -25,7 +25,7 @@ import com.alibaba.excel.exception.ExcelAnalysisException;
* @author Jiaju Zhuang * @author Jiaju Zhuang
*/ */
public class XlsListSheetListener implements HSSFListener { public class XlsListSheetListener implements HSSFListener {
private XlsReadContext xlsReadContext; private final XlsReadContext xlsReadContext;
private static final Map<Short, XlsRecordHandler> XLS_RECORD_HANDLER_MAP = new HashMap<Short, XlsRecordHandler>(); private static final Map<Short, XlsRecordHandler> XLS_RECORD_HANDLER_MAP = new HashMap<Short, XlsRecordHandler>();
static { static {

0
src/main/java/com/alibaba/excel/analysis/v03/XlsRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/XlsRecordHandler.java

3
src/main/java/com/alibaba/excel/analysis/v03/XlsSaxAnalyser.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/XlsSaxAnalyser.java

@ -11,7 +11,6 @@ import org.apache.poi.hssf.eventusermodel.HSSFEventFactory;
import org.apache.poi.hssf.eventusermodel.HSSFListener; import org.apache.poi.hssf.eventusermodel.HSSFListener;
import org.apache.poi.hssf.eventusermodel.HSSFRequest; import org.apache.poi.hssf.eventusermodel.HSSFRequest;
import org.apache.poi.hssf.eventusermodel.MissingRecordAwareHSSFListener; import org.apache.poi.hssf.eventusermodel.MissingRecordAwareHSSFListener;
import org.apache.poi.hssf.eventusermodel.dummyrecord.LastCellOfRowDummyRecord;
import org.apache.poi.hssf.record.BOFRecord; import org.apache.poi.hssf.record.BOFRecord;
import org.apache.poi.hssf.record.BlankRecord; import org.apache.poi.hssf.record.BlankRecord;
import org.apache.poi.hssf.record.BoolErrRecord; import org.apache.poi.hssf.record.BoolErrRecord;
@ -78,7 +77,7 @@ public class XlsSaxAnalyser implements HSSFListener, ExcelReadExecutor {
private static final Logger LOGGER = LoggerFactory.getLogger(XlsSaxAnalyser.class); private static final Logger LOGGER = LoggerFactory.getLogger(XlsSaxAnalyser.class);
private static final short DUMMY_RECORD_SID = -1; private static final short DUMMY_RECORD_SID = -1;
private XlsReadContext xlsReadContext; private final XlsReadContext xlsReadContext;
private static final Map<Short, XlsRecordHandler> XLS_RECORD_HANDLER_MAP = new HashMap<Short, XlsRecordHandler>(32); private static final Map<Short, XlsRecordHandler> XLS_RECORD_HANDLER_MAP = new HashMap<Short, XlsRecordHandler>(32);
static { static {

0
src/main/java/com/alibaba/excel/analysis/v03/handlers/AbstractXlsRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/AbstractXlsRecordHandler.java

0
src/main/java/com/alibaba/excel/analysis/v03/handlers/BlankRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/BlankRecordHandler.java

0
src/main/java/com/alibaba/excel/analysis/v03/handlers/BofRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/BofRecordHandler.java

0
src/main/java/com/alibaba/excel/analysis/v03/handlers/BoolErrRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/BoolErrRecordHandler.java

0
src/main/java/com/alibaba/excel/analysis/v03/handlers/BoundSheetRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/BoundSheetRecordHandler.java

5
src/main/java/com/alibaba/excel/analysis/v03/handlers/DummyRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/DummyRecordHandler.java

@ -34,7 +34,10 @@ public class DummyRecordHandler extends AbstractXlsRecordHandler implements Igno
xlsReadSheetHolder.setTempRowType(RowTypeEnum.EMPTY); xlsReadSheetHolder.setTempRowType(RowTypeEnum.EMPTY);
} else if (record instanceof MissingCellDummyRecord) { } else if (record instanceof MissingCellDummyRecord) {
MissingCellDummyRecord mcdr = (MissingCellDummyRecord)record; MissingCellDummyRecord mcdr = (MissingCellDummyRecord)record;
xlsReadSheetHolder.getCellMap().put(mcdr.getColumn(), // https://github.com/alibaba/easyexcel/issues/2236
// Some abnormal XLS, in the case of data already exist, or there will be a "MissingCellDummyRecord"
// records, so if the existing data, empty data is ignored
xlsReadSheetHolder.getCellMap().putIfAbsent(mcdr.getColumn(),
ReadCellData.newEmptyInstance(mcdr.getRow(), mcdr.getColumn())); ReadCellData.newEmptyInstance(mcdr.getRow(), mcdr.getColumn()));
} }
} }

1
src/main/java/com/alibaba/excel/analysis/v03/handlers/EofRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/EofRecordHandler.java

@ -2,7 +2,6 @@ package com.alibaba.excel.analysis.v03.handlers;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import org.apache.poi.hssf.eventusermodel.dummyrecord.LastCellOfRowDummyRecord;
import org.apache.poi.hssf.record.Record; import org.apache.poi.hssf.record.Record;
import com.alibaba.excel.analysis.v03.IgnorableXlsRecordHandler; import com.alibaba.excel.analysis.v03.IgnorableXlsRecordHandler;

1
src/main/java/com/alibaba/excel/analysis/v03/handlers/FormulaRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/FormulaRecordHandler.java

@ -64,6 +64,7 @@ public class FormulaRecordHandler extends AbstractXlsRecordHandler implements Ig
dataFormatData.setFormat(BuiltinFormats.getBuiltinFormat(dataFormatData.getIndex(), dataFormatData.setFormat(BuiltinFormats.getBuiltinFormat(dataFormatData.getIndex(),
xlsReadContext.xlsReadWorkbookHolder().getFormatTrackingHSSFListener().getFormatString(frec), xlsReadContext.xlsReadWorkbookHolder().getFormatTrackingHSSFListener().getFormatString(frec),
xlsReadContext.readSheetHolder().getGlobalConfiguration().getLocale())); xlsReadContext.readSheetHolder().getGlobalConfiguration().getLocale()));
tempCellData.setDataFormatData(dataFormatData);
cellMap.put((int)frec.getColumn(), tempCellData); cellMap.put((int)frec.getColumn(), tempCellData);
break; break;
case ERROR: case ERROR:

0
src/main/java/com/alibaba/excel/analysis/v03/handlers/HyperlinkRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/HyperlinkRecordHandler.java

0
src/main/java/com/alibaba/excel/analysis/v03/handlers/IndexRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/IndexRecordHandler.java

0
src/main/java/com/alibaba/excel/analysis/v03/handlers/LabelRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/LabelRecordHandler.java

0
src/main/java/com/alibaba/excel/analysis/v03/handlers/LabelSstRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/LabelSstRecordHandler.java

0
src/main/java/com/alibaba/excel/analysis/v03/handlers/MergeCellsRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/MergeCellsRecordHandler.java

0
src/main/java/com/alibaba/excel/analysis/v03/handlers/NoteRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/NoteRecordHandler.java

0
src/main/java/com/alibaba/excel/analysis/v03/handlers/NumberRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/NumberRecordHandler.java

0
src/main/java/com/alibaba/excel/analysis/v03/handlers/ObjRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/ObjRecordHandler.java

0
src/main/java/com/alibaba/excel/analysis/v03/handlers/RkRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/RkRecordHandler.java

0
src/main/java/com/alibaba/excel/analysis/v03/handlers/SstRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/SstRecordHandler.java

0
src/main/java/com/alibaba/excel/analysis/v03/handlers/StringRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/StringRecordHandler.java

0
src/main/java/com/alibaba/excel/analysis/v03/handlers/TextObjectRecordHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/TextObjectRecordHandler.java

14
src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java

@ -52,13 +52,13 @@ import org.xml.sax.XMLReader;
@Slf4j @Slf4j
public class XlsxSaxAnalyser implements ExcelReadExecutor { public class XlsxSaxAnalyser implements ExcelReadExecutor {
private XlsxReadContext xlsxReadContext; private final XlsxReadContext xlsxReadContext;
private List<ReadSheet> sheetList; private final List<ReadSheet> sheetList;
private Map<Integer, InputStream> sheetMap; private final Map<Integer, InputStream> sheetMap;
/** /**
* excel comments key: sheetNo value: CommentsTable * excel comments key: sheetNo value: CommentsTable
*/ */
private Map<Integer, CommentsTable> commentsTableMap; private final Map<Integer, CommentsTable> commentsTableMap;
public XlsxSaxAnalyser(XlsxReadContext xlsxReadContext, InputStream decryptedStream) throws Exception { public XlsxSaxAnalyser(XlsxReadContext xlsxReadContext, InputStream decryptedStream) throws Exception {
this.xlsxReadContext = xlsxReadContext; this.xlsxReadContext = xlsxReadContext;
@ -188,9 +188,15 @@ public class XlsxSaxAnalyser implements ExcelReadExecutor {
} else { } else {
saxFactory = SAXParserFactory.newInstance(xlsxSAXParserFactoryName, null); saxFactory = SAXParserFactory.newInstance(xlsxSAXParserFactoryName, null);
} }
try {
saxFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); saxFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
} catch (Throwable ignore) {}
try {
saxFactory.setFeature("http://xml.org/sax/features/external-general-entities", false); saxFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);
} catch (Throwable ignore) {}
try {
saxFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); saxFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
} catch (Throwable ignore) {}
SAXParser saxParser = saxFactory.newSAXParser(); SAXParser saxParser = saxFactory.newSAXParser();
XMLReader xmlReader = saxParser.getXMLReader(); XMLReader xmlReader = saxParser.getXMLReader();
xmlReader.setContentHandler(handler); xmlReader.setContentHandler(handler);

0
src/main/java/com/alibaba/excel/analysis/v07/handlers/AbstractCellValueTagHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/AbstractCellValueTagHandler.java

0
src/main/java/com/alibaba/excel/analysis/v07/handlers/AbstractXlsxTagHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/AbstractXlsxTagHandler.java

0
src/main/java/com/alibaba/excel/analysis/v07/handlers/CellFormulaTagHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/CellFormulaTagHandler.java

0
src/main/java/com/alibaba/excel/analysis/v07/handlers/CellInlineStringValueTagHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/CellInlineStringValueTagHandler.java

2
src/main/java/com/alibaba/excel/analysis/v07/handlers/CellTagHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/CellTagHandler.java

@ -100,6 +100,8 @@ public class CellTagHandler extends AbstractXlsxTagHandler {
} }
tempCellData.checkEmpty(); tempCellData.checkEmpty();
tempCellData.setRowIndex(xlsxReadSheetHolder.getRowIndex());
tempCellData.setColumnIndex(xlsxReadSheetHolder.getColumnIndex());
xlsxReadSheetHolder.getCellMap().put(xlsxReadSheetHolder.getColumnIndex(), tempCellData); xlsxReadSheetHolder.getCellMap().put(xlsxReadSheetHolder.getColumnIndex(), tempCellData);
} }
} }

0
src/main/java/com/alibaba/excel/analysis/v07/handlers/CellValueTagHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/CellValueTagHandler.java

0
src/main/java/com/alibaba/excel/analysis/v07/handlers/CountTagHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/CountTagHandler.java

0
src/main/java/com/alibaba/excel/analysis/v07/handlers/HyperlinkTagHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/HyperlinkTagHandler.java

0
src/main/java/com/alibaba/excel/analysis/v07/handlers/MergeCellTagHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/MergeCellTagHandler.java

20
src/main/java/com/alibaba/excel/analysis/v07/handlers/RowTagHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/RowTagHandler.java

@ -4,8 +4,10 @@ import java.util.LinkedHashMap;
import com.alibaba.excel.constant.ExcelXmlConstants; import com.alibaba.excel.constant.ExcelXmlConstants;
import com.alibaba.excel.context.xlsx.XlsxReadContext; import com.alibaba.excel.context.xlsx.XlsxReadContext;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.enums.RowTypeEnum; import com.alibaba.excel.enums.RowTypeEnum;
import com.alibaba.excel.metadata.Cell; import com.alibaba.excel.metadata.Cell;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.read.metadata.holder.ReadRowHolder; import com.alibaba.excel.read.metadata.holder.ReadRowHolder;
import com.alibaba.excel.read.metadata.holder.xlsx.XlsxReadSheetHolder; import com.alibaba.excel.read.metadata.holder.xlsx.XlsxReadSheetHolder;
import com.alibaba.excel.util.PositionUtils; import com.alibaba.excel.util.PositionUtils;
@ -41,6 +43,24 @@ public class RowTagHandler extends AbstractXlsxTagHandler {
public void endElement(XlsxReadContext xlsxReadContext, String name) { public void endElement(XlsxReadContext xlsxReadContext, String name) {
XlsxReadSheetHolder xlsxReadSheetHolder = xlsxReadContext.xlsxReadSheetHolder(); XlsxReadSheetHolder xlsxReadSheetHolder = xlsxReadContext.xlsxReadSheetHolder();
RowTypeEnum rowType = MapUtils.isEmpty(xlsxReadSheetHolder.getCellMap()) ? RowTypeEnum.EMPTY : RowTypeEnum.DATA; RowTypeEnum rowType = MapUtils.isEmpty(xlsxReadSheetHolder.getCellMap()) ? RowTypeEnum.EMPTY : RowTypeEnum.DATA;
// It's possible that all of the cells in the row are empty
if (rowType == RowTypeEnum.DATA) {
boolean hasData = false;
for (Cell cell : xlsxReadSheetHolder.getCellMap().values()) {
if (!(cell instanceof ReadCellData)) {
hasData = true;
break;
}
ReadCellData<?> readCellData = (ReadCellData<?>)cell;
if (readCellData.getType() != CellDataTypeEnum.EMPTY) {
hasData = true;
break;
}
}
if (!hasData) {
rowType = RowTypeEnum.EMPTY;
}
}
xlsxReadContext.readRowHolder(new ReadRowHolder(xlsxReadSheetHolder.getRowIndex(), rowType, xlsxReadContext.readRowHolder(new ReadRowHolder(xlsxReadSheetHolder.getRowIndex(), rowType,
xlsxReadSheetHolder.getGlobalConfiguration(), xlsxReadSheetHolder.getCellMap())); xlsxReadSheetHolder.getGlobalConfiguration(), xlsxReadSheetHolder.getCellMap()));
xlsxReadContext.analysisEventProcessor().endRow(xlsxReadContext); xlsxReadContext.analysisEventProcessor().endRow(xlsxReadContext);

0
src/main/java/com/alibaba/excel/analysis/v07/handlers/XlsxTagHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/XlsxTagHandler.java

2
src/main/java/com/alibaba/excel/analysis/v07/handlers/sax/SharedStringsTableHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/sax/SharedStringsTableHandler.java

@ -27,7 +27,7 @@ public class SharedStringsTableHandler extends DefaultHandler {
*/ */
private StringBuilder currentElementData; private StringBuilder currentElementData;
private ReadCache readCache; private final ReadCache readCache;
/** /**
* Some fields in the T tag need to be ignored * Some fields in the T tag need to be ignored
*/ */

2
src/main/java/com/alibaba/excel/analysis/v07/handlers/sax/XlsxRowHandler.java → easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/sax/XlsxRowHandler.java

@ -25,7 +25,7 @@ import org.xml.sax.helpers.DefaultHandler;
*/ */
@Slf4j @Slf4j
public class XlsxRowHandler extends DefaultHandler { public class XlsxRowHandler extends DefaultHandler {
private XlsxReadContext xlsxReadContext; private final XlsxReadContext xlsxReadContext;
private static final Map<String, XlsxTagHandler> XLSX_CELL_HANDLER_MAP = new HashMap<String, XlsxTagHandler>(32); private static final Map<String, XlsxTagHandler> XLSX_CELL_HANDLER_MAP = new HashMap<String, XlsxTagHandler>(32);
static { static {

0
src/main/java/com/alibaba/excel/annotation/ExcelIgnore.java → easyexcel-core/src/main/java/com/alibaba/excel/annotation/ExcelIgnore.java

0
src/main/java/com/alibaba/excel/annotation/ExcelIgnoreUnannotated.java → easyexcel-core/src/main/java/com/alibaba/excel/annotation/ExcelIgnoreUnannotated.java

0
src/main/java/com/alibaba/excel/annotation/ExcelProperty.java → easyexcel-core/src/main/java/com/alibaba/excel/annotation/ExcelProperty.java

0
src/main/java/com/alibaba/excel/annotation/format/DateTimeFormat.java → easyexcel-core/src/main/java/com/alibaba/excel/annotation/format/DateTimeFormat.java

0
src/main/java/com/alibaba/excel/annotation/format/NumberFormat.java → easyexcel-core/src/main/java/com/alibaba/excel/annotation/format/NumberFormat.java

0
src/main/java/com/alibaba/excel/annotation/write/style/ColumnWidth.java → easyexcel-core/src/main/java/com/alibaba/excel/annotation/write/style/ColumnWidth.java

0
src/main/java/com/alibaba/excel/annotation/write/style/ContentFontStyle.java → easyexcel-core/src/main/java/com/alibaba/excel/annotation/write/style/ContentFontStyle.java

0
src/main/java/com/alibaba/excel/annotation/write/style/ContentLoopMerge.java → easyexcel-core/src/main/java/com/alibaba/excel/annotation/write/style/ContentLoopMerge.java

0
src/main/java/com/alibaba/excel/annotation/write/style/ContentRowHeight.java → easyexcel-core/src/main/java/com/alibaba/excel/annotation/write/style/ContentRowHeight.java

0
src/main/java/com/alibaba/excel/annotation/write/style/ContentStyle.java → easyexcel-core/src/main/java/com/alibaba/excel/annotation/write/style/ContentStyle.java

0
src/main/java/com/alibaba/excel/annotation/write/style/HeadFontStyle.java → easyexcel-core/src/main/java/com/alibaba/excel/annotation/write/style/HeadFontStyle.java

0
src/main/java/com/alibaba/excel/annotation/write/style/HeadRowHeight.java → easyexcel-core/src/main/java/com/alibaba/excel/annotation/write/style/HeadRowHeight.java

0
src/main/java/com/alibaba/excel/annotation/write/style/HeadStyle.java → easyexcel-core/src/main/java/com/alibaba/excel/annotation/write/style/HeadStyle.java

0
src/main/java/com/alibaba/excel/annotation/write/style/OnceAbsoluteMerge.java → easyexcel-core/src/main/java/com/alibaba/excel/annotation/write/style/OnceAbsoluteMerge.java

0
src/main/java/com/alibaba/excel/cache/Ehcache.java → easyexcel-core/src/main/java/com/alibaba/excel/cache/Ehcache.java vendored

2
src/main/java/com/alibaba/excel/cache/MapCache.java → easyexcel-core/src/main/java/com/alibaba/excel/cache/MapCache.java vendored

@ -11,7 +11,7 @@ import com.alibaba.excel.context.AnalysisContext;
* @author Jiaju Zhuang * @author Jiaju Zhuang
*/ */
public class MapCache implements ReadCache { public class MapCache implements ReadCache {
private List<String> cache = new ArrayList<>(); private final List<String> cache = new ArrayList<>();
@Override @Override
public void init(AnalysisContext analysisContext) {} public void init(AnalysisContext analysisContext) {}

0
src/main/java/com/alibaba/excel/cache/ReadCache.java → easyexcel-core/src/main/java/com/alibaba/excel/cache/ReadCache.java vendored

2
src/main/java/com/alibaba/excel/cache/XlsCache.java → easyexcel-core/src/main/java/com/alibaba/excel/cache/XlsCache.java vendored

@ -11,7 +11,7 @@ import com.alibaba.excel.context.AnalysisContext;
* @author Jiaju Zhuang * @author Jiaju Zhuang
*/ */
public class XlsCache implements ReadCache { public class XlsCache implements ReadCache {
private SSTRecord sstRecord; private final SSTRecord sstRecord;
public XlsCache(SSTRecord sstRecord) { public XlsCache(SSTRecord sstRecord) {
this.sstRecord = sstRecord; this.sstRecord = sstRecord;

0
src/main/java/com/alibaba/excel/cache/selector/EternalReadCacheSelector.java → easyexcel-core/src/main/java/com/alibaba/excel/cache/selector/EternalReadCacheSelector.java vendored

0
src/main/java/com/alibaba/excel/cache/selector/ReadCacheSelector.java → easyexcel-core/src/main/java/com/alibaba/excel/cache/selector/ReadCacheSelector.java vendored

4
src/main/java/com/alibaba/excel/cache/selector/SimpleReadCacheSelector.java → easyexcel-core/src/main/java/com/alibaba/excel/cache/selector/SimpleReadCacheSelector.java vendored

@ -33,12 +33,12 @@ public class SimpleReadCacheSelector implements ReadCacheSelector {
/** /**
* Shared strings exceeding this value will use {@link Ehcache},or use {@link MapCache}.unit MB. * Shared strings exceeding this value will use {@link Ehcache},or use {@link MapCache}.unit MB.
*/ */
private long maxUseMapCacheSize; private final long maxUseMapCacheSize;
/** /**
* Maximum size of cache activation.unit MB. * Maximum size of cache activation.unit MB.
*/ */
private int maxCacheActivateSize; private final int maxCacheActivateSize;
public SimpleReadCacheSelector() { public SimpleReadCacheSelector() {
this(DEFAULT_MAX_USE_MAP_CACHE_SIZE, DEFAULT_MAX_EHCACHE_ACTIVATE_SIZE); this(DEFAULT_MAX_USE_MAP_CACHE_SIZE, DEFAULT_MAX_EHCACHE_ACTIVATE_SIZE);

0
src/main/java/com/alibaba/excel/constant/BuiltinFormats.java → easyexcel-core/src/main/java/com/alibaba/excel/constant/BuiltinFormats.java

0
src/main/java/com/alibaba/excel/constant/ExcelXmlConstants.java → easyexcel-core/src/main/java/com/alibaba/excel/constant/ExcelXmlConstants.java

0
src/main/java/com/alibaba/excel/constant/OrderConstant.java → easyexcel-core/src/main/java/com/alibaba/excel/constant/OrderConstant.java

0
src/main/java/com/alibaba/excel/context/AnalysisContext.java → easyexcel-core/src/main/java/com/alibaba/excel/context/AnalysisContext.java

2
src/main/java/com/alibaba/excel/context/AnalysisContextImpl.java → easyexcel-core/src/main/java/com/alibaba/excel/context/AnalysisContextImpl.java

@ -46,7 +46,7 @@ public class AnalysisContextImpl implements AnalysisContext {
/** /**
* Event processor * Event processor
*/ */
private AnalysisEventProcessor analysisEventProcessor; private final AnalysisEventProcessor analysisEventProcessor;
public AnalysisContextImpl(ReadWorkbook readWorkbook, ExcelTypeEnum actualExcelType) { public AnalysisContextImpl(ReadWorkbook readWorkbook, ExcelTypeEnum actualExcelType) {
if (readWorkbook == null) { if (readWorkbook == null) {

0
src/main/java/com/alibaba/excel/context/WriteContext.java → easyexcel-core/src/main/java/com/alibaba/excel/context/WriteContext.java

0
src/main/java/com/alibaba/excel/context/WriteContextImpl.java → easyexcel-core/src/main/java/com/alibaba/excel/context/WriteContextImpl.java

0
src/main/java/com/alibaba/excel/context/csv/CsvReadContext.java → easyexcel-core/src/main/java/com/alibaba/excel/context/csv/CsvReadContext.java

0
src/main/java/com/alibaba/excel/context/csv/DefaultCsvReadContext.java → easyexcel-core/src/main/java/com/alibaba/excel/context/csv/DefaultCsvReadContext.java

0
src/main/java/com/alibaba/excel/context/xls/DefaultXlsReadContext.java → easyexcel-core/src/main/java/com/alibaba/excel/context/xls/DefaultXlsReadContext.java

0
src/main/java/com/alibaba/excel/context/xls/XlsReadContext.java → easyexcel-core/src/main/java/com/alibaba/excel/context/xls/XlsReadContext.java

0
src/main/java/com/alibaba/excel/context/xlsx/DefaultXlsxReadContext.java → easyexcel-core/src/main/java/com/alibaba/excel/context/xlsx/DefaultXlsxReadContext.java

0
src/main/java/com/alibaba/excel/context/xlsx/XlsxReadContext.java → easyexcel-core/src/main/java/com/alibaba/excel/context/xlsx/XlsxReadContext.java

0
src/main/java/com/alibaba/excel/converters/AutoConverter.java → easyexcel-core/src/main/java/com/alibaba/excel/converters/AutoConverter.java

0
src/main/java/com/alibaba/excel/converters/Converter.java → easyexcel-core/src/main/java/com/alibaba/excel/converters/Converter.java

0
src/main/java/com/alibaba/excel/converters/ConverterKeyBuild.java → easyexcel-core/src/main/java/com/alibaba/excel/converters/ConverterKeyBuild.java

0
src/main/java/com/alibaba/excel/converters/DefaultConverterLoader.java → easyexcel-core/src/main/java/com/alibaba/excel/converters/DefaultConverterLoader.java

0
src/main/java/com/alibaba/excel/converters/NullableObjectConverter.java → easyexcel-core/src/main/java/com/alibaba/excel/converters/NullableObjectConverter.java

0
src/main/java/com/alibaba/excel/converters/ReadConverterContext.java → easyexcel-core/src/main/java/com/alibaba/excel/converters/ReadConverterContext.java

0
src/main/java/com/alibaba/excel/converters/WriteConverterContext.java → easyexcel-core/src/main/java/com/alibaba/excel/converters/WriteConverterContext.java

0
src/main/java/com/alibaba/excel/converters/bigdecimal/BigDecimalBooleanConverter.java → easyexcel-core/src/main/java/com/alibaba/excel/converters/bigdecimal/BigDecimalBooleanConverter.java

0
src/main/java/com/alibaba/excel/converters/bigdecimal/BigDecimalNumberConverter.java → easyexcel-core/src/main/java/com/alibaba/excel/converters/bigdecimal/BigDecimalNumberConverter.java

0
src/main/java/com/alibaba/excel/converters/bigdecimal/BigDecimalStringConverter.java → easyexcel-core/src/main/java/com/alibaba/excel/converters/bigdecimal/BigDecimalStringConverter.java

0
src/main/java/com/alibaba/excel/converters/biginteger/BigIntegerBooleanConverter.java → easyexcel-core/src/main/java/com/alibaba/excel/converters/biginteger/BigIntegerBooleanConverter.java

0
src/main/java/com/alibaba/excel/converters/biginteger/BigIntegerNumberConverter.java → easyexcel-core/src/main/java/com/alibaba/excel/converters/biginteger/BigIntegerNumberConverter.java

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save