Java利用EasyExcel实现导出导入功能的示例代码

 更新时间:2022年11月24日 10:28:46   作者:自由了  
EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。本文废话不多说,直接上手试试,用代码试试EasyExcel是否真的那么好用

前言

最近的项目中模块需要用到Excel的导入,在同事的建议下选择了EasyExcel。看了一下EasyExcel的介绍,其是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。那废话不多说,直接上手试试,用代码试试EasyExcel是否真的那么好用。

一.主要实现步骤

1.@ExcelProperty注解

我们需要导入的类的字段需要用到注解@ExcelProperty("列名"),这里特别注意的是一定得跟对应的导入模板里的表头保持一致,不然导入的时候匹配不上。

//导出导入类使用注解
@ExcelProperty("表头对应的中文列名")
private String data;

2.导入模板

public void exportTemplate(HttpServletResponse response, HttpServletRequest request) throws UnsupportedEncodingException {
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    String fileName="数据模板";
    fileName = URLEncoder.encode(fileName, "UTF-8");
    fileName = new String(fileName.getBytes("utf-8"),"ISO-8859-1");
    String filePath = new ClassPathResource("docs/other/".concat(fileName).concat(dateFormat.format(new Date())).concat(".xlsx")).getPath();
    //导出模板表头
    List<String> headers = Arrays.asList("列名");
    List list = new ArrayList();
    PoiUtil.exportTemplateData(filePath,headers,list);
    //获取文件流返回给客户端
    DownloadFileUtil.downloadFile(response, request, filePath);
}
//构造模板基础数据,比如下拉列表及其校验规则
public static void exportTemplateData(String filePath, List<String> headers, List list) {
        //证件类型 下拉
        List<String> certificationTypeAttributeList = new ArrayList<String>();
        certificationTypeAttributeList.add("身份证");
        certificationTypeAttributeList.add("户口簿");
        certificationTypeAttributeList.add("护照");
        certificationTypeAttributeList.add("其他");
        // 2.创建Excel
        // 1)创建workbook
        HSSFWorkbook hssfWorkBook = new HSSFWorkbook();
        // 2)创建sheet
        HSSFSheet mainSheet = hssfWorkBook.createSheet(MAIN_SHEET);// 主sheet
        // 用于展示
        //2.1 创建表头,供用户输入
        initHeaders(hssfWorkBook, mainSheet, headers);
        //导出数据到主sheet
        setMainSheet(mainSheet, list);
        // attribute 下拉框 sheet
        HSSFSheet certificationTypeAttributeSheet= hssfWorkBook.createSheet(CERTIFICATIONTYPE_ATTRIBUTE_STATUS);
 hssfWorkBook.setSheetHidden(hssfWorkBook.getSheetIndex(certificationTypeAttributeSheet), true);// 设置sheet是否隐藏

        // 3.写入数据
    writeData(hssfWorkBook, mapSheet, mapOneList, map);
        //证件类型位
        writeDropDownData(hssfWorkBook, certificationTypeAttributeSheet, certificationTypeAttributeList, CERTIFICATIONTYPE_ATTRIBUTE_STATUS);

        // 4.设置数据有效性
        setDataValid(hssfWorkBook, mainSheet,"boundaryMarking");
        FileOutputStream os = null;
        try {
            String exisname = filePath.substring(0, filePath.lastIndexOf("/"));
            File f = new File(exisname);
            if (!f.exists()) {
                f.mkdirs();//创建目录
            }
            // 创建可写入的Excel工作簿
            File file = new File(filePath);
            if (!file.exists()) {
                boolean bool = file.createNewFile();
                System.out.println(bool);
            } else {
                file.delete();
                file.createNewFile();
            }
            os = new FileOutputStream(filePath);
            hssfWorkBook.write(os);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(os);
        }
    }

2.创建导入模板下载类

用于下载后填充数据进行导入操作

public static void downloadFile(HttpServletResponse response, HttpServletRequest request, String filePath) {
    try {
        //获取文件
        File file = new File(filePath);
        String fileName = file.getName();
        response.reset();
        ServletOutputStream out = response.getOutputStream();
        request.setCharacterEncoding("UTF-8");
        int BUFFER = 1024 * 10;
        byte data[] = new byte[BUFFER];
        BufferedInputStream bis = null;
        //获取文件输入流
        InputStream inputStream = new BufferedInputStream(new FileInputStream(filePath));
        // 以流的形式下载文件。
        DataInputStream fis = new DataInputStream(inputStream);
        int read;
        bis = new BufferedInputStream(fis, BUFFER);
        response.setContentType("application/OCTET-STREAM");
        response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
        while ((read = bis.read(data)) != -1) {
            out.write(data, 0, read);
        }
        fis.close();
        bis.close();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        File file = new File(filePath);
        //删除临时文件
        if (file.exists()) {
            file.delete();
        }
    }
}

