EasyExcel使用

    技术2023-07-19  95

    引入官方依赖

    <!--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(); }
    Processed: 0.009, SQL: 9