`
zysnba
  • 浏览: 179844 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

easyexcel读取excel与下载

 
阅读更多
  第一步导入相对应的jar
    compile 'com.alibaba:fastjson:1.2.59'
    implementation 'com.alibaba:easyexcel:1.1.2-beat1'
    implementation 'org.projectlombok:lombok:1.18.2'

  第二步建立对象

package com.example.springboot_excel.util;

import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.metadata.Sheet;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
* @description:
* @author: chenmingjian
* @date: 19-3-18 16:16
*/
@Slf4j
public class ExcelUtil {

    private static Sheet initSheet;

    static {
        initSheet = new Sheet(1, 0);
        initSheet.setSheetName("sheet");
        //设置自适应宽度
        initSheet.setAutoWidth(Boolean.TRUE);
    }

    /**
     * 读取少于1000行数据
     * @param filePath 文件绝对路径
     * @return
     */
    public static List<Object> readLessThan1000Row(String filePath){
        return readLessThan1000RowBySheet(filePath,null);
    }

    /**
     * 读小于1000行数据, 带样式
     * filePath 文件绝对路径
     * initSheet :
     *      sheetNo: sheet页码,默认为1
     *      headLineMun: 从第几行开始读取数据,默认为0, 表示从第一行开始读取
     *      clazz: 返回数据List<Object> 中Object的类名
     */
    public static List<Object> readLessThan1000RowBySheet(String filePath, Sheet sheet){
        if(!StringUtils.hasText(filePath)){
            return null;
        }

        sheet = sheet != null ? sheet : initSheet;

        InputStream fileStream = null;
        try {
            fileStream = new FileInputStream(filePath);
            return EasyExcelFactory.read(fileStream, sheet);
        } catch (FileNotFoundException e) {
            log.info("找不到文件或文件路径错误, 文件:{}", filePath);
        }finally {
            try {
                if(fileStream != null){
                    fileStream.close();
                }
            } catch (IOException e) {
                log.info("excel文件读取失败, 失败原因:{}", e);
            }
        }
        return null;
    }

    /**
     * 读大于1000行数据
     * @param filePath 文件觉得路径
     * @return
     */
    public static List<Object> readMoreThan1000Row(String filePath){
        return readMoreThan1000RowBySheet(filePath,null);
    }

    /**
     * 读大于1000行数据, 带样式
     * @param filePath 文件觉得路径
     * @return
     */
    public static List<Object> readMoreThan1000RowBySheet(String filePath, Sheet sheet){
        if(!StringUtils.hasText(filePath)){
            return null;
        }

        sheet = sheet != null ? sheet : initSheet;

        InputStream fileStream = null;
        try {
            fileStream = new FileInputStream(filePath);
            ExcelListener excelListener = new ExcelListener();
            EasyExcelFactory.readBySax(fileStream, sheet, excelListener);
            return excelListener.getDatas();
        } catch (FileNotFoundException e) {
            log.error("找不到文件或文件路径错误, 文件:{}", filePath);
        }finally {
            try {
                if(fileStream != null){
                    fileStream.close();
                }
            } catch (IOException e) {
                log.error("excel文件读取失败, 失败原因:{}", e);
            }
        }
        return null;
    }

    /**
     * 生成excle
     * @param filePath  绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx
     * @param data 数据源
     * @param head 表头
     */
    public static void writeBySimple(String filePath, List<List<Object>> data, List<String> head){
        writeSimpleBySheet(filePath,data,head,null);
    }

    /**
     * 生成excle
     * @param filePath 绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx
     * @param data 数据源
     * @param sheet excle页面样式
     * @param head 表头
     */
    public static void writeSimpleBySheet(String filePath, List<List<Object>> data, List<String> head, Sheet sheet){
        sheet = (sheet != null) ? sheet : initSheet;

        if(head != null){
            List<List<String>> list = new ArrayList<>();
            head.forEach(h -> list.add(Collections.singletonList(h)));
            sheet.setHead(list);
        }

        OutputStream outputStream = null;
        ExcelWriter writer = null;
        try {
            outputStream = new FileOutputStream(filePath);
            writer = EasyExcelFactory.getWriter(outputStream);
            writer.write1(data,sheet);
        } catch (FileNotFoundException e) {
            log.error("找不到文件或文件路径错误, 文件:{}", filePath);
        }finally {
            try {
                if(writer != null){
                    writer.finish();
                }

                if(outputStream != null){
                    outputStream.close();
                }

            } catch (IOException e) {
                log.error("excel文件导出失败, 失败原因:{}", e);
            }
        }

    }

    /**
     * 生成excle
     * @param filePath 绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx
     * @param data 数据源
     */
    public static void writeWithTemplate(String filePath, List<? extends BaseRowModel> data){
        writeWithTemplateAndSheet(filePath,data,null);
    }

    /**
     * 生成excle
     * @param filePath 绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx
     * @param data 数据源
     * @param sheet excle页面样式
     */
    public static void writeWithTemplateAndSheet(String filePath, List<? extends BaseRowModel> data, Sheet sheet){
        if(CollectionUtils.isEmpty(data)){
            return;
        }

        sheet = (sheet != null) ? sheet : initSheet;
        sheet.setClazz(data.get(0).getClass());

        OutputStream outputStream = null;
        ExcelWriter writer = null;
        try {
            outputStream = new FileOutputStream(filePath);
            writer = EasyExcelFactory.getWriter(outputStream);
            writer.write(data,sheet);
        } catch (FileNotFoundException e) {
            log.error("找不到文件或文件路径错误, 文件:{}", filePath);
        }finally {
            try {
                if(writer != null){
                    writer.finish();
                }

                if(outputStream != null){
                    outputStream.close();
                }
            } catch (IOException e) {
                log.error("excel文件导出失败, 失败原因:{}", e);
            }
        }

    }

    /**
     * 生成多Sheet的excle
     * @param filePath 绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx
     * @param multipleSheelPropetys
     */
    public static void writeWithMultipleSheel(String filePath,List<MultipleSheelPropety> multipleSheelPropetys){
        if(CollectionUtils.isEmpty(multipleSheelPropetys)){
            return;
        }

        OutputStream outputStream = null;
        ExcelWriter writer = null;
        try {
            outputStream = new FileOutputStream(filePath);
            writer = EasyExcelFactory.getWriter(outputStream);
            for (MultipleSheelPropety multipleSheelPropety : multipleSheelPropetys) {
                Sheet sheet = multipleSheelPropety.getSheet() != null ? multipleSheelPropety.getSheet() : initSheet;
                if(!CollectionUtils.isEmpty(multipleSheelPropety.getData())){
                    sheet.setClazz(multipleSheelPropety.getData().get(0).getClass());
                }
                writer.write(multipleSheelPropety.getData(), sheet);
            }

        } catch (FileNotFoundException e) {
            log.error("找不到文件或文件路径错误, 文件:{}", filePath);
        }finally {
            try {
                if(writer != null){
                    writer.finish();
                }

                if(outputStream != null){
                    outputStream.close();
                }
            } catch (IOException e) {
                log.error("excel文件导出失败, 失败原因:{}", e);
            }
        }

    }


    /*********************匿名内部类开始,可以提取出去******************************/

    @Data
    public static class MultipleSheelPropety{

        private List<? extends BaseRowModel> data;

        private Sheet sheet;
    }

    /**
     * 解析监听器,
     * 每解析一行会回调invoke()方法。
     * 整个excel解析结束会执行doAfterAllAnalysed()方法
     *
     * @author: chenmingjian
     * @date: 19-4-3 14:11
     */
    @Getter
    @Setter
    public static class ExcelListener extends AnalysisEventListener {

        private List<Object> datas = new ArrayList<>();

        /**
         * 逐行解析
         * object : 当前行的数据
         */
        @Override
        public void invoke(Object object, AnalysisContext context) {
            //当前行
            // context.getCurrentRowNum()
            if (object != null) {
                datas.add(object);
            }
        }


        /**
         * 解析完所有数据后会调用该方法
         */
        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {
            //解析结束销毁不用的资源
        }

    }

    /************************匿名内部类结束,可以提取出去***************************/

}


package com.example.springboot_excel.entity;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.BaseRowModel;

public class User extends BaseRowModel {
    @ExcelProperty(value = "id", index = 0)
    private Integer id;

    @ExcelProperty(value = "name", index = 1)
    private String name;
    @ExcelProperty(value = "address", index = 2)
    private String address;
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

第三步方法即可
@ApiOperation(value = "读取excel----file")
    @PostMapping("/importExcel")
    public String importExcel(@RequestParam("file") MultipartFile file) throws IOException {
        InputStream inputStream = file.getInputStream();

        //实例化实现了AnalysisEventListener接口的类
        ExcelUtil.ExcelListener listener = new ExcelUtil.ExcelListener();
        //传入参数
        ExcelReader excelReader = new ExcelReader(inputStream,  null, listener);
        //读取信息
        excelReader.read(new Sheet(1, 1, User.class));
        //获取数据
        List<Object> list = listener.getDatas();

        List<User> catagoryList = new ArrayList<User>();
        User catagory = new User();

        //转换数据类型,并插入到数据库
        for (int i = 0; i < list.size(); i++) {
            catagory = (User) list.get(i);
            System.out.println(catagory.getId()+"----"+catagory.getName()+"----"+catagory.getAddress());
        }
        return "ok";
    }

下载
@GetMapping("/download")
    @ApiOperation(value = "下载excel")
    public void download(HttpServletResponse response) {
        OutputStream out = null;
        ExcelWriter writer = null;
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");
            String date = sdf.format(new Date());
            //通过查询组装数据
            List<User> userlist = new ArrayList<>();
            User user = new User();
            user.setId(1);
            user.setName("张三");
            User user1 = new User();
            user1.setId(2);
            user1.setName("李四");
            userlist.add(user);
            userlist.add(user1);
            //拼接导出的文件名
            String fileName = date + new String(("告警数据").getBytes("UTF-8"), "ISO-8859-1") + ".xlsx";
            response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
            //下载到浏览器默认地址
            out = response.getOutputStream();
            writer = new ExcelWriter(out, ExcelTypeEnum.XLSX);
            Sheet sheet1 = new Sheet(1, 0, User.class);
            sheet1.setSheetName("sheet1");
            writer.write(userlist, sheet1);
            userlist.clear();
        } catch (Exception e) {
//            log.error("告警信息下载失败"+e.getMessage(),e);
        } finally {
            try {
                out.flush();
                writer.finish();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
分享到:
评论

相关推荐

    集成easyexcel实现excel表格增强.zip

    在读取Excel时,我们需要定义一个实体类,该类的属性对应Excel中的列,并且需要使用注解来指定字段的位置。同时,需要编写一个监听器,继承自EasyExcel的抽象类,重写`invoke`方法来处理每一行的数据。 写入Excel时...

    读取Excel文件单元格行号与列号

    在实际的应用中,我们经常要读取Excel的字段,比如一个医保中心程序生成的结算单是Excel格式的,我们需要读取Excel里面的内容,找到结算信息。最笨的办法就是一行一列的数,可是结算表含有很多的单元格合并的时候,...

    读取Excel文件将数据存入map集合

    ### 读取Excel文件将数据存入Map集合 在日常工作中,经常需要处理Excel文件,尤其是在数据统计、分析等场景中。本篇文章介绍了一个方法,该方法能够读取Excel文件并将其中的数据存储到Java中的`Map`集合里,便于...

    EasyExcel导入excel和导出excel的demo

    - 配置Bean:创建一个`EasyExcelListener`监听器,用于处理读取Excel时的事件,如数据验证、错误处理等。 - 使用`@RestController`注解的Controller层方法,提供HTTP接口进行Excel的上传和下载。 3. **导入Excel*...

    Excel操作,读取及汇出,复杂表头,可以设置表头样式

    Excel操作,读取及汇出,复杂表头,可以设置表头样式

    读取Excel格式CSV格式文件

    本文将深入探讨如何在Java环境中读取Excel格式(.xls或.xlsx)以及CSV(逗号分隔值)格式的文件,同时也会提及所给的压缩包文件中的相关资源。 首先,Excel文件是一种由Microsoft Office提供的电子表格格式,用于...

    使用EasyExcel进行Excel文档导入导出详细教程:EasyExceleasyexcel.rar

    EasyExcel支持读取和写入Excel文件,无需内存转换成List,这大大减少了内存消耗,特别是在处理大量数据时。此外,它还提供了简单的API,使得Excel操作变得简单易懂。 要将EasyExcel整合到SpringBoot项目中,首先...

    读取大数据量的excel文件

    本案例采用的poi读取大数据的excel文件 usermodel模式对excel操作前需要将文件全部转入内存,对较大文件来说内存开销很大。但是其使用简单。 eventusermodel模式采用事件模型,对文件边读取边处理,内存消耗较低,...

    EasyExcel 并发读取文件字段并进行校验,数据写入到新文件,批量插入数据到数据库

    EasyExcel提供了一种多线程并发读取Excel数据的方式,通过`readSheetHandler`和`executeParallel`方法,可以将读取任务分配到多个线程中执行。每个线程独立处理一部分行数据,这样可以显著提升数据处理速度。 3. *...

    easyexcel+validation excel导入导出下载

    3. **读取Excel**:调用EasyExcel.read()方法,传入文件路径和自定义的监听器,即可开始读取Excel数据。监听器中的方法会在读取到每一行数据时被调用。 4. **写入Excel**:使用EasyExcel.write()方法,传入输出流和...

    百万级数据读写Excle(源码)

    在IT行业中,处理大量数据是常见的任务,而Excel由于其易用性和强大的表格管理功能,经常被用作数据存储和分析的工具。然而,当数据量达到百万级别时,使用默认的Excel操作方法可能会遇到性能瓶颈,导致读写速度极慢...

    通过EasyExcel+线程池实现百万级数据从Excel导入到数据库

    通过自定义的DataReadListener,我们就可以在读取Excel的时候做处理。 每读取到一行数据会先做数据校验,如果校验通过后就会放到缓存集合中,List数量积累到1000时就会通过Mybatis的批量操作进行数据插入。...

    读取excel文件内容,返回数组

    结合PHPExcel插件写的读取excel文件内容,并返回二维数组。可以控制读取excel哪张工作表,读取几列的内容。

    poi导入/导出Excel表格,合并单元格的读取和设置

    poi导入/导出Excel表格,合并单元格的读取和设置

    java使用EasyExcel导入导出excel(csdn)————程序.pdf

    3. 使用EasyExcel的`read()`方法读取Excel数据,传入文件路径和处理器实例。 4. 使用EasyExcel的`write()`方法写入Excel数据,传入OutputStream和实体类的Class对象。 四、性能优化 EasyExcel采用了流式处理,避免...

    EasyExcel使用的相关的jar包

    2. **读取Excel**:调用`EasyExcel.read()`方法,传入Excel文件路径和监听器实例。例如: ```java EasyExcel.read("path_to_your_excel_file", YourDataModel.class, new YourListener()).sheet().doRead(); ``` ...

    EasyExcel JAVA解析Excel工具 v3.3.3.zip

    例如,在读取Excel数据时,我们可以通过实现`AnalysisEventListener`接口来自定义数据处理逻辑,然后使用`EasyExcel.read()`方法启动读取过程。在写入数据时,定义好对应的实体类,使用`EasyExcel.write()`方法即可...

    easyexcel相关jar包.zip

    1. **数据读取**:EasyExcel支持流式读取Excel,这意味着它可以在不加载整个文件到内存的情况下处理大型Excel文件,大大降低了内存消耗。通过`ExcelReaderBuilder`,你可以创建一个读取器,并设置监听器来处理读取到...

    java读写excel、csv文件

    文件中包括读取excel、csv文件,同时可以将读取出的文件内容保存在另外一个excel或csv中。注意excel2003和excel2007调用的jar包也不一样,需要将代码进行修改。2007版的将HSSF改成XSSF,2003相反。csv文件用XSSF

    easyexcel读写excel所需包poi.rar

    4. 文件读取:使用`EasyExcel.read()`方法读取Excel文件,传入文件路径和读取的处理器,然后在监听器中处理数据。 5. 文件写入:使用`EasyExcel.write()`方法写入Excel文件,传入文件输出流和写入的处理器,同样在...

Global site tag (gtag.js) - Google Analytics