README.md 6.7 KB
Newer Older
Z
zhuangjiaju 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
<p align="center">
    <h1>
        <span>easyexcel<span>
        <a target="_blank" href="https://travis-ci.org/alibaba/easyexcel">
            <img src="https://travis-ci.org/alibaba/easyexcel.svg?branch=master" ></img>
        </a>
    </h1>
</p>
<p align="center">
    QQ群: <a href="//shang.qq.com/wpa/qunwpa?idkey=53d9d821b0833e3c14670f007488a61e300f00ff4f1b81fd950590d90dd80f80">662022184</a>
</p>

----------------------------------

J
update  
jipengfei.jpf 已提交
15 16
# 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模式。在上层做了模型转换的封装,让使用者更加简单方便
17
## 相关文档
J
update  
jipengfei.jpf 已提交
18 19 20 21 22
* [关于软件](/abouteasyexcel.md)
* [快速使用](/quickstart.md)
* [常见问题](/problem.md)
* [更新记事](/update.md)
* [English-README](/easyexcel_en.md)
23
## 二方包 
24

J
update  
jipengfei.jpf 已提交
25
<dependency>
J
jipengfei-jpf 已提交
26
    <groupId>com.alibaba</groupId>
J
update  
jipengfei.jpf 已提交
27 28 29
    <artifactId>easyexcel</artifactId>
    <version>{latestVersion}</version>
</dependency>
30

