diff --git a/README.md b/README.md
new file mode 100644
index 00000000..f0e592a1
--- /dev/null
+++ b/README.md
@@ -0,0 +1,89 @@
+# JAVA解析Excel工具easyexcel
+
+Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到KB级别,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便
+
+# 相关文档
+
+* [关于软件](/abouteasyexcel.md)
+* [快速使用](/quickstart.md)
+* [常见问题](/problem.md)
+* [更新记事](/update.md)
+* [English-README](/easyexcel_en.md)
+
+# 二方包
+
+```
+
+ com.alibaba.shared
+ easyexcel
+ {latestVersion}
+
+```
+
+# 最新版本
+## VERSION : 1.2.16
+
+# 维护者
+姬朋飞(玉霄)
+
+# 快速开始
+
+## 读Excel
+
+```
+public void noModelMultipleSheet() {
+ InputStream inputStream = getInputStream("2007NoModelMultipleSheet.xlsx");
+ try {
+ ExcelReader reader = new ExcelReader(inputStream, ExcelTypeEnum.XLSX, null,
+ new AnalysisEventListener>() {
+ @Override
+ public void invoke(List object, AnalysisContext context) {
+ System.out.println(
+ "当前sheet:" + context.getCurrentSheet().getSheetNo() + " 当前行:" + context.getCurrentRowNum()
+ + " data:" + object);
+ }
+ @Override
+ public void doAfterAllAnalysed(AnalysisContext context) {
+
+ }
+ });
+
+ reader.read();
+ } catch (Exception e) {
+ e.printStackTrace();
+
+ } finally {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+```
+## 写Excel
+
+```
+@Test
+public void test1() throws FileNotFoundException {
+ OutputStream out = new FileOutputStream("/Users/jipengfei/78.xlsx");
+ try {
+ ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX);
+ //写第一个sheet, sheet1 数据全是List 无模型映射关系
+ Sheet sheet1 = new Sheet(1, 0,ExcelPropertyIndexModel.class);
+ writer.write(getData(), sheet1);
+ writer.finish();
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ out.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+```
+# 联系我们
+
+有问题阿里同事可以通过钉钉找到我,阿里外同学可以通过git留言。其他技术非技术相关的也欢迎一起探讨。
\ No newline at end of file
diff --git a/abouteasyexcel.md b/abouteasyexcel.md
new file mode 100644
index 00000000..8c06a2a9
--- /dev/null
+++ b/abouteasyexcel.md
@@ -0,0 +1,53 @@
+# easyexcel要去解决的问题
+
+## Excel读写时候内存溢出
+
+虽然POI是目前使用最多的用来做excel解析的框架,但这个框架并不那么完美。大部分使用POI都是使用他的userModel模式。userModel的好处是上手容易使用简单,随便拷贝个代码跑一下,剩下就是写业务转换了,虽然转换也要写上百行代码,相对比较好理解。然而userModel模式最大的问题是在于非常大的内存消耗,一个几兆的文件解析要用掉上百兆的内存。现在很多应用采用这种模式,之所以还正常在跑一定是并发不大,并发上来后一定会OOM或者频繁的full gc。
+
+## 其他开源框架使用复杂
+
+对POI有过深入了解的估计才知道原来POI还有SAX模式。但SAX模式相对比较复杂,excel有03和07两种版本,两个版本数据存储方式截然不同,sax解析方式也各不一样。想要了解清楚这两种解析方式,才去写代码测试,估计两天时间是需要的。再加上即使解析完,要转换到自己业务模型还要很多繁琐的代码。总体下来感觉至少需要三天,由于代码复杂,后续维护成本巨大。
+
+## 其他开源框架存在一些BUG修复不及时
+
+由于我们的系统大多数都是大并发的情况下运行的,在大并发情况下,我们会发现poi存在一些bug,如果让POI团队修复估计遥遥无期了。所以我们在easyexcel对这些bug做了规避。
+如下一段报错就是在大并发情况下poi抛的一个异常。
+```
+Caused by: java.io.IOException: Could not create temporary directory '/home/admin/dio2o/.default/temp/poifiles'
+ at org.apache.poi.util.DefaultTempFileCreationStrategy.createTempDirectory(DefaultTempFileCreationStrategy.java:93) ~[poi-3.15.jar:3.15]
+ at org.apache.poi.util.DefaultTempFileCreationStrategy.createPOIFilesDirectory(DefaultTempFileCreationStrategy.java:82) ~[poi-3.15.jar:3.15]
+```
+报错地方poi源码如下
+```
+ private void createTempDirectory(File directory) throws IOException {
+ if (!(directory.exists() || directory.mkdirs()) || !directory.isDirectory()) {
+ throw new IOException("Could not create temporary directory '" + directory + "'");
+ }
+ }
+```
+仔细看代码容易明白如果在并发情况下,如果2个线程同时判断directory.exists()都 为false,但执行directory.mkdirs()如果一些线程优先执行完,另外一个线程就会返回false。最终 throw new IOException("Could not create temporary directory '" + directory + "'")。针对这个问题easyexcel在写文件时候首先创建了该临时目录,避免poi在并发创建时候引起不该有的报错。
+
+## Excel格式分析格式分析
+
+- xls是Microsoft Excel2007前excel的文件存储格式,实现原理是基于微软的ole db是微软com组件的一种实现,本质上也是一个微型数据库,由于微软的东西很多不开源,另外也已经被淘汰,了解它的细节意义不大,底层的编程都是基于微软的com组件去开发的。
+- xlsx是Microsoft Excel2007后excel的文件存储格式,实现是基于openXml和zip技术。这种存储简单,安全传输方便,同时处理数据也变的简单。
+- csv 我们可以理解为纯文本文件,可以被excel打开。他的格式非常简单,解析起来和解析文本文件一样。
+
+## 核心原理
+
+写有大量数据的xlsx文件时,POI为我们提供了SXSSFWorkBook类来处理,这个类的处理机制是当内存中的数据条数达到一个极限数量的时候就flush这部分数据,再依次处理余下的数据,这个在大多数场景能够满足需求。
+读有大量数据的文件时,使用WorkBook处理就不行了,因为POI对文件是先将文件中的cell读入内存,生成一个树的结构(针对Excel中的每个sheet,使用TreeMap存储sheet中的行)。如果数据量比较大,则同样会产生java.lang.OutOfMemoryError: Java heap space错误。POI官方推荐使用“XSSF and SAX(event API)”方式来解决。
+分析清楚POI后要解决OOM有3个关键。
+
+### 1、文件解压文件读取通过文件形式
+
+![屏幕快照 2018-01-22 上午8.52.08.png](http://ata2-img.cn-hangzhou.img-pub.aliyun-inc.com/e3a3500014c95f7118d8c200a51acab4.png)
+
+### 2、避免将全部全部数据一次加载到内存
+
+采用sax模式一行一行解析,并将一行的解析结果以观察者的模式通知处理。
+![基础模板1 (2).png](http://ata2-img.cn-hangzhou.img-pub.aliyun-inc.com/82bb195ac62532963b2364d2e4da23e5.png)
+
+### 3、抛弃不重要的数据
+
+Excel解析时候会包含样式,字体,宽度等数据,但这些数据是我们不关系的,如果将这部分数据抛弃可以大大降低内存使用。Excel中数据如下Style占了相当大的空间。
\ No newline at end of file
diff --git a/easyexcel_en.md b/easyexcel_en.md
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++ b/easyexcel_en.md
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 00000000..31ab488d
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,43 @@
+
+
+ 4.0.0
+
+ com.alibaba
+ a2m.china
+ 3
+
+ com.alibaba
+ easyexcel
+ 1.0.0-release
+
+
+
+ org.apache.poi
+ poi
+ 3.15
+
+
+ org.apache.poi
+ poi-ooxml
+ 3.15
+
+
+ commons-beanutils
+ commons-beanutils
+ 1.9.2
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.apache.commons
+ commons-compress
+ 1.14
+
+
+
\ No newline at end of file
diff --git a/problem.md b/problem.md
new file mode 100644
index 00000000..2d9c70cd
--- /dev/null
+++ b/problem.md
@@ -0,0 +1,116 @@
+# 常见问题汇总
+
+## 1、系统环境变量缺失或JDK版本不支持
+
+```
+java.lang.NullPointerException
+ at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
+ at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
+ at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
+ at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774)
+ at sun.font.SunFontManager$2.run(SunFontManager.java:431)
+ at java.security.AccessController.doPrivileged(Native Method)
+ at sun.font.SunFontManager.(SunFontManager.java:376)
+ at sun.awt.FcFontManager.(FcFontManager.java:35)
+ at sun.awt.X11FontManager.(X11FontManager.java:57)
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
+ at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
+ at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
+ at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
+ at java.lang.Class.newInstance(Class.java:442)
+ at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
+ at java.security.AccessController.doPrivileged(Native Method)
+ at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
+ at java.awt.Font.getFont2D(Font.java:495)
+ at java.awt.Font.canDisplayUpTo(Font.java:2080)
+ at java.awt.font.TextLayout.singleFont(TextLayout.java:470)
+ at java.awt.font.TextLayout.(TextLayout.java:531)
+ at org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:275)
+ at org.apache.poi.xssf.streaming.AutoSizeColumnTracker.(AutoSizeColumnTracker.java:117)
+ at org.apache.poi.xssf.streaming.SXSSFSheet.(SXSSFSheet.java:79)
+ at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:656)
+ at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:677)
+ at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:83)
+ at com.alibaba.excel.context.GenerateContextImpl.buildCurrentSheet(GenerateContextImpl.java:93)
+ at com.alibaba.excel.write.ExcelBuilderImpl.addContent(ExcelBuilderImpl.java:53)
+ at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:44)
+```
+
+### 解决方法
+
+该异常由于自己的环境变量缺少swing需要的字体配置,检查自己应用是否有配置-Djava.awt.headless=true,如果没有请加上该系统参数,可以解决问题。如果仍旧不行,在dockerfile中增加字体安装命令:
+![粘贴图片.png](http://ata2-img.cn-hangzhou.img-pub.aliyun-inc.com/a857edfbc8199db7bb35b9e99f1f57d5.png)
+参考:
+https://lark.alipay.com/aone355606/gfqllg/ulptif
+https://stackoverflow.com/questions/30626136/cannot-load-font-in-jre-8 http://www.jianshu.com/p/c05b5fc71bd0
+## 2、xls格式错用xlsx方式解析
+
+```
+org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException: The supplied data appears to be in the OLE2 Format. You are calling the part of POI that deals with OOXML (Office Open XML) Documents. You need to call a different part of POI to process this data (eg HSSF instead of XSSF)
+ at org.apache.poi.openxml4j.opc.internal.ZipHelper.verifyZipHeader(ZipHelper.java:172)
+ at org.apache.poi.openxml4j.opc.internal.ZipHelper.openZipStream(ZipHelper.java:229)
+ at org.apache.poi.openxml4j.opc.ZipPackage.(ZipPackage.java:97)
+ at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:342)
+ at com.alibaba.excel.analysis.v07.XlsxSaxAnalyser.(XlsxSaxAnalyser.java:46)
+ at com.alibaba.excel.analysis.ExcelAnalyserImpl.getSaxAnalyser(ExcelAnalyserImpl.java:30)
+ at com.alibaba.excel.analysis.ExcelAnalyserImpl.analysis(ExcelAnalyserImpl.java:51)
+ at com.alibaba.excel.ExcelReader.read(ExcelReader.java:55)
+ at read.v07.Read2007Xlsx.noModel(Read2007Xlsx.java:42)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:498)
+ at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
+ at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
+ at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
+ at mockit.integration.junit4.internal.BlockJUnit4ClassRunnerDecorator.executeTest(BlockJUnit4ClassRunnerDecorator.java:126)
+ at mockit.integration.junit4.internal.BlockJUnit4ClassRunnerDecorator.invokeExplosively(BlockJUnit4ClassRunnerDecorator.java:104)
+ at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java)
+ at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
+ at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
+ at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
+ at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
+ at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
+ at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
+ at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
+ at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
+ at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
+ at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
+ at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
+ at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
+ at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
+ at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:237)
+ at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:498)
+ at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
+```
+
+### 解决方法
+
+该异常时由于03版的xls,文件用07版的方式做解析的报错,请检查excelType是否设置错误。或者是不是手动去修改了excel文件名后缀的xls为xlsx。
+
+## 3、xlsx错用xls解析
+
+```
+org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)
+ at org.apache.poi.poifs.storage.HeaderBlock.(HeaderBlock.java:152)
+ at org.apache.poi.poifs.storage.HeaderBlock.(HeaderBlock.java:140)
+ at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.(NPOIFSFileSystem.java:302)
+ at org.apache.poi.poifs.filesystem.POIFSFileSystem.(POIFSFileSystem.java:87)
+ at com.alibaba.excel.analysis.v03.XlsSaxAnalyser.(XlsSaxAnalyser.java:55)
+ at com.alibaba.excel.analysis.ExcelAnalyserImpl.getSaxAnalyser(ExcelAnalyserImpl.java:27)
+ at com.alibaba.excel.analysis.ExcelAnalyserImpl.analysis(ExcelAnalyserImpl.java:51)
+ at com.alibaba.excel.ExcelReader.read(ExcelReader.java:55)
+ at read.v03.XLS2003FunctionTest.testExcel2003NoModel(XLS2003FunctionTest.java:31)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:498)
+ at mockit.integration.junit3.internal.JUnitTestCaseDecorator.runTest(JUnitTestCaseDecorator.java:142)
+ at mockit.integration.junit3.internal.JUnitTestCaseDecorator.originalRunBare(JUnitTestCaseDecorator.java:102)
+ at mockit.integration.junit3.internal.JUnitTestCaseDecorator.runBare(JUnitTestCaseDecorator.java:87)
+```
+原理和原因大致同上
\ No newline at end of file
diff --git a/quickstart.md b/quickstart.md
new file mode 100644
index 00000000..eb745a28
--- /dev/null
+++ b/quickstart.md
@@ -0,0 +1,368 @@
+# easyexcel核心功能
+
+## *读任意大小的03、07版Excel不会OO]
+## *读Excel自动通过注解,把结果映射为java模型
+## *读Excel支持多sheet
+## *读Excel时候是否对Excel内容做trim()增加容错
+## *写小量数据的03版Excel(不要超过2000行)
+## *写任意大07版Excel不会OOM
+## *写Excel通过注解将表头自动写入Excel
+## *写Excel可以自定义Excel样式 如:字体,加粗,表头颜色,数据内容颜色
+## *写Excel到多个不同sheet
+## *写Excel时一个sheet可以写多个Table
+## *写Excel时候自定义是否需要写表头
+
+## 二方包依赖
+
+使用前最好咨询下最新版,或者到mvn仓库搜索先easyexcel的最新版
+
+```
+
+ com.alibaba.shared
+ easyexcel
+ 1.2.16
+
+```
+## 读Excel
+
+使用easyexcel解析03、07版本的Excel只是ExcelTypeEnum不同,其他使用完全相同,使用者无需知道底层解析的差异。
+
+### 无java模型直接把excel解析的每行结果以List<String>返回 在ExcelListener获取解析结果
+
+读excel代码示例如下:
+```
+ @Test
+ public void testExcel2003NoModel() {
+ InputStream inputStream = getInputStream("loan1.xls");
+ try {
+ // 解析每行结果在listener中处理
+ ExcelListener listener = new ExcelListener();
+
+ ExcelReader excelReader = new ExcelReader(inputStream, ExcelTypeEnum.XLS, null, listener);
+ excelReader.read();
+ } catch (Exception e) {
+
+ } finally {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+```
+ExcelListener示例代码如下:
+```
+ /* 解析监听器,
+ * 每解析一行会回调invoke()方法。
+ * 整个excel解析结束会执行doAfterAllAnalysed()方法
+ *
+ * 下面只是我写的一个样例而已,可以根据自己的逻辑修改该类。
+ * @author jipengfei
+ * @date 2017/03/14
+ */
+public class ExcelListener extends AnalysisEventListener {
+
+ //自定义用于暂时存储data。
+ //可以通过实例获取该值
+ private List