3.创建导入监听器,监听器负责处理数据

比如数据的校验、转换、业务逻辑处理、数据入库操作。我感觉用监听器比较麻烦直接使用了另外一种做法,对监听器感兴趣的小伙伴可以去看看

//从前端接收传过来的文件
InputStream inputStream = file.getInputStream();
List<DataModel> list = EasyExcel.read(inputStream).head(DataModel.class).sheet().doReadSync();
//对解析到数据进行逻辑操作......

二.值得注意的地方

1.下拉列表及单选框

如果需要导入的列名需要用到大量的下拉列表,单选框,在创建导入模板里就需要提前将其需要填充的数据从数据库或者接口里获取到先进行下拉列表或者单选框的数据填充。而且填充的只能是中文,这就涉及到一个问题,在进行导入处理数据时还需要将中文的转换为其对应的编码入库,这时就比较麻烦了。

2.级联操作

遇到到省市区三级联或者四级联时,同样需要提前进行数据填充,还要维护好级联关系。另外就是虽然省市区的变化不会太大,但是出于数据的严谨性需要定期同步最新的省市区数据,废弃掉在此之前的数据模板(模板导出时文件名带当前日期,用日期进行判断),如果业务不需要这么严谨这点可以不用考虑。

三.总结

按业务场景用了一下,感觉挺不错,比之前一步步的操作方便多了,导出导入都很快,而且都是流操作,不会产生额外的临时文件。不过也由于Excel本身的一些限制,在一些业务场景下使用起来就很费劲,比如有大量下拉列表的这种业务场景就不太适用。对这块感兴趣的小伙伴可以一起交流交流。

到此这篇关于Java利用EasyExcel实现导出导入功能的示例代码的文章就介绍到这了,更多相关Java EasyExcel导出导入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java 中锁的性能提高办法

    java 中锁的性能提高办法

    这篇文章主要介绍了java 中锁的性能提高办法的相关资料,需要的朋友可以参考下
    2017-02-02
  • SpringSecurity安全框架在SpringBoot框架中的使用详解

    SpringSecurity安全框架在SpringBoot框架中的使用详解

    在Spring Boot框架中,Spring Security是一个非常重要的组件,它可以帮助我们实现应用程序的安全性,本文将详细介绍Spring Security在Spring Boot框架中的使用,包括如何配置Spring Security、如何实现身份验证和授权、如何防止攻击等
    2023-06-06
  • 一文搞懂Java JDBC中的SQL注入问题

    一文搞懂Java JDBC中的SQL注入问题

    在用户输入的数据中有SQL关键字或语法,并且关键字或语法参与了SQL语句的编译,导致SQL语句编译后的条件为true,一直得到正确的结果,这种现象就是SQL注入,这篇文章主要介绍了一文搞懂Java JDBC中的SQL注入问题,需要的朋友可以参考下
    2022-10-10
  • 实例详解Java中如何对方法进行调用

    实例详解Java中如何对方法进行调用

    这篇文章主要介绍了实例详解Java中如何对方法进行调用,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-10-10
  • Java并发编程volatile关键字的作用

    Java并发编程volatile关键字的作用

    这篇文章主要介绍了Java并发编程volatile关键字的作用,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Springboot如何连接远程服务器上的数据库实践

    Springboot如何连接远程服务器上的数据库实践

    本文主要介绍了Springboot如何连接远程服务器上的数据库实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Java高效数据传输通过绑定快速将数据导出至Excel

    Java高效数据传输通过绑定快速将数据导出至Excel

    这篇文章主要介绍了Java高效数据传输之通过绑定快速将数据导出至Excel方法实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • windows下java -jar 后台运行以及杀死后台进程的操作

    windows下java -jar 后台运行以及杀死后台进程的操作

    这篇文章主要介绍了windows下java -jar 后台运行以及杀死后台进程的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • SpringBoot过滤器实现项目内接口过滤详解

    SpringBoot过滤器实现项目内接口过滤详解

    这篇文章主要为大家详细介绍了SpringBoot如何利用过滤器实现项目内接口过滤,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-04-04
  • springmvc不进入Controller导致404的问题

    springmvc不进入Controller导致404的问题

    这篇文章主要介绍了springmvc不进入Controller导致404的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02

最新评论