J
jipengfei.jpf 已提交
31
## 最新版本:1.1.2-beta4
32
## 维护者
J
update  
jipengfei.jpf 已提交
33
姬朋飞(玉霄)
34 35
## 快速开始
### 读Excel
36
测试代码地址:[https://github.com/alibaba/easyexcel/blob/master/src/test/java/com/alibaba/easyexcel/test/ReadTest.java](/src/test/java/com/alibaba/easyexcel/test/ReadTest.java)
J
jipengfei.jpf 已提交
37

38
读07版小于1000行数据返回List<List<String>>
39 40
```
List<Object> data = EasyExcelFactory.read(inputStream, new Sheet(1, 0));
41 42
```
读07版小于1000行数据返回List<? extend BaseRowModel>
43 44
```
List<Object> data = EasyExcelFactory.read(inputStream, new Sheet(2, 1,JavaModel.class));
45 46
```
读07版大于1000行数据返回List<List<String>>
47 48
```
ExcelListener excelListener = new ExcelListener();
49 50 51 52
EasyExcelFactory.readBySax(inputStream, new Sheet(1, 1), excelListener);
```

读07版大于1000行数据返回List<? extend BaseRowModel>
53 54
```
ExcelListener excelListener = new ExcelListener();
55 56 57
EasyExcelFactory.readBySax(inputStream, new Sheet(2, 1,JavaModel.class), excelListener);
```
读03版方法同上
58
### 写Excel
59 60
测试代码地址:[https://github.com/alibaba/easyexcel/blob/master/src/test/java/com/alibaba/easyexcel/test/WriteTest.java](/src/test/java/com/alibaba/easyexcel/test/WriteTest.java)
没有模板
61
```OutputStream out = new FileOutputStream("/Users/jipengfei/2007.xlsx");
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
ExcelWriter writer = EasyExcelFactory.getWriter(out);

//写第一个sheet, sheet1  数据全是List<String> 无模型映射关系
Sheet sheet1 = new Sheet(1, 3);
sheet1.setSheetName("第一个sheet");
//设置列宽 设置每列的宽度
Map columnWidth = new HashMap();
columnWidth.put(0,10000);columnWidth.put(1,40000);columnWidth.put(2,10000);columnWidth.put(3,10000);
sheet1.setColumnWidthMap(columnWidth);
sheet1.setHead(createTestListStringHead());
//or 设置自适应宽度
//sheet1.setAutoWidth(Boolean.TRUE);
writer.write1(createTestListObject(), sheet1);

//写第二个sheet sheet2  模型上打有表头的注解,合并单元格
Sheet sheet2 = new Sheet(2, 3, JavaModel1.class, "第二个sheet", null);
sheet2.setTableStyle(createTableStyle());
writer.write(createTestListJavaMode(), sheet2);

//写第三个sheet包含多个table情况
Sheet sheet3 = new Sheet(3, 0);
sheet3.setSheetName("第三个sheet");
Table table1 = new Table(1);
table1.setHead(createTestListStringHead());
writer.write1(createTestListObject(), sheet3, table1);

//写sheet2  模型上打有表头的注解
Table table2 = new Table(2);
table2.setTableStyle(createTableStyle());
table2.setClazz(JavaModel1.class);
writer.write(createTestListJavaMode(), sheet3, table2);

//关闭资源
writer.finish();
out.close();
J
update  
jipengfei.jpf 已提交
97
```
98
有模板
99
```InputStream inputStream = new BufferedInputStream(new FileInputStream("/Users/jipengfei/temp.xlsx"));
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
OutputStream out = new FileOutputStream("/Users/jipengfei/2007.xlsx");
ExcelWriter writer = EasyExcelFactory.getWriterWithTemp(inputStream,out,ExcelTypeEnum.XLSX,true);

//写第一个sheet, sheet1  数据全是List<String> 无模型映射关系
Sheet sheet1 = new Sheet(1, 3);
sheet1.setSheetName("第一个sheet");
//设置列宽 设置每列的宽度
Map columnWidth = new HashMap();
columnWidth.put(0,10000);columnWidth.put(1,40000);columnWidth.put(2,10000);columnWidth.put(3,10000);
sheet1.setColumnWidthMap(columnWidth);
sheet1.setHead(createTestListStringHead());
//or 设置自适应宽度
//sheet1.setAutoWidth(Boolean.TRUE);
writer.write1(createTestListObject(), sheet1);

//写第二个sheet sheet2  模型上打有表头的注解,合并单元格
Sheet sheet2 = new Sheet(2, 3, JavaModel1.class, "第二个sheet", null);
sheet2.setTableStyle(createTableStyle());
writer.write(createTestListJavaMode(), sheet2);

//写第三个sheet包含多个table情况
Sheet sheet3 = new Sheet(3, 0);
sheet3.setSheetName("第三个sheet");
Table table1 = new Table(1);
table1.setHead(createTestListStringHead());
writer.write1(createTestListObject(), sheet3, table1);

//写sheet2  模型上打有表头的注解
Table table2 = new Table(2);
table2.setTableStyle(createTableStyle());
table2.setClazz(JavaModel1.class);
writer.write(createTestListJavaMode(), sheet3, table2);

//关闭资源
writer.finish();
out.close();
```

138 139
### web下载实例写法
```
J
jipengfei-jpf 已提交
140 141 142
public class Down {
    @GetMapping("/a.htm")
    public void cooperation(HttpServletRequest request, HttpServletResponse response) {
143
        ServletOutputStream out = response.getOutputStream();
J
jipengfei-jpf 已提交
144 145 146
         response.setContentType("multipart/form-data");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-disposition", "attachment;filename="+fileName+".xlsx");
J
jipengfei-jpf 已提交
147
        ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, true);
148
        String fileName = new String(("UserInfo " + new SimpleDateFormat("yyyy-MM-dd").format(new Date()))
J
jipengfei-jpf 已提交
149
                .getBytes(), "UTF-8");
150 151 152
        Sheet sheet1 = new Sheet(1, 0);
        sheet1.setSheetName("第一个sheet");
        writer.write0(getListString(), sheet1);
J
jipengfei.jpf 已提交
153
        writer.finish();
J
jipengfei-jpf 已提交
154
      
J
jipengfei.jpf 已提交
155
        out.flush();
J
jipengfei-jpf 已提交
156 157 158
        }
    }
}
159 160
```
### 联系我们
J
jipengfei-jpf 已提交
161
有问题阿里同事可以通过钉钉找到我,阿里外同学可以通过git留言。其他技术非技术相关的也欢迎一起探讨。
J
jipengfei.jpf 已提交
162
### 招聘&交流
J
jipengfei-jpf 已提交
163
阿里巴巴新零售事业部--诚招JAVA资深开发、技术专家。有意向可以微信联系,简历可以发我邮箱jipengfei.jpf@alibaba-inc.com
J
jipengfei.jpf 已提交
164
或者加微信:18042000709
Z
zhuangjiaju 已提交
165
#### 微信
Z
zhuangjiaju 已提交
166
<img src="https://github.com/alibaba/easyexcel/blob/master/img/readme/wechat.png" width="30%" height="30%" />