引入官方依赖
<!--EasyExcel依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.0-beta2</version>
</dependency>
创建你的实体类,实体类主要用于和你生成表格的字段相对应,主要通过 @ExcelProperty指定在你的excel生成的表头是什么
@Data
public class DemoData {
//复杂头写入, @ExcelProperty({"标题头,所有的注解都需要加","字符串标题"})
@ExcelProperty("字符串标题")
private String string;
@ExcelProperty("日期标题")
private Date date;
@ExcelProperty("数字标题")
private Double doubleData;
/**
* 忽略这个字段
*/
@ExcelIgnore
private String ignore;
}
然后写上一个函数,用于模拟数据库读取的内容
public class demo {
/**
* 写入excel是以一个List集合,或者对象进行写入
* **/
public List<DemoData> demoDataList(){
List<DemoData> list = new ArrayList<DemoData>();
for (int i = 0; i < 10; i++) {
DemoData data = new DemoData();
data.setString("字符串" + i);
data.setDate(new Date());
data.setDoubleData(0.56);
list.add(data);
}
return list;
}
}
开始实现写入的操作。他的写入原理就是你传递一个List集合(类型是你要生成excel的对象的类型),并且指定你的生成路径就OK了
public class WriteExcel {
/**
* 写入excel
* **/
//获取电脑桌面的路径
FileSystemView view = FileSystemView.getFileSystemView();
File file = view.getHomeDirectory();
final String desktop=file.getPath()+"\\";
//传递的路径=生成文件的路径+你的文件名(后缀.xlsx根据需求改变)
final String fileName = desktop+"EasyExcel.xlsx";
@Test
public void simpleWrite(){
//路径加上名称
EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(new demo().demoDataList());
}
}
写入完成之后,怎么进行读取呢。首先原理是,定义一个类通过继承监听器AnalysisEventListener《你生成excel的实体类对象》并且实现他的接口方法。
invoke()方法主要作用:每当我们读取一行excel信息,他就会执行一次 invoke()方法,这个时候我们就可以在这方法中,进行数据持久化
doAfterAllAnalysed()方法作用:就是在excel全部读取完成之后在执行。
public class DemoDataListener extends AnalysisEventListener<DemoData> {
private static final int BATCH_COUNT = 5;
List<DemoData> list = new ArrayList<DemoData>();
/**
* 这个事情监听(每读取excel一条数据就会执行一次)。
* **/
@Override
public void invoke(DemoData demoData, AnalysisContext analysisContext) {
list.add(demoData);
// 对于数据量大的时候达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
/* if (list.size() >= BATCH_COUNT) {
}*/
// 调用持久层
System.err.println(demoData.toString());
// SaveDate(list);
list.clear();//清空每次读取的内容,释放内存
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
//注意,如果想要在全部读取完成之后在插入,上面的 list.clear();一定要注释
SaveDate(list);
System.err.println("Excel全都读取完成后执行这个函数");
}
public void SaveDate(List<DemoData> demoData){
List<DemoData> save = new ArrayList<>();
System.out.println("进行持久化,数组长度是:"+demoData.size());
}
}
监听器写完之后,开始进行读取操作,持久化数据在监听器中完成即可
/**
* 读取---需要写上监听器继承他封装的AnalysisEventListener<我们读取的类型>
* **/
@Test
public void ReadExcel(){
EasyExcel.read(fileName,DemoData.class,new DemoDataListener()).sheet().doRead();
}
这样一来就完成简单的读写操作了。
进阶操作
1:通过流上传
<input type="file" name="editormd-image-file" id="file2" onchange="updateHead(this)>"
//js
function updateHead(e) {
var form = new FormData();
form.append("editormd-image-file", document.getElementById("file2").files[0]);
$.ajax({
url: "/file/upload", //后台url
data: form,
cache: false,
async: false,
type: "POST", //类型,POST或者GET
dataType: 'json', //数据返回类型,可以是xml、json等
processData: false,
contentType: false,
success: function (data) {
console.log(data)
},
});
}
通过java获取InputStream 流对象,然后将流对象传入到上面方法中,但是参数改变了不在是路径,而是流的对象InputStream类型
MultipartHttpServletRequest multipartHttpServletRequest=(MultipartHttpServletRequest) request;
MultipartFile file = multipartHttpServletRequest.getFile("editormd-image-file");
InputStream inputStream = file.getInputStream();//获取文件名
重写刚刚读取的方法
public void ReadExcel2(InputStream fileName){
System.err.println("fileName:"+fileName);
EasyExcel.read(fileName,DemoData.class,new DemoDataListener()).sheet().doRead();
}