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 |
||||
|
||||
完善测试用例,防止歧义,模型字段映射不上时候有抛异常,改为提醒。 |
||||
|
||||
# 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 |
||||
|
||||
# 2.0.0 |
||||
* 优化读写逻辑 |
||||
* 优化读写对外接口 |
||||
* 加入转换器,方便格式转换 |
||||
* 极大优化读大文件的内存和效率 |
||||
# 1.2.4 |
||||
|
||||
修复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