专栏首页23号杂货铺Springboot中Excel的下载操作(二)

Springboot中Excel的下载操作(二)

培养一门兴趣,是踏往成功之路的基石。 —— 23号老板

原创:凌空夜望,CSDN

最近在做SpringBoot项目,项目中需要上传Excel文件,对Excel文件中的内容进行解析,然后将需要的数据存入数据库,同时还要根据用户的需求,将需要的内容生成Excel文件,并下载下来。本篇主要是介绍Excel文件的生成以及下载,使用的开发工具是IDEA 。关于Excel文件的生成请移步SpringBoot项目中关于Excel的解析(一)

内容概要:

  • 项目maven依赖
  • Controller层代码
  • 工具类HandleFile代码
  • 静态页面和测试文件
  • 下载的Excel文件

一、项目maven依赖

需要注意的是:这里选择的poi-ooxml和poi的依赖版本最好一致,否则可能会有两个依赖会出现不匹配的问题。本人曾遇到过poi-ooxml的版本是3.9,poi的版本是3.13,最终在测试阶段报错:

java.lang.IllegalAccessError: tried to access method org.apache.poi.util.POILogger.log(ILjava/lang/Object;)V from class org.apache.poi.openxml4j.opc.PackageRelationshipCollection

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.9</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.9</version>
    </dependency>

二、Controller层

@RestController
@RequestMapping("/handleFile/")
@Slf4j
public class HandleFileController{

    /**
     * excel生成下载
     * @param response
     * @return
     * @throws Exception
     */
   @GetMapping(value = "/createExcel")
    public String createExcel(HttpServletResponse response) throws Exception{
            Map<String,Object> excelMap = new HashMap<>();
        //1.设置Excel表头
        List<String> headerList = new ArrayList<>();
        headerList.add("用户id");
        headerList.add("用户名");
        headerList.add("性别");
        headerList.add("身份证号");
        headerList.add("注册时间");
        excelMap.put("header",headerList);
        //2.是否需要生成序号,序号从1开始(true-生成序号 false-不生成序)
        boolean isSerial = false;
        excelMap.put("isSerial",isSerial);
        //3.sheet名
        String sheetName = "统计表";
        excelMap.put("sheetName",sheetName);
        //4.需要放入Excel中的数据
        Map<String,Object> map = new HashMap<>();
        map.put("gender","男");
        List<User> rows = userMapper.selectUserInfo(map);
        List<List<String>> data= new ArrayList<>();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for (User user:rows){
            //所有的数据顺序必须和表头一一对应
            //list存放每一行的数据(让所有的数据类型都转换成String,这样就无需担心Excel表格中数据不对)
            List<String> list = new ArrayList<>();
            list.add(String.valueOf(user.getId()));
            list.add(String.valueOf(user.getUsername()));
            list.add(String.valueOf(user.getGender()));
            list.add(String.valueOf(user.getNationalId()));
            list.add(String.valueOf(format.format(user.getCreateTime())));
            //data存放全部的数据
            data.add(list);
        }
            excelMap.put("data",data);
        //Excel文件内容设置
        HSSFWorkbook workbook = HandleFile.createExcel(excelMap);
        String fileName = "导出excel例子.xls";
        //生成excel文件
        HandleFile.buildExcelFile(fileName, workbook);
        //浏览器下载excel
        HandleFile.buildExcelDocument(fileName,workbook,response);
        return "down excel";
    }
}

上述代码中:List<User> rows = userMapper.selectUserInfo(map);

数据内容是直接从数据库中查取的,具体实现较简单这里就不做代码详细展示。只展示下图数据库具体查询的内容。

三、HandleFile工具类

/**
 * 解析Excel文件
 *
 * @param in
 * @param fileName
 */
public static List<List<Object>> parseExcel(InputStream in, String fileName) throws Exception {
            List list = null;
        Workbook work = null;
        list = new ArrayList<>();
        //创建Excel工作薄
        work = getWorkbook(in, fileName);
        if (null == work) {
                throw new Exception("创建Excel工作薄为空!");
        }
            Sheet sheet = null;
        Row row = null;
        Cell cell = null;
        for (int i = 0; i < work.getNumberOfSheets(); i++) {
                sheet = work.getSheetAt(i);
        if (sheet == null) {
                continue;
        }

            for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) {
                row = sheet.getRow(j);
            if (row == null || row.getFirstCellNum() == j) {
                continue;
        }

            List<Object> li = new ArrayList<>();
        for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {
                cell = row.getCell(y);
            li.add(cell);
        }
            list.add(li);
        }
        }
        return list;
}

四、测试结果

直接在浏览器中访问路径地址:

下载的Excel文件:

本文分享自微信公众号 - 23号杂货铺(sharontang0323),作者:bboyHan

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Springboot中Excel的解析操作(一)

    最近在做SpringBoot项目,项目中需要上传Excel文件,对Excel文件中的内容进行解析,然后将需要的数据存入数据库,同时还要根据用户的需求,将需要的内...

    23号杂货铺
  • Java之自定义排序工具类

    在项目开发中,经常会遇到需要对一个复杂对象的集合进行规则排序,可能需要根据某一字段排序,也可能需要根据某些字段排序,导致冗余的代码看起来既复杂又繁琐。因此,我们...

    23号杂货铺
  • 『 懒人10分钟—Linux学习篇(三)』文件/目录的权限

    想必经常和服务器打交道的朋友,对于Linux可谓又爱又恨。对于项目组、运维人员、或者有多人需要对服务器进行操作的人,离不开Linux关于权限的管理。Linux的...

    23号杂货铺
  • 我说精通字符串,面试官竟然问我 Java 中的 String 有没有长度限制?

    String 是 Java 中很重要的一个数据类型,除了基本数据类型以外,String 是被使用的最广泛的了,但是,关于 String,其实还是有很多东西容易被...

    淡定的蜗牛
  • RabbitMQ基础教程之基本使用篇

    一灰灰blog
  • Map排序

    Map排序的方式有很多种,这里记录下自己总结的两种比较常用的方式:按键排序(sort by key), 按值排序(sort by value)。 按键排序(...

    xiangzhihong
  • Android版-微信APP支付

    服务端源码地址:http://git.oschina.net/javen205/weixin_guide 客户端源码地址:https://github.com...

    Javen
  • java练习本(2019-07-06)

    String类型会指向堆内存中的存储空间,因此当通过==对String类型进行比较时,比较的是相应变量的地址。只要指向的是同一地址则两个String类型==比较...

    微笑的小小刀
  • 我说我精通字符串,面试官竟然问我Java中的String有没有长度限制!?

    String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西容易被忽略的。

    Java技术江湖
  • 线程安全的Map的小Demo

    Dream城堡

扫码关注云+社区

领取腾讯云代金券