目录
1、业务需求操作顺序
- 创建表需求表,在dto中创建实体类
- 创建service用Stream来导入excel表,并在impl中创建监听器
- 在监听器中面对大数据量时,先进行一定数量的解析在分次向数据库中插入数据,做的是批量存储,在生产环境下在列表里面放入3000条数据,在用一条批量的sql语句插入数据库,太大了数据库那边承受不了。
- 在controller创建接口multipart(file)接收前端传送的文件
- 保存Excel数据到数据库
2、官方网站
GitHub - alibaba/easyexcel: 快速、简洁、解决大文件内存溢出的java处理Excel工具
3、写:导出demo
public class ExcelWriteTest {
//2007版本的xlsx
@Test
public void simpleWriteXlsx() {
// 注意 simpleWrite在数据量不大的情况下可以使用(5000以内,具体也要看实际情况),数据量大参照 重复多次写入
// 写法1 JDK8+
// since: 3.0.0-beta1
String fileName = "D:/banking-project/exceltest/simpleWrite" + System.currentTimeMillis() + ".xlsx";
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
// 如果这里想使用03 则 传入excelType参数即可
EasyExcel.write(fileName, ExcelStudentDTO.class)
.sheet("模板")
.doWrite(data());
}
//2003版本的xls
@Test
public void simpleWriteXls() {
// 注意 simpleWrite在数据量不大的情况下可以使用(5000以内,具体也要看实际情况),数据量大参照 重复多次写入
// 写法1 JDK8+
// since: 3.0.0-beta1
String fileName = "D:/banking-project/exceltest/simpleWrite" + System.currentTimeMillis() + ".xls";
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
// 如果这里想使用03 则 传入excelType参数即可
EasyExcel.write(fileName, ExcelStudentDTO.class)
.excelType(ExcelTypeEnum.XLS)
.sheet("模板")
.doWrite(data());
}
private List<ExcelStudentDTO> data() {
List<ExcelStudentDTO> list = new ArrayList<>();
for (int i = 0; i < 65536; i++) {
ExcelStudentDTO data = new ExcelStudentDTO();
data.setName("字符串" + i);
data.setBirthday(new Date());
data.setSalary(0.56);
list.add(data);
}
return list;
}
}
实体类
@Data
public class ExcelStudentDTO {
@ExcelProperty("姓名")
private String name;
@ExcelProperty("生日")
private Date birthday;
@ExcelProperty("薪资")
private Double salary;
}
4、读:导入demo
创建监听器
@Slf4j
public class ExcelStudentDTOListener extends AnalysisEventListener<ExcelStudentDTO>{
@Override
public void invoke(ExcelStudentDTO data, AnalysisContext context) {
log.info("解析到一条数据: {}",data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
log.info("所有数据解析完成!");
}
}
读
public class ExcelReadTest {
/**
* 最简单的读
* <p>
* 1. 创建excel对应的实体对象 参照{@link ExcelStudentDTO}
* <p>
* 2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link ExcelStudentDTOListener}
* <p>
* 3. 直接读即可
*/
@Test
public void simpleReadXlsx() {
// 写法1:JDK8+ ,不用额外写一个DemoDataListener
// since: 3.0.0-beta1
String fileName = "D:/banking-project/exceltest/simpleWrite.xlsx";
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
// 这里每次会读取3000条数据 然后返回过来 直接调用使用数据就行
EasyExcel.read(fileName, ExcelStudentDTO.class, new ExcelStudentDTOListener()).sheet().doRead();
}
@Test
public void simpleReadXls() {
// 写法1:JDK8+ ,不用额外写一个DemoDataListener
// since: 3.0.0-beta1
String fileName = "D:/banking-project/exceltest/simpleWrite.xls";
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
// 这里每次会读取3000条数据 然后返回过来 直接调用使用数据就行
EasyExcel.read(fileName, ExcelStudentDTO.class, new ExcelStudentDTOListener()).excelType(ExcelTypeEnum.XLS).sheet().doRead();
}
}
5、常见错误
解决方案:加载的时候不让xml文件被过滤掉
<build>
<!-- 项目打包时会将java目录中的*.xml文件也进行打包 -->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>