forked from github/easyexcel
zhuangjiaju
5 years ago
13 changed files with 349 additions and 150 deletions
@ -0,0 +1,17 @@ |
|||||||
|
package com.alibaba.easyexcel.test.demo.read; |
||||||
|
|
||||||
|
import java.util.Date; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
/** |
||||||
|
* 基础数据类.这里的排序和excel里面的排序一致 |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
**/ |
||||||
|
@Data |
||||||
|
public class DemoData { |
||||||
|
private String string; |
||||||
|
private Date date; |
||||||
|
private Double doubleData; |
||||||
|
} |
@ -0,0 +1,49 @@ |
|||||||
|
package com.alibaba.easyexcel.test.demo.read; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
|
||||||
|
import com.alibaba.excel.context.AnalysisContext; |
||||||
|
import com.alibaba.excel.event.AnalysisEventListener; |
||||||
|
import com.alibaba.fastjson.JSON; |
||||||
|
|
||||||
|
/** |
||||||
|
* 模板的读取类 |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
*/ |
||||||
|
public class DemoDataListener extends AnalysisEventListener<DemoData> { |
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(DemoDataListener.class); |
||||||
|
/** |
||||||
|
* 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收 |
||||||
|
*/ |
||||||
|
private static final int BATCH_COUNT = 5; |
||||||
|
List<DemoData> list = new ArrayList<DemoData>(); |
||||||
|
|
||||||
|
@Override |
||||||
|
public void invoke(DemoData data, AnalysisContext context) { |
||||||
|
LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data)); |
||||||
|
list.add(data); |
||||||
|
if (list.size() >= BATCH_COUNT) { |
||||||
|
saveData(); |
||||||
|
list.clear(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void doAfterAllAnalysed(AnalysisContext context) { |
||||||
|
saveData(); |
||||||
|
LOGGER.info("所有数据解析完成!"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 加上存储数据库 |
||||||
|
*/ |
||||||
|
private void saveData() { |
||||||
|
LOGGER.info("{}条数据,开始存储数据库!", list.size()); |
||||||
|
LOGGER.info("存储数据库成功!"); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,28 @@ |
|||||||
|
package com.alibaba.easyexcel.test.demo.read; |
||||||
|
|
||||||
|
import java.util.Date; |
||||||
|
|
||||||
|
import com.alibaba.excel.annotation.ExcelProperty; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
/** |
||||||
|
* 基础数据类 |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
**/ |
||||||
|
@Data |
||||||
|
public class IndexOrNameData { |
||||||
|
/** |
||||||
|
* 强制读取第三个 这里不建议 index 和 name 同时用,要么一个对象只用index,要么一个对象只用name去匹配 |
||||||
|
*/ |
||||||
|
@ExcelProperty(index = 2) |
||||||
|
private Double doubleData; |
||||||
|
/** |
||||||
|
* 用名字去匹配,这里需要注意,如果名字重复,会导致只有一个字段读取到数据 |
||||||
|
*/ |
||||||
|
@ExcelProperty("字符串标题") |
||||||
|
private String string; |
||||||
|
@ExcelProperty("日期标题") |
||||||
|
private Date date; |
||||||
|
} |
@ -0,0 +1,49 @@ |
|||||||
|
package com.alibaba.easyexcel.test.demo.read; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
|
||||||
|
import com.alibaba.excel.context.AnalysisContext; |
||||||
|
import com.alibaba.excel.event.AnalysisEventListener; |
||||||
|
import com.alibaba.fastjson.JSON; |
||||||
|
|
||||||
|
/** |
||||||
|
* 模板的读取类 |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
*/ |
||||||
|
public class IndexOrNameDataListener extends AnalysisEventListener<IndexOrNameData> { |
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(IndexOrNameDataListener.class); |
||||||
|
/** |
||||||
|
* 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收 |
||||||
|
*/ |
||||||
|
private static final int BATCH_COUNT = 5; |
||||||
|
List<IndexOrNameData> list = new ArrayList<IndexOrNameData>(); |
||||||
|
|
||||||
|
@Override |
||||||
|
public void invoke(IndexOrNameData data, AnalysisContext context) { |
||||||
|
LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data)); |
||||||
|
list.add(data); |
||||||
|
if (list.size() >= BATCH_COUNT) { |
||||||
|
saveData(); |
||||||
|
list.clear(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void doAfterAllAnalysed(AnalysisContext context) { |
||||||
|
saveData(); |
||||||
|
LOGGER.info("所有数据解析完成!"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 加上存储数据库 |
||||||
|
*/ |
||||||
|
private void saveData() { |
||||||
|
LOGGER.info("{}条数据,开始存储数据库!", list.size()); |
||||||
|
LOGGER.info("存储数据库成功!"); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,51 @@ |
|||||||
|
package com.alibaba.easyexcel.test.demo.read; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
|
||||||
|
import org.junit.Ignore; |
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import com.alibaba.easyexcel.test.util.TestFileUtil; |
||||||
|
import com.alibaba.excel.EasyExcelFactory; |
||||||
|
import com.alibaba.excel.ExcelReader; |
||||||
|
import com.alibaba.excel.read.metadata.ReadSheet; |
||||||
|
|
||||||
|
/** |
||||||
|
* 读的常见写法 |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
*/ |
||||||
|
@Ignore |
||||||
|
public class ReadTest { |
||||||
|
/** |
||||||
|
* 最简单的读 |
||||||
|
* <li>1. 创建excel对应的实体对象 参照{@link DemoData} |
||||||
|
* <li>2. 由于默认异步读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener} |
||||||
|
* <li>3. 直接读即可 |
||||||
|
*/ |
||||||
|
@Test |
||||||
|
public void simpleRead() { |
||||||
|
// 写法1:
|
||||||
|
String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx"; |
||||||
|
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 然后千万别忘记 finish
|
||||||
|
EasyExcelFactory.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead().finish(); |
||||||
|
|
||||||
|
// 写法2:
|
||||||
|
fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx"; |
||||||
|
ExcelReader excelReader = EasyExcelFactory.read(fileName, DemoData.class, new DemoDataListener()).build(); |
||||||
|
ReadSheet readSheet = EasyExcelFactory.readSheet(0).build(); |
||||||
|
excelReader.read(readSheet); |
||||||
|
excelReader.finish(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 指定列的下标或者列名 |
||||||
|
* <li>使用{@link com.alibaba.excel.annotation.ExcelProperty}注解即可 |
||||||
|
*/ |
||||||
|
@Test |
||||||
|
public void indexOrNameRead() { |
||||||
|
String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx"; |
||||||
|
// 这里默认读取第一个sheet 然后千万别忘记 finish
|
||||||
|
EasyExcelFactory.read(fileName, IndexOrNameData.class, new IndexOrNameDataListener()).sheet().doRead().finish(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,12 @@ |
|||||||
|
package com.alibaba.easyexcel.test.demo.web; |
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication; |
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication; |
||||||
|
|
||||||
|
@SpringBootApplication |
||||||
|
public class EasyexcelApplication { |
||||||
|
|
||||||
|
public static void main(String[] args) { |
||||||
|
SpringApplication.run(EasyexcelApplication.class, args); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
package com.alibaba.easyexcel.test.demo.write; |
||||||
|
|
||||||
|
import java.util.Date; |
||||||
|
|
||||||
|
import com.alibaba.excel.annotation.ExcelProperty; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
/** |
||||||
|
* 基础数据类.行高 列宽可以忽略 |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
**/ |
||||||
|
@Data |
||||||
|
public class DemoData { |
||||||
|
|
||||||
|
@ExcelProperty("字符串标题") |
||||||
|
private String string; |
||||||
|
/** |
||||||
|
* 指定写到excel的格式 |
||||||
|
*/ |
||||||
|
@ExcelProperty("日期标题") |
||||||
|
private Date date; |
||||||
|
/** |
||||||
|
* 数字转成百分比,默认数字存到excel是数字,不存在格式,现在要变成百分比就变成文本了,所以要指定转换器 |
||||||
|
*/ |
||||||
|
@ExcelProperty("数字标题") |
||||||
|
private Double doubleData; |
||||||
|
} |
@ -0,0 +1,44 @@ |
|||||||
|
package com.alibaba.easyexcel.test.demo.write; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Date; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import org.junit.Ignore; |
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import com.alibaba.easyexcel.test.util.TestFileUtil; |
||||||
|
import com.alibaba.excel.EasyExcelFactory; |
||||||
|
|
||||||
|
/** |
||||||
|
* 写的常见写法 |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
*/ |
||||||
|
@Ignore |
||||||
|
public class WriteTest { |
||||||
|
/** |
||||||
|
* 最简单的写 |
||||||
|
* <li>1. 创建excel对应的实体对象 参照{@link com.alibaba.easyexcel.test.demo.write.DemoData} |
||||||
|
* <li>2. 直接写即可 |
||||||
|
*/ |
||||||
|
@Test |
||||||
|
public void simpleWrite() { |
||||||
|
String fileName = TestFileUtil.getPath() + "write" + System.currentTimeMillis() + ".xlsx"; |
||||||
|
// 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后千万别忘记 finish
|
||||||
|
// 如果这里想使用03 则 传入excelType参数即可
|
||||||
|
EasyExcelFactory.write(fileName, DemoData.class).sheet("模板").doWrite(data()).finish(); |
||||||
|
} |
||||||
|
|
||||||
|
private List<DemoData> data() { |
||||||
|
List<DemoData> list = new ArrayList<DemoData>(); |
||||||
|
for (int i = 0; i < 10; i++) { |
||||||
|
DemoData data = new DemoData(); |
||||||
|
data.setString("字符串" + 0); |
||||||
|
data.setDate(new Date()); |
||||||
|
data.setDoubleData(0.56); |
||||||
|
list.add(data); |
||||||
|
} |
||||||
|
return list; |
||||||
|
} |
||||||
|
} |
Binary file not shown.
@ -1,39 +1,25 @@ |
|||||||
# 1.0.1 |
# 2.0.0 |
||||||
|
* 优化读写逻辑 |
||||||
完善测试用例,防止歧义,模型字段映射不上时候有抛异常,改为提醒。 |
* 优化读写对外接口 |
||||||
|
* 加入转换器,方便格式转换 |
||||||
# 1.0.2 |
* 极大优化读大文件的内存和效率 |
||||||
|
|
||||||
修复拿到一行数据后,存到list中,但最后处理时候变为空的bug。 |
|
||||||
|
|
||||||
# 1.0.3 |
|
||||||
|
|
||||||
修复无@ExcelProperty标注的多余字段时候报错。 |
|
||||||
|
|
||||||
# 1.0.4 |
|
||||||
|
|
||||||
修复日期类型转换时候数字问题。基础模型支持字段类型int,long,double,boolean,date,string |
|
||||||
|
|
||||||
# 1.0.5 |
|
||||||
|
|
||||||
优化类型转换的性能。 |
|
||||||
|
|
||||||
# 1.0.6 |
|
||||||
|
|
||||||
增加@ExcelColumnNum,修复字符串前后空白,增加过滤功能。 |
|
||||||
# 1.0.8 |
|
||||||
|
|
||||||
如果整行excel数据全部为空,则不解析返回。完善多sheet的解析。 |
|
||||||
|
|
||||||
# 1.0.9 |
|
||||||
|
|
||||||
修复excel超过16列被覆盖的问题,修复数据只有一行时候无法透传的bug。 |
|
||||||
|
|
||||||
|
|
||||||
# 1.2.1 |
|
||||||
|
|
||||||
修复POI在大并发情况下创建临时目录失败的bug |
|
||||||
|
|
||||||
# 1.2.4 |
# 1.2.4 |
||||||
|
|
||||||
修复read()方法存在的bug |
修复read()方法存在的bug |
||||||
|
# 1.2.1 |
||||||
|
修复POI在大并发情况下创建临时目录失败的bug |
||||||
|
# 1.0.9 |
||||||
|
修复excel超过16列被覆盖的问题,修复数据只有一行时候无法透传的bug。 |
||||||
|
# 1.0.8 |
||||||
|
如果整行excel数据全部为空,则不解析返回。完善多sheet的解析。 |
||||||
|
# 1.0.6 |
||||||
|
增加@ExcelColumnNum,修复字符串前后空白,增加过滤功能。 |
||||||
|
# 1.0.5 |
||||||
|
优化类型转换的性能。 |
||||||
|
# 1.0.4 |
||||||
|
修复日期类型转换时候数字问题。基础模型支持字段类型int,long,double,boolean,date,string |
||||||
|
# 1.0.3 |
||||||
|
修复无@ExcelProperty标注的多余字段时候报错。 |
||||||
|
# 1.0.2 |
||||||
|
修复拿到一行数据后,存到list中,但最后处理时候变为空的bug。 |
||||||
|
# 1.0.1 |
||||||
|
完善测试用例,防止歧义,模型字段映射不上时候有抛异常,改为提醒。 |
Loading…
Reference in new issue